import { Modal } from "../Modal"; import { fetchUserInfo, patchUserInfo, UpdateUserInfo } from "../../api"; import { useMutation, useQuery, useQueryClient } from "react-query"; import { useRef, useState } from "preact/hooks"; import { ICON_FLASH_TIME } from "../../consts"; import { useFlash } from "../App/FlashContext"; export const UserPreferences = () => { const [modalOpen, setModalOpen] = useState(false); return ( <> { setModalOpen(true); }} > {" "} Preferences {modalOpen && } > ); }; const PreferencesModal = ({ setModalOpen }) => { const flash = useFlash(); const queryClient = useQueryClient(); const { isLoading, isSuccess, isError, data } = useQuery({ ...fetchUserInfo() }); const userInfoMutation = useMutation({ ...patchUserInfo(), onError: (error) => { flash({ message: `An error occurred: ${error}`, type: "error", }); }, onSuccess: () => { if (iconFlashTimeout.current !== null) { clearTimeout(iconFlashTimeout.current); } setRecentlySaved(true); iconFlashTimeout.current = setTimeout(() => { setRecentlySaved(false); }, ICON_FLASH_TIME); queryClient.invalidateQueries(["USER_INFO"]).then(() => setUpdatedSettings({})); }, }); const resetInputsRef = useRef(null as HTMLInputElement | null); const [recentlySaved, setRecentlySaved] = useState(false); const iconFlashTimeout = useRef(0); const [updatedSettings, setUpdatedSettings] = useState({} as UpdateUserInfo); if (isError) { return ( An error occurred loading user preferences ); } return ( {isLoading && } {isSuccess && ( setUpdatedSettings((s) => ({ ...s, reset_inputs_on_create: resetInputsRef.current.checked, })) } /> )} Reset reminder inputs when creating a reminder { userInfoMutation.mutate({ ...updatedSettings }); }} disabled={userInfoMutation.isLoading} > Save {userInfoMutation.isLoading ? ( ) : recentlySaved ? ( ) : ( )} ); };