'use client'; import type { StateAttrMap } from '@videojs/core'; import type { ForwardRefExoticComponent } from 'react'; import { forwardRef } from 'react'; import type { UIComponentProps } from '@/utils/types'; import type { renderElement as renderElementFn } from '../utils/use-render'; import { renderElement } from '../utils/use-render'; interface ContextPartConfig { displayName: string; tag: keyof React.JSX.IntrinsicElements; useContext: () => { state: State; stateAttrMap: StateAttrMap }; staticProps?: Partial; /** Derive props from state on each render (e.g. `id` from a state field). */ getProps?: (state: State) => Record; } export function createContextPart, State extends object>( config: ContextPartConfig ): ForwardRefExoticComponent { const { displayName, tag, useContext, staticProps, getProps } = config; const Component = forwardRef(function ContextPart(componentProps, forwardedRef) { const { render, className, style, ...elementProps } = componentProps; const context = useContext(); const dynamicProps = getProps?.(context.state); return renderElement(tag, { render, className, style } as renderElementFn.ComponentProps, { state: context.state, stateAttrMap: context.stateAttrMap, ref: forwardedRef, props: [staticProps, dynamicProps, elementProps].filter(Boolean), }); }); Component.displayName = displayName; return Component as ForwardRefExoticComponent; }