Skip to content

Commit a9aaf07

Browse files
committed
feature : Playing 상태의 Hook 변경감지
1 parent 6aa4307 commit a9aaf07

File tree

5 files changed

+56
-16
lines changed

5 files changed

+56
-16
lines changed

src/App.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,22 @@ import { BrowserRouter, Route, Routes } from "react-router-dom";
55
import Home from ".";
66
import "./App.css";
77
import ChartProvider from "./provider/ChartProvider";
8+
import UsePlayingProvider from "./provider/UsePlayingProvider";
89

910
function App() {
1011
const [queryClient] = useState(() => new QueryClient());
1112
return (
1213
<QueryClientProvider client={queryClient}>
13-
<ChartProvider>
14-
<BrowserRouter>
15-
<SpeedInsights />
16-
<Routes>
17-
<Route path="/" element={<Home />} />
18-
</Routes>
19-
</BrowserRouter>
20-
</ChartProvider>
14+
<UsePlayingProvider>
15+
<ChartProvider>
16+
<BrowserRouter>
17+
<SpeedInsights />
18+
<Routes>
19+
<Route path="/" element={<Home />} />
20+
</Routes>
21+
</BrowserRouter>
22+
</ChartProvider>
23+
</UsePlayingProvider>
2124
</QueryClientProvider>
2225
);
2326
}

src/common/Loading.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
import { useEffect, useState } from "react";
22
import Lottie from "react-lottie-player";
33
import LoadingLottie from "../assets/lottie/loading.json";
4+
import { usePlaying } from "../hook/usePlayingContext";
45

56
export default function Loading() {
67
const [mounted, setMounted] = useState(false);
7-
const [isPlaying, setIsPlaying] = useState(true);
8+
const { isPlaying, toggleIsPlaying } = usePlaying();
89

910
useEffect(() => setMounted(true), []);
1011

1112
if (!mounted) {
1213
return null;
1314
}
1415

15-
const togglePlay = () => setIsPlaying((prev) => !prev); // 재생/정지 토글 함수
16-
1716
return (
1817
<div
1918
style={{
@@ -24,7 +23,7 @@ export default function Loading() {
2423
marginTop: "5px",
2524
cursor: "pointer",
2625
}}
27-
onClick={togglePlay}
26+
onClick={toggleIsPlaying}
2827
>
2928
<p
3029
style={{

src/hook/useDynamicData.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
import { useQuery } from "@tanstack/react-query";
22
import { useEffect, useRef, useState } from "react";
3+
import { usePlaying } from "./usePlayingContext";
34

45
const useDynamicData = (
56
initialData: any,
67
updateDataFn: (data: any) => any,
78
queryKey: string
89
) => {
9-
const [isVisible, setIsVisible] = useState(false);
1010
const containerRef = useRef<HTMLDivElement>(null);
11+
const [isVisible, setIsVisible] = useState(false);
1112
const [firstLoad, setFirstLoad] = useState(true);
13+
const { isPlaying } = usePlaying();
1214

1315
const { data: data, refetch } = useQuery({
1416
queryKey: [queryKey],
1517
queryFn: () => {
1618
return Promise.resolve(updateDataFn(initialData));
1719
},
18-
refetchInterval: isVisible ? 5000 : false, // 차트가 보일 때만 갱신
19-
enabled: isVisible && !firstLoad, // 초기에는 비활성화
20+
refetchInterval: isVisible && isPlaying ? 5000 : false, // 차트가 보일 때만 갱신
21+
enabled: isVisible && isPlaying && !firstLoad, // 초기에는 비활성화
2022
initialData: initialData, // 초기 데이터 설정
2123
});
2224

@@ -45,7 +47,7 @@ const useDynamicData = (
4547
return () => {
4648
observer.disconnect();
4749
};
48-
}, [refetch]);
50+
}, [isPlaying, refetch]);
4951

5052
useEffect(() => {
5153
if (isVisible) {

src/hook/usePlayingContext.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { createContext, useContext } from "react";
2+
3+
interface usePlayingContextProps {
4+
isPlaying: boolean;
5+
toggleIsPlaying: () => void;
6+
}
7+
8+
export const usePlayingContext = createContext<
9+
usePlayingContextProps | undefined
10+
>(undefined);
11+
12+
export const usePlaying = () => {
13+
const context = useContext(usePlayingContext);
14+
if (!context) {
15+
throw new Error("usePlaying must be used within a UsePlayingProvider");
16+
}
17+
return context;
18+
};
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { useState } from "react";
2+
import { usePlayingContext } from "../hook/usePlayingContext";
3+
4+
const UsePlayingProvider = ({ children }: { children: React.ReactNode }) => {
5+
const [isPlaying, setIsPlaying] = useState(true);
6+
7+
const toggleIsPlaying = () => {
8+
setIsPlaying((prev) => !prev);
9+
};
10+
11+
return (
12+
<usePlayingContext.Provider value={{ isPlaying, toggleIsPlaying }}>
13+
<>{children}</>
14+
</usePlayingContext.Provider>
15+
);
16+
};
17+
18+
export default UsePlayingProvider;

0 commit comments

Comments
 (0)