diff --git a/packages/html/html/src/components/media-play-button.ts b/packages/html/html/src/components/media-play-button.ts index c619a1e8..e8789e5f 100644 --- a/packages/html/html/src/components/media-play-button.ts +++ b/packages/html/html/src/components/media-play-button.ts @@ -4,6 +4,7 @@ import { PropsHook, } from '../utils/component-factory'; import { MediaChromeButton } from './media-chrome-button'; +import { playButtonStateDefinition } from './state-definitions/play-button'; export class PlayButtonBase extends MediaChromeButton { _state: @@ -44,17 +45,10 @@ export class PlayButtonBase extends MediaChromeButton { * Handles media store state subscription and transformation */ export const usePlayButtonState: StateHook<{ paused: boolean }> = { - keys: ['paused'], + keys: playButtonStateDefinition.keys, transform: (rawState, mediaStore) => ({ - paused: rawState.paused ?? true, - requestPlay() { - const type = 'playrequest'; - mediaStore.dispatch({ type }); - }, - requestPause() { - const type = 'pauserequest'; - mediaStore.dispatch({ type }); - }, + ...playButtonStateDefinition.stateTransform(rawState), + ...playButtonStateDefinition.createRequestMethods(mediaStore.dispatch), }), }; diff --git a/packages/react/react/src/components/PlayButton.tsx b/packages/react/react/src/components/PlayButton.tsx index e29155b5..6db29649 100644 --- a/packages/react/react/src/components/PlayButton.tsx +++ b/packages/react/react/src/components/PlayButton.tsx @@ -1,52 +1,25 @@ import { shallowEqual, - // useMediaDispatch, useMediaSelector, useMediaStore, } from '@vjs-10/react-media-store'; import * as React from 'react'; import { toConnectedComponent } from '../utils/component-factory'; - -/** - * PlayButton state hook - equivalent to React's usePlayButtonState - * Handles media store state subscription and transformation - */ -export const playButtonStateDef = { - keys: ['paused'], - stateTransform: (rawState: any) => ({ - paused: rawState.paused ?? true, - }), - /** @TODO Consider "promoting" this up to state-mediator defs + media store (CJP) */ - requestMethods: (mediaStore: ReturnType) => { - return { - requestPlay() { - const type = 'playrequest'; - mediaStore.dispatch({ type }); - }, - requestPause() { - const type = 'pauserequest'; - mediaStore.dispatch({ type }); - }, - }; - }, -} as const; +import { playButtonStateDefinition } from './state-definitions/play-button'; export const usePlayButtonState = (_props: any) => { const mediaStore = useMediaStore(); /** @TODO Fix type issues with hooks (CJP) */ const mediaState = useMediaSelector( - playButtonStateDef.stateTransform, + playButtonStateDefinition.stateTransform, shallowEqual, ); - const [methods, setMethods] = React.useState( - playButtonStateDef.requestMethods(mediaStore), + const methods = React.useMemo( + () => playButtonStateDefinition.createRequestMethods(mediaStore.dispatch), + [mediaStore], ); - React.useEffect(() => { - setMethods(playButtonStateDef.requestMethods(mediaStore)); - }, [mediaStore]); - return { paused: mediaState.paused, requestPlay: methods.requestPlay,