export function PlayerControls(props: { playerRef: RefObject }) { const parentRef = useRef(null); const form = useFormContext(); const segments = form.watch('segments'); const fps = form.getValues('fps'); const rowVirtualizer = useVirtualizer({ count: segments.length, getScrollElement: () => parentRef.current, estimateSize: () => ITEM_SIZE, gap: 8 }); function handleVideoNavigation(start: number) { props.playerRef.current?.seekTo(start * fps); props.playerRef.current?.pause(); } function updateSegment(index: number, newSegment: z.input) { form.setValue('segments', form.getValues('segments').map((segment, i) => i === index ? newSegment : segment)); } function insertSegment(index: number, newSegment: z.input) { form.setValue('segments', [...form.getValues('segments').slice(0, index), newSegment, ...form.getValues('segments').slice(index)]); } function removeSegment(index: number) { form.setValue('segments', form.getValues('segments').filter((_, i) => index !== i)); } return ( Styling Captions Styling
{rowVirtualizer.getVirtualItems().map(virtualItem => (
handleVideoNavigation(segments[virtualItem.index].start)} >
{segments[virtualItem.index].start.toFixed(2)} - {segments[virtualItem.index].end.toFixed(2)} ( field.onChange(e.target.valueAsNumber)} /> )} /> ( field.onChange(e.target.valueAsNumber)} /> )} />
insertSegment(virtualItem.index, { start: segments[virtualItem.index].start, end: segments[virtualItem.index].start, value: [{ text: "" }] })} > Add Caption Before insertSegment(virtualItem.index + 1, { start: segments[virtualItem.index].end, end: segments[virtualItem.index].end, value: [{ text: "" }] })} > Add Caption After updateSegment(virtualItem.index, { ...segments[virtualItem.index], hidden: !segments[virtualItem.index].hidden })} > {segments[virtualItem.index].hidden ? : } {segments[virtualItem.index].hidden ? "Show Caption" : "Hide Caption"} removeSegment(virtualItem.index)} disabled={segments.length === 1} > {segments.length !== 1 && Delete}
))}
); }