diff --git a/react-advanced-tag1/src/components/exercises/RefExercise/index.tsx b/react-advanced-tag1/src/components/exercises/RefExercise/index.tsx index 4e4b915..2431a7e 100644 --- a/react-advanced-tag1/src/components/exercises/RefExercise/index.tsx +++ b/react-advanced-tag1/src/components/exercises/RefExercise/index.tsx @@ -1,16 +1,30 @@ import { FormEvent, useRef, useState } from "react"; +import useLocalStorage from "../../../hooks/useLocalStorage"; + +interface FormValues { + email: string; + password: string; +} export default function RefExercise(): React.ReactElement { console.log("RefExercise rendered"); const emailRef = useRef(null); const passwordRef = useRef(null); + const {setStoredValue, value: formDataValues} = useLocalStorage("formdata", { + email: "", + password: "" + } ); const handleSubmit = () => { console.log("submit", { email: emailRef.current?.value, password: passwordRef.current?.value }); + setStoredValue({ + email: emailRef.current?.value || "", + password: passwordRef.current?.value || "" + }); passwordRef.current?.focus(); } @@ -47,8 +61,8 @@ export default function RefExercise(): React.ReactElement {

values by ref

- - + +
diff --git a/react-advanced-tag1/src/hooks/useLocalStorage.ts b/react-advanced-tag1/src/hooks/useLocalStorage.ts new file mode 100644 index 0000000..7d0192b --- /dev/null +++ b/react-advanced-tag1/src/hooks/useLocalStorage.ts @@ -0,0 +1,39 @@ +import { useState } from "react"; + +export default function useLocalStorage(key: string, initialValue: T | null) { + const [value, setValue] = useState(() => { + try { + if (typeof window === "undefined") { + return initialValue; + } + const storedValue = localStorage.getItem(key); + return storedValue ? JSON.parse(storedValue) : initialValue; + } catch (error) { + console.error("Error reading from localStorage", error); + return initialValue; + } + }); + const setStoredValue = (newValue: T) => { + try { + const valueToStore = newValue instanceof Function ? newValue(value) : newValue; + setValue(valueToStore); + if (typeof window !== "undefined") { + localStorage.setItem(key, JSON.stringify(valueToStore)); + } + } catch (error) { + console.error("Error writing to localStorage", error); + } + } + + const removeStoredValue = () => { + try { + if (typeof window !== "undefined") { + localStorage.removeItem(key); + } + setValue(null); + } catch (error) { + console.error("Error removing from localStorage", error); + } + } + return {value, setStoredValue, removeStoredValue}; +} \ No newline at end of file