import { useState } from 'react';
import { TimecodeInput } from '#react/timecode-input';
import { fromSeconds, type RationalTime } from '@techsquidtv/canvas-timeline-utils';
type TimecodeFormatOptions,
type TimecodeParseOptions,
} from '@techsquidtv/canvas-timeline-utils/timecode';
{ value: 'seconds', label: 'Seconds', formatOptions: { format: 'seconds' } },
formatOptions: { format: 'frames', frameRate: 24 },
parseOptions: { frameRate: 24 },
formatOptions: TimecodeFormatOptions;
parseOptions?: TimecodeParseOptions;
const sequenceRate = 24000;
const initialSeconds = 3723.04;
function ClipStartInput({
onApply: (time: RationalTime) => void;
const [formatValue, setFormatValue] = useState('seconds');
const [text, setText] = useState(() =>
formatTimecode(initialSeconds, { format: 'seconds' })
formatOptions.find((option) => option.value === formatValue) ?? formatOptions[0];
const parsedSeconds = parseTimecode(text, selectedFormat.parseOptions);
function handleFormatChange(nextFormatValue: string) {
const nextFormat = formatOptions.find((option) => option.value === nextFormatValue);
const nextSeconds = parseTimecode(text, selectedFormat.parseOptions);
setFormatValue(nextFormat.value);
if (nextSeconds !== null) {
setText(formatTimecode(nextSeconds, nextFormat.formatOptions));
if (parsedSeconds !== null) {
onApply(fromSeconds(parsedSeconds, sequenceRate));
setText(formatTimecode(parsedSeconds, selectedFormat.formatOptions));
invalid={parsedSeconds === null}
aria-label="Timecode format"
onChange={(event) => handleFormatChange(event.currentTarget.value)}
{formatOptions.map((option) => (
<option key={option.value} value={option.value}>
: `${option.label} (${formatTimecode(parsedSeconds, {
<button disabled={parsedSeconds === null} type="submit">