@@ -3,57 +3,20 @@ import { ApiURL } from "@/lib/api/common/apiURL";
33import { fetchEventSource } from "@/lib/api/common/fetchEventSource" ;
44import { useGetCurrentDuelOrPartyQuery } from "@/lib/api/queries/duels" ;
55import { Api } from "@/lib/api/types" ;
6- import { useEffect , useMemo , useState } from "react" ;
6+ import { useQuery , useQueryClient } from "@tanstack/react-query" ;
7+ import { useEffect } from "react" ;
78
8- type DuelStreamData = {
9- data : UnknownApiResponse < Api < "DuelData" > > | null ;
10- isConnected : boolean ;
11- error : Error | null ;
12- } ;
13-
14- type FinalDuelStreamData = DuelStreamData & {
15- status : "success" | "pending" | "error" ;
16- } ;
17-
18- export const useMyDuelOrPartyData = ( ) : FinalDuelStreamData => {
19- const { data, status, error } = useGetCurrentDuelOrPartyQuery ( ) ;
9+ export const useMyDuelOrPartyData = ( ) => {
10+ const { data } = useGetCurrentDuelOrPartyQuery ( ) ;
2011 const d = useDuelOrPartyData ( data ?. payload ?. code || "" ) ;
2112
22- if ( status === "pending" ) {
23- return {
24- data : null ,
25- isConnected : false ,
26- error : null ,
27- status : "pending" ,
28- } ;
29- }
30-
31- if ( status === "error" ) {
32- return {
33- data : null ,
34- isConnected : false ,
35- error,
36- status : "error" ,
37- } ;
38- }
39-
40- if ( ! data . success ) {
41- return {
42- data : null ,
43- isConnected : false ,
44- error : null ,
45- status : "success" ,
46- } ;
47- }
48-
4913 return d ;
5014} ;
5115
52- export const useDuelOrPartyData = ( lobbyCode : string ) : FinalDuelStreamData => {
53- const [ state , setState ] = useState < DuelStreamData > ( {
54- data : null ,
55- isConnected : false ,
56- error : null ,
16+ export const useDuelOrPartyData = ( lobbyCode : string ) => {
17+ const queryClient = useQueryClient ( ) ;
18+ const query = useQuery < UnknownApiResponse < Api < "DuelData" > > > ( {
19+ queryKey : [ "duel" , lobbyCode ] ,
5720 } ) ;
5821
5922 useEffect ( ( ) => {
@@ -63,72 +26,38 @@ export const useDuelOrPartyData = (lobbyCode: string): FinalDuelStreamData => {
6326
6427 const controller = new AbortController ( ) ;
6528
66- const connect = async ( ) => {
67- const { url, method, res } = ApiURL . create ( "/api/duel/{lobbyCode}/sse" , {
68- method : "POST" ,
69- params : {
70- lobbyCode : lobbyCode ,
71- } ,
72- } ) ;
73-
74- const controller = new AbortController ( ) ;
75-
76- await fetchEventSource ( url , {
77- method,
78- headers : {
79- "Content-Type" : "application/json" ,
80- } ,
81- signal : controller . signal ,
82-
83- async onopen ( response ) {
84- if ( response . ok ) {
85- setState ( ( prev ) => ( { ...prev , isConnected : true , error : null } ) ) ;
86- return ;
87- }
88- } ,
89-
90- onmessage ( ev ) {
91- try {
92- const data = res ( JSON . parse ( ev . data ) ) ;
93- setState ( ( prev ) => ( { ...prev , data : data , isConnected : true } ) ) ;
94- } catch ( e ) {
95- console . error ( "Failed to parse SSE message" , e ) ;
96- throw e ;
97- }
98- } ,
99-
100- onerror ( err ) {
101- if ( err instanceof Error ) {
102- if ( err . message ) {
103- setState ( ( prev ) => ( { ...prev , error : err , isConnected : false } ) ) ;
104- }
105- }
106- } ,
107-
108- onclose ( ) {
109- setState ( ( prev ) => ( { ...prev , isConnected : false } ) ) ;
110- } ,
111- } ) ;
112- } ;
113- connect ( ) ;
29+ const { url, method, res } = ApiURL . create ( "/api/duel/{lobbyCode}/sse" , {
30+ method : "POST" ,
31+ params : {
32+ lobbyCode,
33+ } ,
34+ } ) ;
35+
36+ fetchEventSource ( url , {
37+ method,
38+ headers : {
39+ "Content-Type" : "application/json" ,
40+ } ,
41+ signal : controller . signal ,
42+
43+ onmessage ( ev ) {
44+ try {
45+ const data = res ( JSON . parse ( ev . data ) ) ;
46+ queryClient . setQueryData ( [ "duel" , lobbyCode ] , data ) ;
47+ } catch ( e ) {
48+ console . error ( "Failed to parse SSE message" , e ) ;
49+ }
50+ } ,
51+
52+ onerror ( err ) {
53+ console . error ( "SSE error" , err ) ;
54+ } ,
55+ } ) ;
11456
11557 return ( ) => {
11658 controller . abort ( ) ;
117- setState ( ( prev ) => ( { ...prev , isConnected : false , error : null } ) ) ;
11859 } ;
119- } , [ lobbyCode ] ) ;
120-
121- const status = useMemo ( ( ) => {
122- if ( state . data && state . isConnected ) {
123- return "success" ;
124- }
125-
126- if ( ! state . isConnected && state . error ) {
127- return "error" ;
128- }
129-
130- return "pending" ;
131- } , [ state . data , state . error , state . isConnected ] ) ;
60+ } , [ lobbyCode , queryClient ] ) ;
13261
133- return { ... state , status } ;
62+ return query ;
13463} ;
0 commit comments