@@ -12,19 +12,16 @@ import {
12
12
} from 'react'
13
13
import { Spinner } from '@nextui-org/react'
14
14
import { ncoApi } from '@midra/nco-api'
15
- import { CHANNEL_IDS_JIKKYO_SYOBOCAL } from '@midra/nco-api/constants'
16
15
import { syobocalToJikkyoChId } from '@midra/nco-api/utils/syobocalToJikkyoChId'
17
16
17
+ import { SYOBOCAL_CHANNEL_IDS } from '@/constants/channels'
18
+
18
19
import { useNcoState } from '@/hooks/useNco'
19
20
20
21
import { SlotItem } from '@/components/slot-item'
21
22
22
23
let controller : AbortController | undefined
23
24
24
- const SYOBOCAL_CHANNEL_IDS = CHANNEL_IDS_JIKKYO_SYOBOCAL . map (
25
- ( [ _ , scChId ] ) => scChId
26
- )
27
-
28
25
export type SubtitleDetailHandle = {
29
26
initialize : ( ) => void
30
27
}
@@ -39,18 +36,57 @@ export const SubtitleDetail = forwardRef<
39
36
SubtitleDetailProps
40
37
> ( ( { title, subtitle } , ref ) => {
41
38
const [ isLoading , setIsLoading ] = useState ( false )
42
- const [ slotDetails , setSlotDetails ] = useState < StateSlotDetailJikkyo [ ] > ( [ ] )
39
+ const [ currentTid , setCurrentTid ] = useState ( '' )
40
+ const [ programs , setPrograms ] = useState < SyoboCalProgram [ ] > ( [ ] )
43
41
44
42
const stateSlotDetails = useNcoState ( 'slotDetails' )
45
43
46
44
const ids = useMemo ( ( ) => {
47
45
return stateSlotDetails ?. map ( ( v ) => v . id )
48
46
} , [ stateSlotDetails ] )
49
47
48
+ const programItems = useMemo ( ( ) => {
49
+ const currentTime = Date . now ( ) / 1000
50
+ const slotTitle = [ title . Title , `#${ Number ( subtitle [ 0 ] ) } ` , subtitle [ 1 ] ]
51
+ . join ( ' ' )
52
+ . trim ( )
53
+
54
+ const details : StateSlotDetailJikkyo [ ] = programs . flatMap ( ( program ) => {
55
+ const id = `${ syobocalToJikkyoChId ( program . ChID ) } :${ program . StTime } -${ program . EdTime } `
56
+
57
+ if ( currentTime < parseInt ( program . EdTime ) ) {
58
+ return [ ]
59
+ }
60
+
61
+ const starttime = parseInt ( program . StTime ) * 1000
62
+ const endtime = parseInt ( program . EdTime ) * 1000
63
+
64
+ return {
65
+ type : 'jikkyo' ,
66
+ id,
67
+ status : 'pending' ,
68
+ info : {
69
+ id : program . TID ,
70
+ title : slotTitle ,
71
+ duration : ( endtime - starttime ) / 1000 ,
72
+ date : [ starttime , endtime ] ,
73
+ count : {
74
+ comment : 0 ,
75
+ } ,
76
+ } ,
77
+ }
78
+ } )
79
+
80
+ return details
81
+ } , [ programs ] )
82
+
50
83
const initialize = useCallback ( ( ) => {
84
+ if ( title . TID === currentTid ) return
85
+
51
86
controller ?. abort ( )
52
87
53
- setSlotDetails ( [ ] )
88
+ setCurrentTid ( title . TID )
89
+ setPrograms ( [ ] )
54
90
setIsLoading ( true )
55
91
56
92
controller = new AbortController ( )
@@ -77,50 +113,16 @@ export const SubtitleDetail = forwardRef<
77
113
} )
78
114
. catch ( ( ) => reject ( ) )
79
115
} )
80
- . then ( ( programs ) => {
81
- const slotTitle = [ title . Title , `#${ subtitle [ 0 ] } ` , subtitle [ 1 ] ]
82
- . join ( ' ' )
83
- . trim ( )
84
-
85
- const currentTime = Date . now ( ) / 1000
86
-
87
- const details : StateSlotDetailJikkyo [ ] = programs . flatMap ( ( program ) => {
88
- const id = `${ syobocalToJikkyoChId ( program . ChID ) } :${ program . StTime } -${ program . EdTime } `
89
-
90
- if ( currentTime < parseInt ( program . EdTime ) ) {
91
- return [ ]
92
- }
93
-
94
- const starttime = parseInt ( program . StTime ) * 1000
95
- const endtime = parseInt ( program . EdTime ) * 1000
96
-
97
- return {
98
- type : 'jikkyo' ,
99
- id,
100
- status : 'pending' ,
101
- info : {
102
- id : program . TID ,
103
- title : slotTitle ,
104
- duration : ( endtime - starttime ) / 1000 ,
105
- date : [ starttime , endtime ] ,
106
- count : {
107
- comment : 0 ,
108
- } ,
109
- } ,
110
- }
111
- } )
112
-
113
- setSlotDetails ( details )
114
- } )
115
- . catch ( ( ) => setSlotDetails ( [ ] ) )
116
+ . then ( ( value ) => setPrograms ( value ) )
117
+ . catch ( ( ) => setPrograms ( [ ] ) )
116
118
. finally ( ( ) => setIsLoading ( false ) )
117
- } , [ title , subtitle ] )
119
+ } , [ title , subtitle , currentTid ] )
118
120
119
121
useImperativeHandle ( ref , ( ) => {
120
122
return { initialize }
121
123
} , [ initialize ] )
122
124
123
- return isLoading || ! slotDetails . length ? (
125
+ return isLoading || ! programItems . length ? (
124
126
< div className = "flex size-full items-center justify-center py-1" >
125
127
{ isLoading ? (
126
128
< Spinner size = "sm" color = "primary" />
@@ -131,8 +133,8 @@ export const SubtitleDetail = forwardRef<
131
133
) }
132
134
</ div >
133
135
) : (
134
- < div className = "flex flex-col gap-2 " >
135
- { slotDetails . map ( ( detail ) => (
136
+ < div className = "flex flex-col gap-1.5 " >
137
+ { programItems . map ( ( detail ) => (
136
138
< SlotItem
137
139
key = { detail . id }
138
140
detail = { detail }
0 commit comments