From 6e338c86166bb54f8a84a325615b48d368f82fee Mon Sep 17 00:00:00 2001 From: miteruzo Date: Sun, 7 Jun 2026 02:13:40 +0900 Subject: [PATCH] #302 --- frontend/src/components/NicoViewer.tsx | 146 ++++++++++++------------- 1 file changed, 73 insertions(+), 73 deletions(-) diff --git a/frontend/src/components/NicoViewer.tsx b/frontend/src/components/NicoViewer.tsx index 4078ef3..c407391 100644 --- a/frontend/src/components/NicoViewer.tsx +++ b/frontend/src/components/NicoViewer.tsx @@ -1,11 +1,11 @@ import { forwardRef, - useCallback, - useEffect, - useImperativeHandle, - useLayoutEffect, - useMemo, - useRef, - useState } from 'react' + useCallback, + useEffect, + useImperativeHandle, + useLayoutEffect, + useMemo, + useRef, + useState } from 'react' import type { CSSProperties, ForwardedRef } from 'react' @@ -15,19 +15,19 @@ type NiconicoPlayerMessage = | { eventName: 'enterProgrammaticFullScreen' } | { eventName: 'exitProgrammaticFullScreen' } | { eventName: 'loadComplete' - playerId?: string - data: { videoInfo: NiconicoVideoInfo } } + playerId?: string + data: { videoInfo: NiconicoVideoInfo } } | { eventName: 'playerMetadataChange' - playerId?: string - data: NiconicoMetadata } + playerId?: string + data: NiconicoMetadata } | { eventName: 'playerStatusChange' | 'statusChange' - playerId?: string - data?: unknown } + playerId?: string + data?: unknown } | { eventName: 'error' - playerId?: string - data?: unknown - code?: string - message?: string } + playerId?: string + data?: unknown + code?: string + message?: string } type NiconicoCommand = | { eventName: 'play'; sourceConnectorType: 1; playerId: string } @@ -53,13 +53,13 @@ type Props = { export default forwardRef ((props: Props, ref: ForwardedRef) => { - const { id, width, height, style = { }, onLoadComplete, onMetadataChange, onError } = props + const { id, width, height, style = { }, onLoadComplete, onMetadataChange, onError } = props - const iframeRef = useRef (null) - const loadCompleteTimerRef = useRef | null> (null) - const playerId = useMemo ( - () => `nico-${ id }-${ Math.random ().toString (36).slice (2) }`, - [id]) + const iframeRef = useRef (null) + const loadCompleteTimerRef = useRef | null> (null) + const playerId = useMemo ( + () => `nico-${ id }-${ Math.random ().toString (36).slice (2) }`, + [id]) const [screenWidth, setScreenWidth] = useState () const [screenHeight, setScreenHeight] = useState () @@ -79,38 +79,38 @@ export default forwardRef ((props: Props, ref: ForwardedRef { - if (!(loadCompleteTimerRef.current)) - return + const clearLoadCompleteTimer = useCallback (() => { + if (!(loadCompleteTimerRef.current)) + return - clearTimeout (loadCompleteTimerRef.current) - loadCompleteTimerRef.current = null - }, []) + clearTimeout (loadCompleteTimerRef.current) + loadCompleteTimerRef.current = null + }, []) - const startLoadCompleteTimer = useCallback (() => { - clearLoadCompleteTimer () - loadCompleteTimerRef.current = setTimeout (() => { - onError?.({ - eventName: 'loadCompleteTimeout', - reason: 'niconico video length was not reported by embed', - }) - }, LOAD_COMPLETE_TIMEOUT_MS) - }, [clearLoadCompleteTimer, onError]) + const startLoadCompleteTimer = useCallback (() => { + clearLoadCompleteTimer () + loadCompleteTimerRef.current = setTimeout (() => { + onError?.({ + eventName: 'loadCompleteTimeout', + reason: 'niconico video length was not reported by embed', + }) + }, LOAD_COMPLETE_TIMEOUT_MS) + }, [clearLoadCompleteTimer, onError]) const postToPlayer = useCallback ((message: NiconicoCommand) => { const win = iframeRef.current?.contentWindow @@ -165,21 +165,21 @@ export default forwardRef ((props: Props, ref: ForwardedRef { const onMessage = (event: MessageEvent) => { if (!(iframeRef.current) - || (event.source !== iframeRef.current.contentWindow) - || (event.origin !== EMBED_ORIGIN)) - return + || (event.source !== iframeRef.current.contentWindow) + || (event.origin !== EMBED_ORIGIN)) + return const data = event.data if (!(data) || typeof data !== 'object' || !('eventName' in data)) - return + return if (('playerId' in data) && data.playerId && data.playerId !== playerId) - return + return if (data.eventName === 'enterProgrammaticFullScreen') { @@ -193,12 +193,12 @@ export default forwardRef ((props: Props, ref: ForwardedRef removeEventListener ('message', onMessage) - }, [clearLoadCompleteTimer, onError, onLoadComplete, onMetadataChange, playerId]) + return () => removeEventListener ('message', onMessage) + }, [clearLoadCompleteTimer, onError, onLoadComplete, onMetadataChange, playerId]) - useEffect (() => clearLoadCompleteTimer, [clearLoadCompleteTimer]) + useEffect (() => clearLoadCompleteTimer, [clearLoadCompleteTimer]) useLayoutEffect (() => { if (!(fullScreen)) @@ -232,7 +232,7 @@ export default forwardRef ((props: Props, ref: ForwardedRef { if (ended) - return + return const isLandscape = innerWidth >= innerHeight const windowWidth = `${ isLandscape ? innerWidth : innerHeight }px` @@ -246,9 +246,9 @@ export default forwardRef ((props: Props, ref: ForwardedRef { if (requestAnimationFrame) - requestAnimationFrame (pollingResize) + requestAnimationFrame (pollingResize) else - pollingResize () + pollingResize () } startPollingResize ()