1
1
import clsx from "clsx"
2
2
import React , { useEffect , useState } from "react"
3
- import { RefreshCcw } from "react-feather"
3
+ import { Link } from "react-feather"
4
4
import Recoil , { useRecoilState } from "recoil"
5
5
import { ContentPlayerPlayingContent } from "../../@types/plugin"
6
6
import { AnnictRESTAPI , generateGqlClient } from "../annictAPI"
@@ -13,6 +13,7 @@ import {
13
13
import { detectProgramInfo } from "../findWork"
14
14
import { RatingState , StatusState , WorkFragment } from "../gql"
15
15
import { ARM , SayaDefinition } from "../types"
16
+ import { SearchWorkForm } from "./SeachWorkForm"
16
17
17
18
export const AnnictTrack : React . FC < {
18
19
accessToken : string
@@ -30,6 +31,7 @@ export const AnnictTrack: React.FC<{
30
31
facebookAtom,
31
32
} ) => {
32
33
const [ timing , setTiming ] = useState ( 0 )
34
+ const [ linkedAt , setLinkedAt ] = useState ( 0 )
33
35
const [ isLoading , setIsLoading ] = useState ( true )
34
36
const rest = new AnnictRESTAPI ( accessToken )
35
37
const [ workId , setWorkId ] = useState < number | null > ( null )
@@ -61,7 +63,7 @@ export const AnnictTrack: React.FC<{
61
63
return
62
64
}
63
65
setWorkId ( programInfo . annictId )
64
- if ( programInfo . episode . id ) {
66
+ if ( programInfo . episode ? .id ) {
65
67
setEpisodeId ( programInfo . episode . id )
66
68
setEpisodeInfo ( null )
67
69
} else {
@@ -72,7 +74,7 @@ export const AnnictTrack: React.FC<{
72
74
console . error ( e )
73
75
setIsLoading ( false )
74
76
} )
75
- } , [ accessToken , timing , arm ] )
77
+ } , [ accessToken , linkedAt , arm ] )
76
78
const [ episodeInfo , setEpisodeInfo ] = useState < {
77
79
number : number
78
80
title : string
@@ -108,12 +110,12 @@ export const AnnictTrack: React.FC<{
108
110
const work = result . searchWorks ?. nodes ?. [ 0 ]
109
111
setWork ( work || null )
110
112
if ( work ) {
111
- setWatchStatus ( work . viewerStatusState || StatusState . NO_STATE )
113
+ setWatchStatus ( work . viewerStatusState ?? StatusState . NO_STATE )
112
114
}
113
115
} )
114
116
. catch ( console . error )
115
117
. finally ( ( ) => setIsLoading ( false ) )
116
- } , [ workId , timing ] )
118
+ } , [ workId , linkedAt , timing ] )
117
119
const [ isStatusChanging , setIsStatusChanging ] = useState ( false )
118
120
useEffect ( ( ) => {
119
121
if ( ! work || work . viewerStatusState === watchStatus ) {
@@ -174,25 +176,29 @@ export const AnnictTrack: React.FC<{
174
176
"py-2" ,
175
177
"bg-gray-800" ,
176
178
"flex" ,
177
- "justify-between"
179
+ "justify-between" ,
180
+ "items-center"
178
181
) }
179
182
>
180
183
< h1 className = { clsx ( "text-lg" ) } > 視聴記録</ h1 >
181
- < button
182
- className = { clsx (
183
- "focus:outline-none" ,
184
- "rounded-md" ,
185
- "bg-gray-900" ,
186
- "hover:bg-gray-800" ,
187
- "p-1" ,
188
- "cursor-pointer" ,
189
- "transition-colors"
190
- ) }
191
- title = "再読み込み"
192
- onClick = { ( ) => setTiming ( performance . now ( ) ) }
193
- >
194
- < RefreshCcw size = { 18 } />
195
- </ button >
184
+ < div className = { clsx ( "flex" , "items-center" , "space-x-2" ) } >
185
+ < button
186
+ className = { clsx (
187
+ "focus:outline-none" ,
188
+ "rounded-md" ,
189
+ "bg-gray-900" ,
190
+ "hover:bg-gray-800" ,
191
+ "p-1" ,
192
+ "cursor-pointer" ,
193
+ "transition-colors"
194
+ ) }
195
+ title = "番組情報から取得"
196
+ onClick = { ( ) => setLinkedAt ( performance . now ( ) ) }
197
+ >
198
+ < Link size = { 18 } />
199
+ </ button >
200
+ < SearchWorkForm accessToken = { accessToken } setWorkId = { setWorkId } />
201
+ </ div >
196
202
</ div >
197
203
{ work ? (
198
204
< div className = { clsx ( "w-full" , "flex" , "overflow-auto" ) } >
@@ -233,7 +239,7 @@ export const AnnictTrack: React.FC<{
233
239
onChange = { ( e ) => {
234
240
setWatchStatus ( e . target . value as never )
235
241
} }
236
- defaultValue = { work . viewerStatusState || undefined }
242
+ value = { watchStatus }
237
243
disabled = { isStatusChanging }
238
244
>
239
245
{ Object . entries ( STATUS_LABEL ) . map ( ( [ key , label ] ) => (
@@ -413,7 +419,9 @@ export const AnnictTrack: React.FC<{
413
419
"flex" ,
414
420
"justify-between" ,
415
421
"cursor-pointer" ,
416
- episode ?. viewerDidTrack && "text-gray-600"
422
+ episode ?. viewerDidTrack && "text-gray-600" ,
423
+ "hover:text-gray-400" ,
424
+ "transition-colors"
417
425
) }
418
426
>
419
427
< span className = { clsx ( "truncate" ) } >
0 commit comments