From 962bf69d31e036a269e850c74f44ac7e9b9e4112 Mon Sep 17 00:00:00 2001 From: Nick Foden Date: Wed, 11 Aug 2021 22:35:40 -0400 Subject: [PATCH] add use window size and contact page --- pages/contact.tsx | 96 +++++++++++++++++++++++++++++++++++++ src/hooks/useWindowSize.tsx | 43 +++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 pages/contact.tsx create mode 100644 src/hooks/useWindowSize.tsx diff --git a/pages/contact.tsx b/pages/contact.tsx new file mode 100644 index 0000000..fa29f98 --- /dev/null +++ b/pages/contact.tsx @@ -0,0 +1,96 @@ +import React, { useEffect, useRef, useState } from "react"; + +const ContactPage = () => { + const [state, setState] = useState({ + myName: "", + otherState: false, + }); + + const aComplexValue = () => { + return Math.random(); + }; + + const [expensive] = useState(aComplexValue()); + + const myRef = useRef(null); + console.log(expensive); + + function emailIsValid (email:string) { + return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) + } + + const handleChange = (e ) => { + console.dir(e) + const { name, value } = e.target; + + if(e){ + + } + setState((s) => ({ ...s, [name]: value })); + }; + + const handleSubmit = async () => { + const payload = encodeURI("cool stuff yes many spaces ") + + await fetch(`/api/hello?animal=${payload}`) + + }; + // prevState + // setState((s) => ({ ...s, "myName": value })); + + // setState({"myName": value }); + // }; + + const validateField = () => { + // if (state.myName.length < 5 || !state.myName.includes("@")) { + // alert("Invalid email"); + // } + }; + + // useEffect(() => { + // if (state.myName.length > 5) { + // alert("Over 5"); + // } + // }, [state]); + + // useEffect(() => { + // //@ts-expect-error + // if ( myRef?.current?.value?.length > 4) { + // alert("Over 4 ref"); + // } + // }, [myRef]); + + return ( +
+ + {/* */} + +
+ ); +}; + +export default ContactPage; diff --git a/src/hooks/useWindowSize.tsx b/src/hooks/useWindowSize.tsx new file mode 100644 index 0000000..d979ab4 --- /dev/null +++ b/src/hooks/useWindowSize.tsx @@ -0,0 +1,43 @@ +import { useState, useEffect } from "react"; +// Usage +// function App() { +// const size = useWindowSize(); +// return ( +//
+// {size.width}px / {size.height}px +//
+// ); +// } + + +// Hook +function useWindowSize() { + // Initialize state with undefined width/height so server and client renders match + // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/ + const [windowSize, setWindowSize] = useState< { + width: undefined | number, + height: undefined| number, + }>({ + width: undefined, + height: undefined, + }); + useEffect(() => { + // Handler to call on window resize + function handleResize() { + // Set window width/height to state + setWindowSize({ + width: window.innerWidth, + height: window.innerHeight, + }); + } + // Add event listener + typeof window !== undefined && window.addEventListener("resize", handleResize); + // Call handler right away so state gets updated with initial window size + handleResize(); + // Remove event listener on cleanup + return () => window.removeEventListener("resize", handleResize); + }, []); // Empty array ensures that effect is only run on mount + return windowSize; +} + +export default useWindowSize \ No newline at end of file