Skip to content

Commit 9fcb456

Browse files
committed
Refactor responsive behavior by replacing local state management with useWindowResize hook in multiple components
1 parent 7600be8 commit 9fcb456

File tree

8 files changed

+43
-87
lines changed

8 files changed

+43
-87
lines changed

react/src/components/common/ButtonSection.js

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import React, { useState, useEffect } from "react";
1+
import React from "react";
22
import { Button, Grid, Box } from "@mui/material";
33
import { Link, useLocation } from "react-router-dom";
44
import { useContext } from "react";
55
import { ThemeContext } from "../../context/ThemeContext";
6+
import useWindowResize from "../../hooks/useWindowResize";
67

78
const ButtonSection = () => {
89
const { darkMode, setDarkMode } = useContext(ThemeContext);
@@ -70,25 +71,12 @@ const ButtonSection = () => {
7071
: {};
7172
};
7273

73-
const [isMobile, setIsMobile] = useState(false);
74-
75-
useEffect(() => {
76-
const handleResize = () => {
77-
setIsMobile(window.innerWidth <= 700);
78-
};
79-
80-
handleResize();
81-
82-
window.addEventListener("resize", handleResize);
83-
return () => {
84-
window.removeEventListener("resize", handleResize);
85-
};
86-
}, []);
74+
const isMobile = useWindowResize();
8775

8876
return (
8977
<Grid
9078
item
91-
sm={2}
79+
md={2}
9280
sx={{
9381
marginTop: isMobile ? "0vh" : "12vh",
9482
display: isMobile ? "flex" : "initial",

react/src/components/common/TitleBar.js

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
1-
import React, { useState, useEffect, useContext } from "react";
1+
import React, { useContext } from "react";
22
import { Box, Typography, Grid } from "@mui/material";
33
import { useNavigate } from "react-router-dom";
44

55
import { ThemeContext } from "../../context/ThemeContext";
6+
import useWindowResize from "../../hooks/useWindowResize";
67

78
const TitleBar = () => {
89
const navigate = useNavigate();
910

10-
const [isMobile, setIsMobile] = useState(false);
11+
const isMobile = useWindowResize();
1112
const { darkMode } = useContext(ThemeContext);
1213

13-
useEffect(() => {
14-
const handleResize = () => {
15-
setIsMobile(window.innerWidth <= 700);
16-
};
1714

18-
handleResize();
1915

20-
window.addEventListener("resize", handleResize);
21-
return () => {
22-
window.removeEventListener("resize", handleResize);
23-
};
24-
}, []);
16+
2517

2618
return (
2719
<>

react/src/components/pages/AllEmailList/index.js

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,18 @@ import FiberNewOutlinedIcon from "@mui/icons-material/FiberNewOutlined";
88
import DeleteIcon from "@mui/icons-material/Delete";
99
import ConfirmModal from "../../common/ConfirmModal";
1010
import { env } from "../../../env";
11+
import useWindowResize from "../../../hooks/useWindowResize";
1112

1213
const AllEmailList = () => {
1314
const [emailData, setEmailData] = useState([]);
1415
// eslint-disable-next-line no-unused-vars
1516
const [loading, setLoading] = useState(true);
16-
const [isMobile, setIsMobile] = useState(false);
17+
const isMobile = useWindowResize();
1718
const [emailToDelete, setEmailToDelete] = useState(null);
1819
const [openModal, setOpenModal] = useState(false);
1920
const [reload, setReload] = useState(false);
2021

21-
useEffect(() => {
22-
const handleResize = () => {
23-
setIsMobile(window.innerWidth <= 700);
24-
};
25-
26-
handleResize();
2722

28-
window.addEventListener("resize", handleResize);
29-
return () => {
30-
window.removeEventListener("resize", handleResize);
31-
};
32-
}, []);
3323

3424
const navigate = useNavigate();
3525

react/src/components/pages/Generate/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ const Generate = () => {
8888
<>
8989
<Grid container spacing={2} sx={{ height: "100%" }}>
9090
<ButtonSection />
91-
<Grid item xs={12} sm={10} sx={{ marginTop: "6vh" }}>
91+
<Grid item xs={12} md={10} sx={{ marginTop: "6vh" }}>
9292
<Box
9393
sx={{
9494
display: "flex",
@@ -100,7 +100,7 @@ const Generate = () => {
100100
textAlign: "center",
101101
}}
102102
>
103-
<Grid item xs={12} sm={5}>
103+
<Grid item xs={12} md={5}>
104104
<motion.div initial={{ scale: 0.5 }} animate={{ scale: 1 }} transition={{ duration: 0.3 }}>
105105
<TextField
106106
label="Enter your email"

react/src/components/pages/InboxEmail/index.js

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,17 @@ import InfoIcon from "@mui/icons-material/Info";
88
import { ThemeContext } from "../../../context/ThemeContext";
99
import { motion } from "framer-motion";
1010
import { env } from "../../../env";
11+
import useWindowResize from "../../../hooks/useWindowResize";
1112

1213
const InboxEmail = () => {
1314
const { emailId, email_id } = useParams();
1415
const [emailData, setEmailData] = useState();
1516
const [emailAttachments, setEmailAttachments] = useState([]);
1617
const [emailHeaders, setEmailHeaders] = useState([]);
1718
const [isTooltipOpen, setIsTooltipOpen] = useState(false);
18-
const [isMobile, setIsMobile] = useState(false);
19-
19+
const isMobile = useWindowResize();
2020
const { darkMode } = useContext(ThemeContext);
2121

22-
useEffect(() => {
23-
const handleResize = () => {
24-
setIsMobile(window.innerWidth <= 700);
25-
};
26-
27-
handleResize();
28-
29-
window.addEventListener("resize", handleResize);
30-
return () => {
31-
window.removeEventListener("resize", handleResize);
32-
};
33-
}, []);
3422

3523
let headers;
3624

@@ -107,8 +95,8 @@ const InboxEmail = () => {
10795
<>
10896
<Grid container spacing={2} sx={{ height: "100%" }}>
10997
<ButtonSection />
110-
<Grid item xs={12} sm={1} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}></Grid>
111-
<Grid item xs={12} sm={8} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}>
98+
<Grid item xs={12} md={1} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}></Grid>
99+
<Grid item xs={12} md={8} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}>
112100
<Paper
113101
elevation={3}
114102
sx={{

react/src/components/pages/InboxList/index.js

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,19 @@ import NoEmailDisplay from "../../common/NoEmailDisplay";
99
import { ThemeContext } from "../../../context/ThemeContext";
1010
import { FileCopyOutlined } from "@mui/icons-material";
1111
import { env } from "../../../env";
12+
import useWindowResize from "../../../hooks/useWindowResize";
1213

1314
const EmailList = () => {
1415
const { emailId } = useParams();
1516
const [emailData, setEmailData] = useState([]);
1617
const [loading, setLoading] = useState(true);
17-
const [isMobile, setIsMobile] = useState(false);
18+
const isMobile = useWindowResize();
1819
const [openModal, setOpenModal] = useState(false);
1920
const [emailToDelete, setEmailToDelete] = useState(null);
2021
const { darkMode } = useContext(ThemeContext);
2122
const staggerDuration = 0.05;
2223

23-
useEffect(() => {
24-
const handleResize = () => {
25-
setIsMobile(window.innerWidth <= 700);
26-
};
27-
28-
handleResize();
2924

30-
window.addEventListener("resize", handleResize);
31-
return () => {
32-
window.removeEventListener("resize", handleResize);
33-
};
34-
}, []);
3525

3626
const navigate = useNavigate();
3727

@@ -97,8 +87,8 @@ const EmailList = () => {
9787
<>
9888
<Grid container spacing={2} sx={{ height: "100%" }}>
9989
<ButtonSection />
100-
<Grid item xs={12} sm={1} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}></Grid>
101-
<Grid item xs={12} sm={8} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}>
90+
<Grid item xs={12} md={1} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}></Grid>
91+
<Grid item xs={12} md={8} sx={{ marginTop: isMobile ? "0vh" : "6vh" }}>
10292
<Tooltip title="Copy Email" placement="top">
10393
<Typography
10494
variant="h5"

react/src/components/pages/Main/index.js

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,14 @@
1-
import React, { useEffect, useState, useContext } from "react";
1+
import React, { useContext } from "react";
22
import { Grid, Box, Typography } from "@mui/material";
33
import ButtonSection from "../../common/ButtonSection";
44
import { ThemeContext } from "../../../context/ThemeContext";
55
import { motion } from "framer-motion";
6+
import useWindowResize from "../../../hooks/useWindowResize";
67

78
const Main = () => {
8-
const [isMobile, setIsMobile] = useState(false);
9+
const isMobile = useWindowResize();
910
const { darkMode } = useContext(ThemeContext);
1011

11-
useEffect(() => {
12-
const handleResize = () => {
13-
setIsMobile(window.innerWidth <= 700);
14-
};
15-
16-
handleResize();
17-
18-
window.addEventListener("resize", handleResize);
19-
return () => {
20-
window.removeEventListener("resize", handleResize);
21-
};
22-
}, []);
2312

2413
return (
2514
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} exit={{ opacity: 0 }}>
@@ -28,7 +17,7 @@ const Main = () => {
2817
<Grid
2918
item
3019
xs={12}
31-
sm={10}
20+
md={10}
3221
sx={{
3322
marginTop: isMobile ? "1vh" : "6vh",
3423
paddingLeft: "2%",

react/src/hooks/useWindowResize.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { useState, useEffect } from "react";
2+
3+
const useWindowResize = (breakpoint = 900) => {
4+
const [isMobile, setIsMobile] = useState(false);
5+
6+
useEffect(() => {
7+
const handleResize = () => {
8+
setIsMobile(window.innerWidth <= breakpoint);
9+
};
10+
11+
handleResize();
12+
window.addEventListener("resize", handleResize);
13+
return () => window.removeEventListener("resize", handleResize);
14+
}, [breakpoint]);
15+
16+
return isMobile;
17+
};
18+
19+
export default useWindowResize;

0 commit comments

Comments
 (0)