1+ import { useState , useRef , useEffect , SetStateAction , Dispatch } from "react" ;
2+ import { API } from "./api" ;
3+ import { FormData , MemberData , RoomCode , SetFormData } from "./types" ;
4+ import { intervals , timeIntervals } from "./utils" ;
5+ import { useRouter } from "next/navigation" ;
6+
7+ export const GetResult = ( roomCode : string ) => {
8+ const [ result , setResult ] = useState < number [ ] [ ] > ( [ ] )
9+ const [ membersData , setMembersData ] = useState < MemberData [ ] > ( [ ] )
10+ const [ time , setTime ] = useState < number > ( 7200000 ) ;
11+
12+ const intervalRef = useRef < ReturnType < typeof setInterval > > ( ) ;
13+ const decreaseNum = ( ) => setTime ( ( prev ) => prev - 1 ) ;
14+
15+ useEffect ( ( ) => {
16+ API . getInterval ( roomCode ) . then ( ( res : any ) => {
17+ setResult ( res )
18+ } )
19+ API . getUsers ( roomCode ) . then ( ( res : any ) => {
20+ setMembersData ( res )
21+ } )
22+
23+ intervalRef . current = setInterval ( decreaseNum , 1000 ) ;
24+ return ( ) => clearInterval ( intervalRef . current ) ;
25+
26+ // eslint-disable-next-line react-hooks/exhaustive-deps
27+ } , [ ] )
28+
29+ return { result, membersData, time }
30+ }
31+
32+ export const WriteForm = ( { setFormData } : SetFormData ) => {
33+ const [ intLength , setIntLength ] = useState < number > ( intervals . length )
34+
35+ const addInterval = ( ) => {
36+ intervals . push ( timeIntervals )
37+ setIntLength ( intervals . length )
38+ handleChange ( 'intervals' , intervals )
39+ }
40+
41+ const removeInterval = ( ) => {
42+ intervals . pop ( )
43+ setIntLength ( intervals . length )
44+ handleChange ( 'intervals' , intervals )
45+ }
46+
47+ const handleChange = ( name : string , value : any ) => {
48+ setFormData ( ( prev : any ) => ( {
49+ ...prev ,
50+ [ name ] : value ,
51+ } ) )
52+ }
53+
54+ return { intLength, addInterval, removeInterval, handleChange }
55+ }
56+
57+ export const SetForm = ( roomCode : string ) => {
58+ const router = useRouter ( )
59+ const [ showError , setShowError ] = useState < boolean > ( false )
60+ const [ formData , setFormData ] = useState < FormData > ( {
61+ name : '' ,
62+ roomCode : roomCode ,
63+ intervals : [ timeIntervals ] ,
64+ } )
65+
66+ const checkFields = ( ) => {
67+ if ( formData . name === '' ) setShowError ( true )
68+ else {
69+ setShowError ( false )
70+ API . postData ( formData )
71+ router . push ( `/${ roomCode } /result` )
72+ }
73+ }
74+
75+ return { showError, setFormData, checkFields }
76+ }
77+
78+ export const SetIntervals = ( { setFormData} : SetFormData ) => {
79+ const [ errorMsg , setErrorMsg ] = useState < string > ( '' )
80+ const [ arrIndex , setArrIndex ] = useState < number > ( 0 )
81+
82+ const [ timeRange , setTimeRange ] = useState ( {
83+ start : 480 ,
84+ end : 600 ,
85+ } )
86+
87+ const updatedRange = ( e : any , index : number ) => {
88+ const { name, value } = e . target
89+ var array = value . split ( ':' )
90+ var minutes = parseInt ( array [ 0 ] , 10 ) * 60 + parseInt ( array [ 1 ] , 10 )
91+ setArrIndex ( index )
92+ setTimeRange ( ( prev : any ) => ( {
93+ ...prev ,
94+ [ name ] : minutes ,
95+ } ) )
96+ }
97+
98+ useEffect ( ( ) => {
99+ if ( timeRange . end <= timeRange . start )
100+ setErrorMsg ( 'Invalid time intervals: End time > Start time.' )
101+ else {
102+ setErrorMsg ( '' )
103+ intervals [ arrIndex ] = [ timeRange . start , timeRange . end ]
104+ setFormData ( ( prev : any ) => ( {
105+ ...prev ,
106+ intervals : intervals ,
107+ } ) )
108+ }
109+ // eslint-disable-next-line react-hooks/exhaustive-deps
110+ } , [ timeRange ] )
111+
112+ return { errorMsg, updatedRange }
113+ }
0 commit comments