Skip to content

Commit 962bf69

Browse files
committed
add use window size and contact page
1 parent 6ec33de commit 962bf69

File tree

2 files changed

+139
-0
lines changed

2 files changed

+139
-0
lines changed

pages/contact.tsx

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import React, { useEffect, useRef, useState } from "react";
2+
3+
const ContactPage = () => {
4+
const [state, setState] = useState({
5+
myName: "",
6+
otherState: false,
7+
});
8+
9+
const aComplexValue = () => {
10+
return Math.random();
11+
};
12+
13+
const [expensive] = useState(aComplexValue());
14+
15+
const myRef = useRef(null);
16+
console.log(expensive);
17+
18+
function emailIsValid (email:string) {
19+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)
20+
}
21+
22+
const handleChange = (e ) => {
23+
console.dir(e)
24+
const { name, value } = e.target;
25+
26+
if(e){
27+
28+
}
29+
setState((s) => ({ ...s, [name]: value }));
30+
};
31+
32+
const handleSubmit = async () => {
33+
const payload = encodeURI("cool stuff yes many spaces ")
34+
35+
await fetch(`/api/hello?animal=${payload}`)
36+
37+
};
38+
// prevState
39+
// setState((s) => ({ ...s, "myName": value }));
40+
41+
// setState({"myName": value });
42+
// };
43+
44+
const validateField = () => {
45+
// if (state.myName.length < 5 || !state.myName.includes("@")) {
46+
// alert("Invalid email");
47+
// }
48+
};
49+
50+
// useEffect(() => {
51+
// if (state.myName.length > 5) {
52+
// alert("Over 5");
53+
// }
54+
// }, [state]);
55+
56+
// useEffect(() => {
57+
// //@ts-expect-error
58+
// if ( myRef?.current?.value?.length > 4) {
59+
// alert("Over 4 ref");
60+
// }
61+
// }, [myRef]);
62+
63+
return (
64+
<div>
65+
<label>
66+
Email:
67+
<input
68+
aria-label="email for sign up"
69+
name="myName"
70+
// type="text"
71+
onChange={handleChange}
72+
onBlur={validateField}
73+
placeholder="mike"
74+
// value={state.myName}
75+
/>
76+
</label>
77+
{/* <input name="name2" type="text"
78+
onChange={handleChange}
79+
style={{...styles, fontSize:"50px"}}
80+
placeholder="mike"
81+
// value={state.myName}
82+
/> */}
83+
<button
84+
onClick={() => {
85+
handleSubmit()
86+
console.dir(myRef.current);
87+
console.dir(myRef);
88+
}}
89+
>
90+
Submit
91+
</button>
92+
</div>
93+
);
94+
};
95+
96+
export default ContactPage;

src/hooks/useWindowSize.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useState, useEffect } from "react";
2+
// Usage
3+
// function App() {
4+
// const size = useWindowSize();
5+
// return (
6+
// <div>
7+
// {size.width}px / {size.height}px
8+
// </div>
9+
// );
10+
// }
11+
12+
13+
// Hook
14+
function useWindowSize() {
15+
// Initialize state with undefined width/height so server and client renders match
16+
// Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
17+
const [windowSize, setWindowSize] = useState< {
18+
width: undefined | number,
19+
height: undefined| number,
20+
}>({
21+
width: undefined,
22+
height: undefined,
23+
});
24+
useEffect(() => {
25+
// Handler to call on window resize
26+
function handleResize() {
27+
// Set window width/height to state
28+
setWindowSize({
29+
width: window.innerWidth,
30+
height: window.innerHeight,
31+
});
32+
}
33+
// Add event listener
34+
typeof window !== undefined && window.addEventListener("resize", handleResize);
35+
// Call handler right away so state gets updated with initial window size
36+
handleResize();
37+
// Remove event listener on cleanup
38+
return () => window.removeEventListener("resize", handleResize);
39+
}, []); // Empty array ensures that effect is only run on mount
40+
return windowSize;
41+
}
42+
43+
export default useWindowSize

0 commit comments

Comments
 (0)