import { FormEvent, useEffect } from 'react'; import { useLocation, useSearchParams } from 'react-router-dom'; import { Button, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerFooter, DrawerHeader, DrawerOverlay, useDisclosure, } from '@chakra-ui/react'; import { useLocalStorage } from '../../../common/hooks/useLocalStorage'; import ParamInput from './ParamInput'; import { ParamField } from './types'; import style from './ViewParamsEditor.module.scss'; type ViewParamsObj = { [key: string]: string | FormDataEntryValue }; type SavedViewParams = Record; const getURLSearchParamsFromObj = (paramsObj: ViewParamsObj) => Object.entries(paramsObj).reduce((newSearchParams, [id, value]) => { if (typeof value === 'string' && value.length) { newSearchParams.set(id, value); return newSearchParams; } return newSearchParams; }, new URLSearchParams()); interface EditFormDrawerProps { paramFields: ParamField[]; } export default function ViewParamsEditor({ paramFields }: EditFormDrawerProps) { const [searchParams, setSearchParams] = useSearchParams(); const { isOpen, onClose, onOpen } = useDisclosure(); const { pathname } = useLocation(); const [storedViewParams, setStoredViewParams] = useLocalStorage('ontime-views', {}); useEffect(() => { const isEditing = searchParams.get('edit'); if (isEditing === 'true') { return onOpen(); } }, [searchParams, onOpen]); useEffect(() => { const viewParamsObjFromLocalStorage = storedViewParams[pathname]; if (viewParamsObjFromLocalStorage !== undefined) { const defaultSearchParams = getURLSearchParamsFromObj(viewParamsObjFromLocalStorage); setSearchParams(defaultSearchParams); } // linter is asking for `setSearchParams` in the useEffect deps // rule is disabled since adding `setSearchParams` results in unnecessary re-renders // eslint-disable-next-line react-hooks/exhaustive-deps }, [storedViewParams, pathname]); const onEditDrawerClose = () => { onClose(); searchParams.delete('edit'); setSearchParams(searchParams); }; const clearParams = () => { setStoredViewParams({ ...storedViewParams, [pathname]: {} }); setSearchParams(); onClose(); }; const onParamsFormSubmit = (formEvent: FormEvent) => { formEvent.preventDefault(); const newParamsObject = Object.fromEntries(new FormData(formEvent.currentTarget)); const newSearchParams = getURLSearchParamsFromObj(newParamsObject); setStoredViewParams({ ...storedViewParams, [pathname]: newParamsObject }); setSearchParams(newSearchParams); }; return ( Customise
{paramFields.map((field) => (
))}
); }