Skip to content
This repository was archived by the owner on Aug 2, 2025. It is now read-only.

Commit 9a86670

Browse files
committed
fix: replace contextualise with zustand stores
1 parent 983f545 commit 9a86670

File tree

12 files changed

+140
-158
lines changed

12 files changed

+140
-158
lines changed

src/components/DTTPeriod/DTTPeriod.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { chakra, useBoolean, useMediaQuery } from "@chakra-ui/react";
22
import { DateTime } from "luxon";
33
import { useState } from "react";
4-
import useSettings from "../../hooks/useSettings";
54
import { TimetablPeriod } from "../../services/sbhsApi/types";
5+
import { useSettingsStore } from "../../stores/settings";
66
import { Period } from "../Period";
77

88
export const DTTPeriod = ({
@@ -14,13 +14,13 @@ export const DTTPeriod = ({
1414
isLoaded: boolean;
1515
active: boolean;
1616
}) => {
17-
const {
18-
showTimesInsteadOfRooms,
19-
expanded: defaultExpanded,
20-
hoverExpand,
21-
periodColours,
22-
} = useSettings();
23-
const [expanded, setExpanded] = useBoolean(defaultExpanded === "true");
17+
const showTimesInsteadOfRooms = useSettingsStore(
18+
(state) => state.showTimesInsteadOfRooms
19+
);
20+
const defaultExpanded = useSettingsStore((state) => state.expanded);
21+
const hoverExpand = useSettingsStore((state) => state.hoverExpand);
22+
const periodColours = useSettingsStore((state) => state.periodColours);
23+
const [expanded, setExpanded] = useBoolean(defaultExpanded);
2424
const [hoverable] = useMediaQuery("(any-hover: hover)");
2525
const [hoverTimeout, setHoverTimeout] = useState<ReturnType<
2626
typeof setTimeout
@@ -48,7 +48,7 @@ export const DTTPeriod = ({
4848
}
4949
isLoaded={isLoaded}
5050
rightContent={
51-
showTimesInsteadOfRooms === "true" ? (
51+
showTimesInsteadOfRooms ? (
5252
period?.time?.toLocaleString(DateTime.TIME_SIMPLE)
5353
) : period.room ? (
5454
<chakra.span
@@ -66,7 +66,7 @@ export const DTTPeriod = ({
6666
expandedContent={
6767
<>
6868
at{" "}
69-
{showTimesInsteadOfRooms !== "true"
69+
{showTimesInsteadOfRooms
7070
? period?.time?.toLocaleString(DateTime.TIME_SIMPLE)
7171
: period.room}{" "}
7272
with{" "}
@@ -87,7 +87,7 @@ export const DTTPeriod = ({
8787
expandedSize={"xs"}
8888
expandedWeight={"semibold"}
8989
onMouseEnter={
90-
hoverable && hoverExpand === "true"
90+
hoverable && hoverExpand
9191
? () => {
9292
setHoverTimeout(
9393
setTimeout(() => {
@@ -99,7 +99,7 @@ export const DTTPeriod = ({
9999
: undefined
100100
}
101101
onMouseLeave={
102-
hoverable && hoverExpand === "true"
102+
hoverable && hoverExpand
103103
? () => {
104104
if (hoverTimeout) {
105105
clearTimeout(hoverTimeout);

src/hooks/useSettings.tsx

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/main.tsx

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
88
import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
99
import reportWebVitals from "./reportWebVitals";
1010
import { sendToVercelAnalytics } from "./vitals";
11-
import useSettings, { SettingsProvider } from "./hooks/useSettings";
1211
import { inject } from "@vercel/analytics";
1312
import { log } from "./utils/log";
1413
import { ToastContainer } from "./toast";
1514
import "@fontsource/poppins";
1615
import { createRouter } from "./createRouter";
1716
import { persister, queryClient } from "./createQueryClient";
1817
import { sbhsAuthActions } from "./stores/auth";
18+
import { useSettingsStore } from "./stores/settings";
1919

2020
// Redirect to new domain if using old domain
2121
if (window.location.host === "timetabl.vercel.app") {
@@ -30,9 +30,9 @@ if (window.location.host === "timetabl.vercel.app") {
3030
* A wrapper around the `ChakraProvider` component which generates the theme from settings and passes it to the the `ChakraProvider`.
3131
*/
3232
const ChakraWrapper = ({ ...props }) => {
33-
const { primary } = useSettings();
33+
const primary = useSettingsStore((state) => state.primary);
3434

35-
const theme = themeGen(primary as keyof typeof themeGen);
35+
const theme = themeGen(primary);
3636

3737
return <ChakraProvider theme={theme} {...props} />;
3838
};
@@ -49,16 +49,14 @@ ReactDOM.createRoot(document.getElementById("root")).render(
4949
},
5050
}}
5151
>
52-
<SettingsProvider>
53-
<ChakraWrapper>
54-
<ColorModeScript
55-
initialColorMode={themeGen().config.initialColorMode}
56-
/>
57-
<RouterProvider router={createRouter(queryClient)} />
58-
<ToastContainer />
59-
<ReactQueryDevtools initialIsOpen={false} />
60-
</ChakraWrapper>
61-
</SettingsProvider>
52+
<ChakraWrapper>
53+
<ColorModeScript
54+
initialColorMode={themeGen().config.initialColorMode}
55+
/>
56+
<RouterProvider router={createRouter(queryClient)} />
57+
<ToastContainer />
58+
<ReactQueryDevtools initialIsOpen={false} />
59+
</ChakraWrapper>
6260
</PersistQueryClientProvider>
6361
</StrictMode>
6462
);

src/routes/Main/Announcements/Announcements.tsx

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,32 @@ import { useState } from "react";
2929
import { DateTime } from "luxon";
3030
import { Search2Icon } from "@chakra-ui/icons";
3131
import { micromark } from "micromark";
32-
import { usePersistentState } from "../../../hooks/useSettings";
3332
import { TimetablNotice, NoticeYear } from "../../../services/sbhsApi/types";
3433
import { useTimetablNews } from "../../../services/timetablCms/useTimetablNews";
3534
import { useDailyNotices } from "../../../services/sbhsApi/useDailyNotices";
3635
import Empty from "../../../components/Empty";
3736
import { MegaphoneSimple } from "phosphor-react";
37+
import { create } from "zustand";
38+
import { devtools, persist } from "zustand/middleware";
39+
40+
type AnnouncementState = {
41+
year: NoticeYear;
42+
setYear: (year: NoticeYear) => void;
43+
};
44+
45+
const useAnnouncementStore = create<AnnouncementState>()(
46+
devtools(
47+
persist(
48+
(set): AnnouncementState => ({
49+
year: NoticeYear.ALL,
50+
setYear: (year) => set({ year }),
51+
}),
52+
{
53+
name: "announcement-storage",
54+
}
55+
)
56+
)
57+
);
3858

3959
const filterNotices = (
4060
notices: TimetablNotice[],
@@ -173,6 +193,8 @@ function DailyNotices({
173193
}
174194

175195
export default function Announcements() {
196+
const { year, setYear } = useAnnouncementStore();
197+
176198
const { data: timetablNews, isLoading: timetablNewsLoaded } = useTimetablNews(
177199
{}
178200
);
@@ -185,10 +207,6 @@ export default function Announcements() {
185207
setTabIndex(index);
186208
};
187209

188-
const [filter, setFilter] = usePersistentState(
189-
"announcementsFilter",
190-
"" + NoticeYear.ALL
191-
);
192210
const [query, setQuery] = useState("");
193211

194212
return (
@@ -221,8 +239,8 @@ export default function Announcements() {
221239
>
222240
<FormLabel mb="0">Filter</FormLabel>
223241
<Select
224-
onChange={(event) => setFilter(event.target.value)}
225-
value={filter}
242+
onChange={(event) => setYear(parseInt(event.target.value))}
243+
value={year}
226244
>
227245
<option value={NoticeYear.ALL}>All</option>
228246
<option value={NoticeYear.YEAR7}>Year 7</option>
@@ -249,7 +267,7 @@ export default function Announcements() {
249267
{[0, 1].map((tab) => (
250268
<TabPanel key={tab}>
251269
<DailyNotices
252-
filter={parseInt(filter)}
270+
filter={year}
253271
query={query}
254272
tab={tab}
255273
timetablNews={timetablNews}

src/routes/Main/Home/Home.tsx

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,19 @@ export default function Home() {
2626
const [date, setDate] = useState<string>("initial");
2727
const resetDate = () => setDate("initial");
2828
const nextDay = () => {
29-
setDate(
30-
DateTime.fromISO(date === "initial" ? initialDate : date)
31-
.plus({ days: 1 })
32-
.toISODate()
33-
);
34-
if (date === initialDate) resetDate();
29+
const newDate = DateTime.fromISO(date === "initial" ? initialDate : date)
30+
.plus({ days: 1 })
31+
.toISODate();
32+
setDate(newDate);
33+
if (newDate === initialDate) resetDate();
3534
};
3635

3736
const previousDay = () => {
38-
setDate(
39-
DateTime.fromISO(date === "initial" ? initialDate : date)
40-
.minus({ days: 1 })
41-
.toISODate()
42-
);
43-
if (date === initialDate) resetDate();
37+
const newDate = DateTime.fromISO(date === "initial" ? initialDate : date)
38+
.minus({ days: 1 })
39+
.toISODate();
40+
setDate(newDate);
41+
if (newDate === initialDate) resetDate();
4442
};
4543

4644
const { data, isLoading } = useDtt(

src/routes/Main/Home/NextPeriod.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { DateTime } from "luxon";
22
import { useEffect } from "react";
33
import { Period } from "../../../components/Period/Period";
4-
import useSettings from "../../../hooks/useSettings";
54
import { useToken, useColorModeValue } from "@chakra-ui/react";
65
import { TimetablPeriod } from "../../../services/sbhsApi/types";
6+
import { useSettingsStore } from "../../../stores/settings";
77

88
type NextPeriodProps = {
99
periods: TimetablPeriod[];
@@ -36,7 +36,10 @@ export default ({
3636
return () => clearInterval(timer);
3737
});
3838

39-
const { showTimesInsteadOfRooms, periodColours } = useSettings();
39+
const showTimesInsteadOfRooms = useSettingsStore(
40+
(state) => state.showTimesInsteadOfRooms
41+
);
42+
const periodColours = useSettingsStore((state) => state.periodColours);
4043

4144
return (
4245
<Period
@@ -52,7 +55,7 @@ export default ({
5255
leftContent={nextPeriod.name}
5356
leftContentSize={"lg"}
5457
rightContent={
55-
showTimesInsteadOfRooms === "true"
58+
showTimesInsteadOfRooms
5659
? nextPeriod?.time?.toLocaleString(DateTime.TIME_SIMPLE)
5760
: nextPeriod.room ??
5861
nextPeriod?.time?.toLocaleString(DateTime.TIME_SIMPLE)

0 commit comments

Comments
 (0)