@mieweb/ui 0.6.1-dev.168 → 0.6.1-dev.170
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brands/index.cjs +18 -18
- package/dist/brands/index.js +3 -3
- package/dist/chunk-3Q2VWPML.cjs +1802 -0
- package/dist/chunk-3Q2VWPML.cjs.map +1 -0
- package/dist/{chunk-67CEEDAP.cjs → chunk-3YRDZBW6.cjs} +7 -7
- package/dist/{chunk-67CEEDAP.cjs.map → chunk-3YRDZBW6.cjs.map} +1 -1
- package/dist/{chunk-UVQEHZRF.js → chunk-6VGXX6L6.js} +2 -2
- package/dist/{chunk-UVQEHZRF.js.map → chunk-6VGXX6L6.js.map} +1 -1
- package/dist/chunk-CH26CHPH.js +1776 -0
- package/dist/chunk-CH26CHPH.js.map +1 -0
- package/dist/{chunk-TXRQQMG5.js → chunk-CYMZ2QS5.js} +2 -2
- package/dist/{chunk-TXRQQMG5.js.map → chunk-CYMZ2QS5.js.map} +1 -1
- package/dist/chunk-FGP64Z24.js +131 -0
- package/dist/chunk-FGP64Z24.js.map +1 -0
- package/dist/chunk-FIWKHLWY.js +197 -0
- package/dist/chunk-FIWKHLWY.js.map +1 -0
- package/dist/chunk-GLXTVCHN.cjs +4 -0
- package/dist/chunk-GLXTVCHN.cjs.map +1 -0
- package/dist/chunk-J7KWQJOB.js +14 -0
- package/dist/chunk-J7KWQJOB.js.map +1 -0
- package/dist/{chunk-NINI4WVS.cjs → chunk-JC6Y3LGF.cjs} +297 -84
- package/dist/chunk-JC6Y3LGF.cjs.map +1 -0
- package/dist/chunk-JYZW2PZS.cjs +166 -0
- package/dist/chunk-JYZW2PZS.cjs.map +1 -0
- package/dist/chunk-LIH3IZYK.js +689 -0
- package/dist/chunk-LIH3IZYK.js.map +1 -0
- package/dist/{chunk-XVF472GT.js → chunk-NSLR3B7K.js} +2 -2
- package/dist/{chunk-XVF472GT.js.map → chunk-NSLR3B7K.js.map} +1 -1
- package/dist/chunk-NTYGCBCL.js +543 -0
- package/dist/chunk-NTYGCBCL.js.map +1 -0
- package/dist/chunk-RISZWWEQ.js +3 -0
- package/dist/chunk-RISZWWEQ.js.map +1 -0
- package/dist/chunk-S7JQ3FV5.cjs +16 -0
- package/dist/chunk-S7JQ3FV5.cjs.map +1 -0
- package/dist/{chunk-JWTCEWQ4.cjs → chunk-SNEQXSC5.cjs} +2 -2
- package/dist/{chunk-JWTCEWQ4.cjs.map → chunk-SNEQXSC5.cjs.map} +1 -1
- package/dist/chunk-SQHMGT4W.js +164 -0
- package/dist/chunk-SQHMGT4W.js.map +1 -0
- package/dist/chunk-UO3KEUYK.cjs +220 -0
- package/dist/chunk-UO3KEUYK.cjs.map +1 -0
- package/dist/{chunk-HUXOASEB.js → chunk-X763OLF2.js} +4 -4
- package/dist/{chunk-HUXOASEB.js.map → chunk-X763OLF2.js.map} +1 -1
- package/dist/{chunk-DKGUOMBC.cjs → chunk-X7J45FU5.cjs} +2 -2
- package/dist/{chunk-DKGUOMBC.cjs.map → chunk-X7J45FU5.cjs.map} +1 -1
- package/dist/chunk-Y4ESBDQ5.cjs +552 -0
- package/dist/chunk-Y4ESBDQ5.cjs.map +1 -0
- package/dist/{chunk-MJ7YITLN.cjs → chunk-Y65SK5Y2.cjs} +2 -2
- package/dist/{chunk-MJ7YITLN.cjs.map → chunk-Y65SK5Y2.cjs.map} +1 -1
- package/dist/chunk-YD23ZGRU.cjs +155 -0
- package/dist/chunk-YD23ZGRU.cjs.map +1 -0
- package/dist/components/DateInput/index.cjs +2 -2
- package/dist/components/DateInput/index.d.cts +8 -2
- package/dist/components/DateInput/index.d.ts +8 -2
- package/dist/components/DateInput/index.js +1 -1
- package/dist/components/Markdown/index.cjs +10 -10
- package/dist/components/Markdown/index.js +2 -2
- package/dist/components/MediaEditor/index.cjs +42 -0
- package/dist/components/MediaEditor/index.cjs.map +1 -0
- package/dist/components/MediaEditor/index.d.cts +151 -0
- package/dist/components/MediaEditor/index.d.ts +151 -0
- package/dist/components/MediaEditor/index.js +17 -0
- package/dist/components/MediaEditor/index.js.map +1 -0
- package/dist/components/MediaPlayer/index.cjs +24 -0
- package/dist/components/MediaPlayer/index.cjs.map +1 -0
- package/dist/components/MediaPlayer/index.d.cts +71 -0
- package/dist/components/MediaPlayer/index.d.ts +71 -0
- package/dist/components/MediaPlayer/index.js +7 -0
- package/dist/components/MediaPlayer/index.js.map +1 -0
- package/dist/components/TranscriptView/index.cjs +21 -0
- package/dist/components/TranscriptView/index.cjs.map +1 -0
- package/dist/components/TranscriptView/index.d.cts +55 -0
- package/dist/components/TranscriptView/index.d.ts +55 -0
- package/dist/components/TranscriptView/index.js +4 -0
- package/dist/components/TranscriptView/index.js.map +1 -0
- package/dist/esheet.cjs +6 -6
- package/dist/esheet.js +3 -3
- package/dist/hooks/index.cjs +49 -11
- package/dist/hooks/index.d.cts +88 -1
- package/dist/hooks/index.d.ts +88 -1
- package/dist/hooks/index.js +3 -1
- package/dist/index.cjs +380 -253
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -2
- package/dist/index.d.ts +7 -2
- package/dist/index.js +89 -42
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/transcript-oaWqY3yr.d.cts +81 -0
- package/dist/transcript-oaWqY3yr.d.ts +81 -0
- package/dist/useTranscriptEdits-BUylQFg0.d.cts +168 -0
- package/dist/useTranscriptEdits-CWYnjbGP.d.ts +168 -0
- package/package.json +1 -1
- package/dist/chunk-HYEJLKXI.js +0 -476
- package/dist/chunk-HYEJLKXI.js.map +0 -1
- package/dist/chunk-NINI4WVS.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/DateInput/DateInput.tsx"],"names":["year","month","day","isValidDate","isDateInPast","calculateAge","isDateInFuture","React","formatDateValue","jsxs","cn","jsx","Fragment","Input","Calendar","createPortal"],"mappings":"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","file":"chunk-JC6Y3LGF.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '../../utils/cn';\nimport {\n formatDateValue,\n isValidDate,\n isDateInPast,\n isDateInFuture,\n calculateAge,\n} from '../../utils/date';\nimport { Input, type InputProps } from '../Input';\nimport { Calendar } from 'lucide-react';\n\nexport type DateInputMode =\n | 'default'\n | 'dob'\n | 'expiration'\n | 'past'\n | 'future';\n\nexport type DateInputType = 'date' | 'datetime-local' | 'month' | 'year';\n\nexport type DateInputWidth = 'full' | 'fit' | 'fixed';\n\nexport type DateInputTimeFormat = '12-hour' | '24-hour';\n\nconst widthClasses: Record<DateInputWidth, string> = {\n full: 'w-full',\n fit: 'w-fit',\n fixed: 'w-44', // ~176px - enough for MM/DD/YYYY + calendar icon\n};\n\nconst sizeClasses = {\n sm: 'h-8 text-sm',\n md: 'h-10 text-base',\n lg: 'h-12 text-lg',\n} as const;\n\nconst MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\ninterface PickerDate {\n month: number;\n year: number;\n day: number | null;\n}\n\nfunction isValidPickerDate(year: number, month: number, day: number): boolean {\n return (\n Number.isFinite(year) &&\n month >= 1 &&\n month <= 12 &&\n day >= 1 &&\n day <= new Date(year, month, 0).getDate()\n );\n}\n\nfunction parsePickerDate(\n value: string,\n inputType: DateInputType\n): PickerDate | undefined {\n if (inputType === 'datetime-local') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T\\d{2}:\\d{2}$/.exec(value);\n if (!match) return undefined;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n const [hour, minute] = value.slice(-5).split(':').map(Number);\n if (!isValidPickerDate(year, month, day) || hour > 23 || minute > 59) {\n return undefined;\n }\n return {\n year,\n month: month - 1,\n day,\n };\n }\n\n if (inputType === 'month') {\n const match = /^(\\d{4})-(\\d{2})$/.exec(value);\n if (!match) return undefined;\n const year = Number(match[1]);\n const month = Number(match[2]);\n if (!Number.isFinite(year) || month < 1 || month > 12) return undefined;\n return { year, month: month - 1, day: null };\n }\n\n if (!isValidDate(value)) return undefined;\n const [month, day, year] = value.split('/').map(Number);\n return { month: month - 1, year, day };\n}\n\nfunction formatPickerValue(\n value: string,\n inputType: DateInputType,\n timeFormat: DateInputTimeFormat\n): string {\n if (inputType === 'datetime-local') {\n const match = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}:\\d{2})$/.exec(value);\n if (!match) return '';\n if (timeFormat === '12-hour') {\n const [hour, minute] = match[4].split(':').map(Number);\n const displayHour = hour % 12 || 12;\n const meridiem = hour >= 12 ? 'PM' : 'AM';\n return `${match[2]}/${match[3]}/${match[1]} ${displayHour}:${String(minute).padStart(2, '0')} ${meridiem}`;\n }\n return `${match[2]}/${match[3]}/${match[1]} ${match[4]}`;\n }\n\n if (inputType === 'month') {\n const date = parsePickerDate(value, inputType);\n return date ? `${MONTH_NAMES[date.month]} ${date.year}` : '';\n }\n\n return value;\n}\n\nexport interface DateInputProps extends Omit<\n InputProps,\n 'type' | 'onChange' | 'value'\n> {\n /** The value for the selected input type. Dates use MM/DD/YYYY format. */\n value?: string;\n /** Callback fired when the value changes */\n onChange?: (value: string) => void;\n /** Date value format and picker control. */\n inputType?: DateInputType;\n /** Time picker display format for datetime values. */\n timeFormat?: DateInputTimeFormat;\n /** Validation mode for the date input */\n mode?: DateInputMode;\n /** Minimum age for DOB validation (default: 0) */\n minAge?: number;\n /** Maximum age for DOB validation */\n maxAge?: number;\n /** Whether to validate on blur */\n validateOnBlur?: boolean;\n /** Whether to show a calendar picker button */\n showCalendar?: boolean;\n /** Width behavior of the input */\n width?: DateInputWidth;\n}\n\nfunction getValidationError(\n value: string,\n mode: DateInputMode,\n minAge?: number,\n maxAge?: number\n): string | undefined {\n if (!value || value.replace(/\\D/g, '').length === 0) {\n return undefined;\n }\n\n if (!isValidDate(value)) {\n return 'Please enter a valid date (MM/DD/YYYY)';\n }\n\n switch (mode) {\n case 'dob': {\n if (!isDateInPast(value)) {\n return 'Date of birth must be in the past';\n }\n const age = calculateAge(value);\n if (age !== null) {\n if (minAge !== undefined && age < minAge) {\n return `Must be at least ${minAge} years old`;\n }\n if (maxAge !== undefined && age > maxAge) {\n return `Must be no more than ${maxAge} years old`;\n }\n }\n break;\n }\n case 'expiration':\n if (!isDateInFuture(value)) {\n return 'Expiration date must be in the future';\n }\n break;\n case 'past':\n if (!isDateInPast(value)) {\n return 'Date must be in the past';\n }\n break;\n case 'future':\n if (!isDateInFuture(value)) {\n return 'Date must be in the future';\n }\n break;\n }\n\n return undefined;\n}\n\n/**\n * A date input that automatically formats to MM/DD/YYYY with validation modes.\n *\n * @example\n * ```tsx\n * // Date of birth with age validation\n * <DateInput\n * label=\"Date of Birth\"\n * mode=\"dob\"\n * minAge={18}\n * validateOnBlur\n * />\n *\n * // With calendar picker\n * <DateInput\n * label=\"Select Date\"\n * showCalendar\n * />\n *\n * // Expiration date\n * <DateInput\n * label=\"License Expiration\"\n * mode=\"expiration\"\n * validateOnBlur\n * />\n * ```\n */\nconst DateInput = React.forwardRef<HTMLInputElement, DateInputProps>(\n (\n {\n value = '',\n onChange,\n inputType = 'date',\n timeFormat = '24-hour',\n mode = 'default',\n minAge,\n maxAge,\n validateOnBlur,\n showCalendar = false,\n width = 'full',\n className,\n onBlur,\n onClick,\n hasError,\n error,\n ...props\n },\n ref\n ) => {\n const isFormattedDate = inputType === 'date';\n const [displayValue, setDisplayValue] = React.useState(() =>\n isFormattedDate ? formatDateValue(value) : value\n );\n const [localError, setLocalError] = React.useState<string | undefined>();\n\n // Sync external value changes\n React.useEffect(() => {\n setDisplayValue(isFormattedDate ? formatDateValue(value) : value);\n }, [isFormattedDate, value]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const formatted = formatDateValue(e.target.value);\n setDisplayValue(formatted);\n onChange?.(formatted);\n\n // Clear error when user starts typing again\n if (localError) {\n setLocalError(undefined);\n }\n };\n\n const handleBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n onBlur?.(e);\n\n if (validateOnBlur) {\n const validationError = getValidationError(\n displayValue,\n mode,\n minAge,\n maxAge\n );\n setLocalError(validationError);\n }\n };\n\n const placeholder = mode === 'expiration' ? 'MM/DD/YYYY' : 'MM/DD/YYYY';\n const autoComplete =\n mode === 'dob' ? 'bday' : mode === 'expiration' ? 'cc-exp' : undefined;\n\n // Generate stable ID for accessibility\n const generatedId = React.useId();\n\n // Calendar picker state\n const [isCalendarOpen, setIsCalendarOpen] = React.useState(false);\n const calendarRef = React.useRef<HTMLDivElement>(null);\n const buttonRef = React.useRef<HTMLButtonElement>(null);\n const [calendarStyle, setCalendarStyle] =\n React.useState<React.CSSProperties>();\n\n const updateCalendarPosition = React.useCallback(() => {\n if (!buttonRef.current) return;\n\n const rect = buttonRef.current.getBoundingClientRect();\n setCalendarStyle({\n position: 'fixed',\n top: rect.bottom + 4,\n left: Math.max(8, rect.right - 288),\n zIndex: 9999,\n });\n }, []);\n\n React.useEffect(() => {\n if (!isCalendarOpen) return;\n\n updateCalendarPosition();\n window.addEventListener('scroll', updateCalendarPosition, true);\n window.addEventListener('resize', updateCalendarPosition);\n return () => {\n window.removeEventListener('scroll', updateCalendarPosition, true);\n window.removeEventListener('resize', updateCalendarPosition);\n };\n }, [isCalendarOpen, updateCalendarPosition]);\n\n // Parse current value into date parts for calendar\n const parsedDate = React.useMemo(() => {\n const fallback = new Date();\n return (\n parsePickerDate(displayValue, inputType) ?? {\n month: fallback.getMonth(),\n year: fallback.getFullYear(),\n day: null,\n }\n );\n }, [displayValue, inputType]);\n\n const [calendarMonth, setCalendarMonth] = React.useState(parsedDate.month);\n const [calendarYear, setCalendarYear] = React.useState(parsedDate.year);\n const [selectedTime, setSelectedTime] = React.useState(() =>\n inputType === 'datetime-local' &&\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(value)\n ? value.slice(-5)\n : '00:00'\n );\n\n // Update calendar view when value changes\n React.useEffect(() => {\n const date = parsePickerDate(displayValue, inputType);\n if (!date) return;\n setCalendarMonth(date.month);\n setCalendarYear(date.year);\n if (inputType === 'datetime-local') {\n setSelectedTime(displayValue.slice(-5));\n }\n }, [displayValue, inputType]);\n\n // Close calendar on click outside\n React.useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n calendarRef.current &&\n !calendarRef.current.contains(event.target as HTMLElement) &&\n buttonRef.current &&\n !buttonRef.current.contains(event.target as HTMLElement)\n ) {\n setIsCalendarOpen(false);\n }\n };\n\n if (isCalendarOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () =>\n document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isCalendarOpen]);\n\n // Close on Escape key\n React.useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsCalendarOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n if (isCalendarOpen) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isCalendarOpen]);\n\n const handleDateSelect = (day: number) => {\n const month = String(calendarMonth + 1).padStart(2, '0');\n const dayStr = String(day).padStart(2, '0');\n const year = String(calendarYear);\n const formatted =\n inputType === 'datetime-local'\n ? `${year}-${month}-${dayStr}T${selectedTime}`\n : `${month}/${dayStr}/${year}`;\n setDisplayValue(formatted);\n onChange?.(formatted);\n if (inputType === 'date') {\n setIsCalendarOpen(false);\n }\n\n // Validate if needed\n if (inputType === 'date' && validateOnBlur) {\n const validationError = getValidationError(\n formatted,\n mode,\n minAge,\n maxAge\n );\n setLocalError(validationError);\n }\n };\n\n const handleMonthSelect = (month: number) => {\n const formatted = `${calendarYear}-${String(month + 1).padStart(2, '0')}`;\n setDisplayValue(formatted);\n onChange?.(formatted);\n setIsCalendarOpen(false);\n };\n\n const handleTimeChange = (part: 'hour' | 'minute', nextValue: string) => {\n const [hour, minute] = selectedTime.split(':');\n const nextTime =\n part === 'hour' ? `${nextValue}:${minute}` : `${hour}:${nextValue}`;\n setSelectedTime(nextTime);\n\n if (parsedDate.day === null) return;\n const month = String(parsedDate.month + 1).padStart(2, '0');\n const day = String(parsedDate.day).padStart(2, '0');\n const formatted = `${parsedDate.year}-${month}-${day}T${nextTime}`;\n setDisplayValue(formatted);\n onChange?.(formatted);\n };\n\n const handleMeridiemChange = (meridiem: 'AM' | 'PM') => {\n const [hour] = selectedTime.split(':').map(Number);\n const nextHour = (hour % 12) + (meridiem === 'PM' ? 12 : 0);\n handleTimeChange('hour', String(nextHour).padStart(2, '0'));\n };\n\n const getDaysInMonth = (month: number, year: number) => {\n return new Date(year, month + 1, 0).getDate();\n };\n\n const getFirstDayOfMonth = (month: number, year: number) => {\n return new Date(year, month, 1).getDay();\n };\n\n const renderCalendar = () => {\n const daysInMonth = getDaysInMonth(calendarMonth, calendarYear);\n const firstDay = getFirstDayOfMonth(calendarMonth, calendarYear);\n const days: (number | null)[] = [];\n\n // Add empty cells for days before the first day of the month\n for (let i = 0; i < firstDay; i++) {\n days.push(null);\n }\n\n // Add the days of the month\n for (let i = 1; i <= daysInMonth; i++) {\n days.push(i);\n }\n\n const isSelectedDay = (day: number) => {\n return (\n parsedDate.day === day &&\n parsedDate.month === calendarMonth &&\n parsedDate.year === calendarYear\n );\n };\n\n const isToday = (day: number) => {\n const today = new Date();\n return (\n day === today.getDate() &&\n calendarMonth === today.getMonth() &&\n calendarYear === today.getFullYear()\n );\n };\n\n return (\n <div\n ref={calendarRef}\n className={cn(\n 'bg-background border-border rounded-lg border shadow-lg',\n 'w-72 p-3'\n )}\n style={calendarStyle}\n role=\"dialog\"\n aria-label={\n inputType === 'month'\n ? 'Choose month'\n : inputType === 'datetime-local'\n ? 'Choose date and time'\n : 'Choose date'\n }\n >\n {/* Header with month/year navigation */}\n <div className=\"mb-3 flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => {\n if (inputType === 'month') {\n setCalendarYear(calendarYear - 1);\n } else if (calendarMonth === 0) {\n setCalendarMonth(11);\n setCalendarYear(calendarYear - 1);\n } else {\n setCalendarMonth(calendarMonth - 1);\n }\n }}\n className=\"hover:bg-muted rounded-md p-1 transition-colors\"\n aria-label={\n inputType === 'month' ? 'Previous year' : 'Previous month'\n }\n >\n <ChevronLeftIcon />\n </button>\n <div className=\"flex items-center gap-2\">\n {inputType !== 'month' && (\n <select\n value={calendarMonth}\n onChange={(e) => setCalendarMonth(Number(e.target.value))}\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select month\"\n >\n {MONTH_NAMES.map((name, i) => (\n <option key={name} value={i}>\n {name}\n </option>\n ))}\n </select>\n )}\n <select\n value={calendarYear}\n onChange={(e) => setCalendarYear(Number(e.target.value))}\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select year\"\n >\n {Array.from(\n { length: 150 },\n (_, i) => new Date().getFullYear() - 100 + i\n ).map((year) => (\n <option key={year} value={year}>\n {year}\n </option>\n ))}\n </select>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n if (inputType === 'month') {\n setCalendarYear(calendarYear + 1);\n } else if (calendarMonth === 11) {\n setCalendarMonth(0);\n setCalendarYear(calendarYear + 1);\n } else {\n setCalendarMonth(calendarMonth + 1);\n }\n }}\n className=\"hover:bg-muted rounded-md p-1 transition-colors\"\n aria-label={inputType === 'month' ? 'Next year' : 'Next month'}\n >\n <ChevronRightIcon />\n </button>\n </div>\n\n {inputType === 'month' ? (\n <div className=\"grid grid-cols-3 gap-1\">\n {MONTH_NAMES.map((name, month) => (\n <button\n key={name}\n type=\"button\"\n onClick={() => handleMonthSelect(month)}\n className={cn(\n 'rounded-md px-2 py-2 text-sm transition-colors',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n 'hover:bg-muted',\n parsedDate.month === month &&\n parsedDate.year === calendarYear &&\n 'bg-primary-800 hover:bg-primary-900 text-white'\n )}\n >\n {name.slice(0, 3)}\n </button>\n ))}\n </div>\n ) : (\n <>\n <div className=\"mb-1 grid grid-cols-7 gap-1\">\n {['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'].map((day) => (\n <div\n key={day}\n className=\"text-muted-foreground py-1 text-center text-xs font-medium\"\n >\n {day}\n </div>\n ))}\n </div>\n <div className=\"grid grid-cols-7 gap-1\">\n {days.map((day, index) => (\n <button\n key={index}\n type=\"button\"\n disabled={day === null}\n onClick={() => day && handleDateSelect(day)}\n className={cn(\n 'h-8 w-8 rounded-md text-sm transition-colors',\n 'focus:ring-ring focus:ring-2 focus:outline-none',\n day === null && 'invisible',\n day !== null && 'hover:bg-muted',\n isSelectedDay(day!) &&\n 'bg-primary-800 hover:bg-primary-900 text-white',\n isToday(day!) &&\n !isSelectedDay(day!) &&\n 'border-primary-800 text-primary-800 border'\n )}\n >\n {day}\n </button>\n ))}\n </div>\n </>\n )}\n\n {inputType === 'datetime-local' && (\n <div className=\"border-border mt-3 flex items-center gap-2 border-t pt-3\">\n <select\n value={\n timeFormat === '12-hour'\n ? String(\n Number(selectedTime.slice(0, 2)) % 12 || 12\n ).padStart(2, '0')\n : selectedTime.slice(0, 2)\n }\n onChange={(event) => {\n const hour = Number(event.target.value);\n const isPm = Number(selectedTime.slice(0, 2)) >= 12;\n handleTimeChange(\n 'hour',\n String(\n timeFormat === '12-hour'\n ? (hour % 12) + (isPm ? 12 : 0)\n : hour\n ).padStart(2, '0')\n );\n }}\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select hour\"\n >\n {Array.from(\n { length: timeFormat === '12-hour' ? 12 : 24 },\n (_, index) => (timeFormat === '12-hour' ? index + 1 : index)\n ).map((hour) => (\n <option key={hour} value={String(hour).padStart(2, '0')}>\n {String(hour).padStart(2, '0')}\n </option>\n ))}\n </select>\n <span aria-hidden=\"true\">:</span>\n <select\n value={selectedTime.slice(3)}\n onChange={(event) =>\n handleTimeChange('minute', event.target.value)\n }\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select minute\"\n >\n {Array.from({ length: 60 }, (_, minute) => (\n <option key={minute} value={String(minute).padStart(2, '0')}>\n {String(minute).padStart(2, '0')}\n </option>\n ))}\n </select>\n {timeFormat === '12-hour' && (\n <select\n value={Number(selectedTime.slice(0, 2)) >= 12 ? 'PM' : 'AM'}\n onChange={(event) =>\n handleMeridiemChange(event.target.value as 'AM' | 'PM')\n }\n className=\"bg-background border-border rounded border px-2 py-1 text-sm\"\n aria-label=\"Select AM or PM\"\n >\n <option value=\"AM\">AM</option>\n <option value=\"PM\">PM</option>\n </select>\n )}\n </div>\n )}\n\n <div className=\"border-border mt-3 flex gap-2 border-t pt-3\">\n <button\n type=\"button\"\n onClick={() => {\n const today = new Date();\n setCalendarMonth(today.getMonth());\n setCalendarYear(today.getFullYear());\n if (inputType === 'month') {\n handleMonthSelect(today.getMonth());\n } else {\n handleDateSelect(today.getDate());\n }\n }}\n className=\"text-primary-800 flex-1 text-sm hover:underline\"\n >\n Today\n </button>\n {inputType === 'datetime-local' && (\n <button\n type=\"button\"\n onClick={() => setIsCalendarOpen(false)}\n className=\"text-primary-800 flex-1 text-sm hover:underline\"\n >\n Done\n </button>\n )}\n </div>\n </div>\n );\n };\n\n if (inputType === 'year') {\n return (\n <Input\n ref={ref}\n type={inputType === 'year' ? 'text' : inputType}\n inputMode={inputType === 'year' ? 'numeric' : undefined}\n pattern={inputType === 'year' ? '[0-9]{4}' : undefined}\n maxLength={inputType === 'year' ? 4 : undefined}\n placeholder={inputType === 'year' ? 'YYYY' : undefined}\n value={value.replace(/\\D/g, '').slice(0, 4)}\n onChange={(event) =>\n onChange?.(event.target.value.replace(/\\D/g, '').slice(0, 4))\n }\n onBlur={onBlur}\n onClick={onClick}\n hasError={hasError}\n error={error}\n className={cn(widthClasses[width], className)}\n {...props}\n />\n );\n }\n\n if (showCalendar || inputType !== 'date') {\n // Extract label/error/helper and component-specific props to handle positioning correctly\n // Filter out Input component props that aren't valid HTML input attributes\n const { label, helperText, hideLabel, required, size, ...inputProps } =\n props;\n // Ensure size has a valid value (fallback to 'md' if null/undefined)\n const resolvedSize = size ?? 'md';\n const inputId = inputProps.id || generatedId;\n const errorId = `${inputId}-error`;\n const helperId = `${inputId}-helper`;\n const showError = hasError || !!localError;\n const errorMessage = error || localError;\n\n return (\n <div className={cn('flex flex-col gap-1.5', widthClasses[width])}>\n {label && (\n <label\n htmlFor={inputId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {required && (\n <span\n className=\"ml-1\"\n style={{ color: '#ef4444' }}\n aria-hidden=\"true\"\n >\n *\n </span>\n )}\n </label>\n )}\n <div className=\"relative\">\n <input\n ref={ref}\n id={inputId}\n type=\"text\"\n inputMode={inputType === 'date' ? 'numeric' : undefined}\n autoComplete={autoComplete}\n placeholder={\n inputType === 'month'\n ? 'Select month'\n : inputType === 'datetime-local'\n ? 'Select date and time'\n : placeholder\n }\n value={formatPickerValue(displayValue, inputType, timeFormat)}\n onChange={handleChange}\n onBlur={inputType === 'date' ? handleBlur : onBlur}\n onClick={(event) => {\n onClick?.(event);\n setIsCalendarOpen(true);\n }}\n readOnly={!isFormattedDate}\n aria-invalid={showError}\n aria-describedby={\n [errorMessage ? errorId : null, helperText ? helperId : null]\n .filter(Boolean)\n .join(' ') || undefined\n }\n className={cn(\n 'w-full px-3 py-2',\n 'rounded-lg border',\n 'bg-background text-foreground',\n 'placeholder:text-muted-foreground',\n 'transition-colors duration-200',\n 'focus:ring-ring focus:border-transparent focus:ring-2 focus:outline-none',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n sizeClasses[resolvedSize],\n showError\n ? 'border-destructive focus:ring-destructive'\n : 'border-input',\n 'pr-10',\n className\n )}\n {...inputProps}\n />\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={() => setIsCalendarOpen(!isCalendarOpen)}\n className={cn(\n 'absolute top-1/2 right-3 -translate-y-1/2',\n 'text-muted-foreground hover:text-foreground',\n 'focus:text-foreground focus:outline-none',\n 'transition-colors'\n )}\n aria-label=\"Open calendar\"\n aria-expanded={isCalendarOpen}\n aria-haspopup=\"dialog\"\n >\n <Calendar size={18} />\n </button>\n </div>\n {isCalendarOpen && createPortal(renderCalendar(), document.body)}\n {errorMessage && (\n <p\n id={errorId}\n className=\"text-sm\"\n style={{ color: '#ef4444' }}\n role=\"alert\"\n >\n {errorMessage}\n </p>\n )}\n {helperText && !errorMessage && (\n <p id={helperId} className=\"text-muted-foreground text-sm\">\n {helperText}\n </p>\n )}\n </div>\n );\n }\n\n return (\n <Input\n ref={ref}\n type=\"text\"\n inputMode=\"numeric\"\n autoComplete={autoComplete}\n placeholder={placeholder}\n value={displayValue}\n onChange={handleChange}\n onBlur={handleBlur}\n hasError={hasError || !!localError}\n error={error || localError}\n className={cn(widthClasses[width], className)}\n {...props}\n />\n );\n }\n);\n\nDateInput.displayName = 'DateInput';\n\n// Simple icon components\nfunction ChevronLeftIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\nfunction ChevronRightIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nexport { DateInput };\n"]}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
|
|
5
|
+
// src/hooks/useMediaTransport.ts
|
|
6
|
+
var toMs = (seconds) => Number.isFinite(seconds) ? seconds * 1e3 : 0;
|
|
7
|
+
function useMediaTransport(options = {}) {
|
|
8
|
+
const {
|
|
9
|
+
onTimeUpdate,
|
|
10
|
+
onStateChange,
|
|
11
|
+
onEnded,
|
|
12
|
+
onError,
|
|
13
|
+
initialRate = 1,
|
|
14
|
+
endedState = "paused",
|
|
15
|
+
resetTimeOnEnd = false,
|
|
16
|
+
errorLabel = "media"
|
|
17
|
+
} = options;
|
|
18
|
+
const [element, setElementState] = react.useState(null);
|
|
19
|
+
const [state, setStateRaw] = react.useState("idle");
|
|
20
|
+
const [currentTimeMs, setCurrentTimeMs] = react.useState(0);
|
|
21
|
+
const [durationMs, setDurationMs] = react.useState(0);
|
|
22
|
+
const [playbackRate, setPlaybackRateState] = react.useState(initialRate);
|
|
23
|
+
const elementRef = react.useRef(null);
|
|
24
|
+
const handlers = react.useRef({
|
|
25
|
+
onTimeUpdate,
|
|
26
|
+
onStateChange,
|
|
27
|
+
onEnded,
|
|
28
|
+
onError,
|
|
29
|
+
endedState,
|
|
30
|
+
resetTimeOnEnd,
|
|
31
|
+
errorLabel
|
|
32
|
+
});
|
|
33
|
+
handlers.current = {
|
|
34
|
+
onTimeUpdate,
|
|
35
|
+
onStateChange,
|
|
36
|
+
onEnded,
|
|
37
|
+
onError,
|
|
38
|
+
endedState,
|
|
39
|
+
resetTimeOnEnd,
|
|
40
|
+
errorLabel
|
|
41
|
+
};
|
|
42
|
+
const setState = react.useCallback((next) => {
|
|
43
|
+
setStateRaw((prev) => {
|
|
44
|
+
if (prev === next) return prev;
|
|
45
|
+
handlers.current.onStateChange?.(next);
|
|
46
|
+
return next;
|
|
47
|
+
});
|
|
48
|
+
}, []);
|
|
49
|
+
const setMediaElement = react.useCallback((el) => {
|
|
50
|
+
elementRef.current = el;
|
|
51
|
+
setElementState(el);
|
|
52
|
+
}, []);
|
|
53
|
+
react.useEffect(() => {
|
|
54
|
+
if (!element) return;
|
|
55
|
+
const emitTime = () => {
|
|
56
|
+
const ms = toMs(element.currentTime);
|
|
57
|
+
const dur = toMs(element.duration);
|
|
58
|
+
setCurrentTimeMs(ms);
|
|
59
|
+
handlers.current.onTimeUpdate?.(ms, dur);
|
|
60
|
+
};
|
|
61
|
+
const onLoadStart = () => setState("loading");
|
|
62
|
+
const onCanPlay = () => setState("idle");
|
|
63
|
+
const onLoadedMetadata = () => {
|
|
64
|
+
setDurationMs(toMs(element.duration));
|
|
65
|
+
emitTime();
|
|
66
|
+
};
|
|
67
|
+
const onTimeUpdateEvt = () => emitTime();
|
|
68
|
+
const onPlay = () => setState("playing");
|
|
69
|
+
const onPlaying = () => setState("playing");
|
|
70
|
+
const onPause = () => setState("paused");
|
|
71
|
+
const onEndedEvt = () => {
|
|
72
|
+
setState(handlers.current.endedState);
|
|
73
|
+
if (handlers.current.resetTimeOnEnd) {
|
|
74
|
+
element.currentTime = 0;
|
|
75
|
+
setCurrentTimeMs(0);
|
|
76
|
+
}
|
|
77
|
+
handlers.current.onEnded?.();
|
|
78
|
+
};
|
|
79
|
+
const onErrorEvt = () => {
|
|
80
|
+
setState("error");
|
|
81
|
+
handlers.current.onError?.(
|
|
82
|
+
new Error(`Failed to load ${handlers.current.errorLabel}`)
|
|
83
|
+
);
|
|
84
|
+
};
|
|
85
|
+
element.addEventListener("loadstart", onLoadStart);
|
|
86
|
+
element.addEventListener("canplay", onCanPlay);
|
|
87
|
+
element.addEventListener("loadedmetadata", onLoadedMetadata);
|
|
88
|
+
element.addEventListener("timeupdate", onTimeUpdateEvt);
|
|
89
|
+
element.addEventListener("play", onPlay);
|
|
90
|
+
element.addEventListener("playing", onPlaying);
|
|
91
|
+
element.addEventListener("pause", onPause);
|
|
92
|
+
element.addEventListener("ended", onEndedEvt);
|
|
93
|
+
element.addEventListener("error", onErrorEvt);
|
|
94
|
+
if (Number.isFinite(element.duration)) {
|
|
95
|
+
setDurationMs(toMs(element.duration));
|
|
96
|
+
}
|
|
97
|
+
return () => {
|
|
98
|
+
element.removeEventListener("loadstart", onLoadStart);
|
|
99
|
+
element.removeEventListener("canplay", onCanPlay);
|
|
100
|
+
element.removeEventListener("loadedmetadata", onLoadedMetadata);
|
|
101
|
+
element.removeEventListener("timeupdate", onTimeUpdateEvt);
|
|
102
|
+
element.removeEventListener("play", onPlay);
|
|
103
|
+
element.removeEventListener("playing", onPlaying);
|
|
104
|
+
element.removeEventListener("pause", onPause);
|
|
105
|
+
element.removeEventListener("ended", onEndedEvt);
|
|
106
|
+
element.removeEventListener("error", onErrorEvt);
|
|
107
|
+
};
|
|
108
|
+
}, [element, setState]);
|
|
109
|
+
react.useEffect(() => {
|
|
110
|
+
if (element) element.playbackRate = playbackRate;
|
|
111
|
+
}, [element, playbackRate]);
|
|
112
|
+
const play = react.useCallback(() => {
|
|
113
|
+
void elementRef.current?.play();
|
|
114
|
+
}, []);
|
|
115
|
+
const pause = react.useCallback(() => {
|
|
116
|
+
elementRef.current?.pause();
|
|
117
|
+
}, []);
|
|
118
|
+
const togglePlay = react.useCallback(() => {
|
|
119
|
+
const el = elementRef.current;
|
|
120
|
+
if (!el) return;
|
|
121
|
+
if (el.paused) void el.play();
|
|
122
|
+
else el.pause();
|
|
123
|
+
}, []);
|
|
124
|
+
const seekToMs = react.useCallback((timeMs) => {
|
|
125
|
+
const el = elementRef.current;
|
|
126
|
+
if (el) {
|
|
127
|
+
el.currentTime = timeMs / 1e3;
|
|
128
|
+
setCurrentTimeMs(timeMs);
|
|
129
|
+
}
|
|
130
|
+
}, []);
|
|
131
|
+
const setPlaybackRate = react.useCallback((rate) => {
|
|
132
|
+
setPlaybackRateState(rate);
|
|
133
|
+
if (elementRef.current) elementRef.current.playbackRate = rate;
|
|
134
|
+
}, []);
|
|
135
|
+
const getCurrentTimeMs = react.useCallback(
|
|
136
|
+
() => toMs(elementRef.current?.currentTime ?? 0),
|
|
137
|
+
[]
|
|
138
|
+
);
|
|
139
|
+
const getDurationMs = react.useCallback(
|
|
140
|
+
() => toMs(elementRef.current?.duration ?? 0),
|
|
141
|
+
[]
|
|
142
|
+
);
|
|
143
|
+
const isPaused = react.useCallback(() => elementRef.current?.paused ?? true, []);
|
|
144
|
+
return {
|
|
145
|
+
setMediaElement,
|
|
146
|
+
mediaElement: element,
|
|
147
|
+
state,
|
|
148
|
+
currentTimeMs,
|
|
149
|
+
durationMs,
|
|
150
|
+
playbackRate,
|
|
151
|
+
isPlaying: state === "playing",
|
|
152
|
+
isLoading: state === "loading",
|
|
153
|
+
play,
|
|
154
|
+
pause,
|
|
155
|
+
togglePlay,
|
|
156
|
+
seekToMs,
|
|
157
|
+
setPlaybackRate,
|
|
158
|
+
getCurrentTimeMs,
|
|
159
|
+
getDurationMs,
|
|
160
|
+
isPaused
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
exports.useMediaTransport = useMediaTransport;
|
|
165
|
+
//# sourceMappingURL=chunk-JYZW2PZS.cjs.map
|
|
166
|
+
//# sourceMappingURL=chunk-JYZW2PZS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useMediaTransport.ts"],"names":["useState","useRef","useCallback","useEffect"],"mappings":"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","file":"chunk-JYZW2PZS.cjs","sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport type MediaTransportState =\n | 'idle'\n | 'loading'\n | 'playing'\n | 'paused'\n | 'error';\n\nexport interface UseMediaTransportOptions {\n /** Fired on every native `timeupdate` and on metadata load, in milliseconds. */\n onTimeUpdate?: (currentTimeMs: number, durationMs: number) => void;\n /** Fired whenever the derived transport state changes. */\n onStateChange?: (state: MediaTransportState) => void;\n /** Fired when playback reaches the end. */\n onEnded?: () => void;\n /** Fired on a media error, with a descriptive Error. */\n onError?: (error: Error) => void;\n /** Initial playback rate (default `1`). Kept in sync with the element. */\n initialRate?: number;\n /** Transport state to enter when playback ends (default `'paused'`). */\n endedState?: Extract<MediaTransportState, 'idle' | 'paused'>;\n /** Reset the position to `0` when playback ends (default `false`). */\n resetTimeOnEnd?: boolean;\n /** Human-readable label used in the error message (default `'media'`). */\n errorLabel?: string;\n}\n\nexport interface UseMediaTransportReturn {\n /**\n * Callback ref for the `<audio>`/`<video>` element to control. Pass this to\n * the element's `ref` (or call it imperatively). Transport listeners attach\n * when an element mounts and detach when it unmounts.\n */\n setMediaElement: (element: HTMLMediaElement | null) => void;\n /** The currently attached media element, or `null`. */\n mediaElement: HTMLMediaElement | null;\n\n /** Derived transport state. */\n state: MediaTransportState;\n /** Current playback position in milliseconds. */\n currentTimeMs: number;\n /** Media duration in milliseconds (`0` until known / non-finite). */\n durationMs: number;\n /** Current playback rate. */\n playbackRate: number;\n /** `true` while `state === 'playing'`. */\n isPlaying: boolean;\n /** `true` while `state === 'loading'`. */\n isLoading: boolean;\n\n /** Start playback. */\n play: () => void;\n /** Pause playback. */\n pause: () => void;\n /** Toggle between play and pause. */\n togglePlay: () => void;\n /** Seek to a position in milliseconds. */\n seekToMs: (timeMs: number) => void;\n /** Set the playback rate multiplier. */\n setPlaybackRate: (rate: number) => void;\n /** Read the current position in milliseconds. */\n getCurrentTimeMs: () => number;\n /** Read the duration in milliseconds (`0` when unknown). */\n getDurationMs: () => number;\n /** Whether playback is currently paused (reads the element directly). */\n isPaused: () => boolean;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nconst toMs = (seconds: number): number =>\n Number.isFinite(seconds) ? seconds * 1000 : 0;\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Headless playback transport for a native `HTMLMediaElement`.\n *\n * Owns the derived transport state (idle/loading/playing/paused/error),\n * position, duration and playback rate, and exposes imperative controls — all\n * in **milliseconds**. It never creates or renders an element: pass the\n * returned {@link UseMediaTransportReturn.setMediaElement} callback to an\n * `<audio>`/`<video>` `ref` and the hook wires the native listeners.\n *\n * Shared by `MediaPlayer` (ms API) and, at the boundary, `AudioPlayer`\n * (seconds API — convert with `ms / 1000`). The WaveSurfer waveform variant is\n * out of scope; this hook targets native media transport only.\n *\n * @example\n * ```tsx\n * function Player({ src }: { src: string }) {\n * const t = useMediaTransport({ onEnded: () => console.log('done') });\n * return (\n * <div>\n * <video ref={t.setMediaElement} src={src} controls />\n * <button onClick={t.togglePlay}>{t.isPlaying ? 'Pause' : 'Play'}</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useMediaTransport(\n options: UseMediaTransportOptions = {}\n): UseMediaTransportReturn {\n const {\n onTimeUpdate,\n onStateChange,\n onEnded,\n onError,\n initialRate = 1,\n endedState = 'paused',\n resetTimeOnEnd = false,\n errorLabel = 'media',\n } = options;\n\n const [element, setElementState] = useState<HTMLMediaElement | null>(null);\n const [state, setStateRaw] = useState<MediaTransportState>('idle');\n const [currentTimeMs, setCurrentTimeMs] = useState(0);\n const [durationMs, setDurationMs] = useState(0);\n const [playbackRate, setPlaybackRateState] = useState(initialRate);\n\n const elementRef = useRef<HTMLMediaElement | null>(null);\n\n // Keep the latest callbacks/options in a ref so the listener effect does not\n // re-subscribe on every render when callers pass inline functions.\n const handlers = useRef({\n onTimeUpdate,\n onStateChange,\n onEnded,\n onError,\n endedState,\n resetTimeOnEnd,\n errorLabel,\n });\n handlers.current = {\n onTimeUpdate,\n onStateChange,\n onEnded,\n onError,\n endedState,\n resetTimeOnEnd,\n errorLabel,\n };\n\n const setState = useCallback((next: MediaTransportState) => {\n setStateRaw((prev) => {\n if (prev === next) return prev;\n handlers.current.onStateChange?.(next);\n return next;\n });\n }, []);\n\n const setMediaElement = useCallback((el: HTMLMediaElement | null) => {\n elementRef.current = el;\n setElementState(el);\n }, []);\n\n // Attach native transport listeners whenever an element mounts.\n useEffect(() => {\n if (!element) return;\n\n const emitTime = () => {\n const ms = toMs(element.currentTime);\n const dur = toMs(element.duration);\n setCurrentTimeMs(ms);\n handlers.current.onTimeUpdate?.(ms, dur);\n };\n\n const onLoadStart = () => setState('loading');\n const onCanPlay = () => setState('idle');\n const onLoadedMetadata = () => {\n setDurationMs(toMs(element.duration));\n emitTime();\n };\n const onTimeUpdateEvt = () => emitTime();\n const onPlay = () => setState('playing');\n const onPlaying = () => setState('playing');\n const onPause = () => setState('paused');\n const onEndedEvt = () => {\n setState(handlers.current.endedState);\n if (handlers.current.resetTimeOnEnd) {\n element.currentTime = 0;\n setCurrentTimeMs(0);\n }\n handlers.current.onEnded?.();\n };\n const onErrorEvt = () => {\n setState('error');\n handlers.current.onError?.(\n new Error(`Failed to load ${handlers.current.errorLabel}`)\n );\n };\n\n element.addEventListener('loadstart', onLoadStart);\n element.addEventListener('canplay', onCanPlay);\n element.addEventListener('loadedmetadata', onLoadedMetadata);\n element.addEventListener('timeupdate', onTimeUpdateEvt);\n element.addEventListener('play', onPlay);\n element.addEventListener('playing', onPlaying);\n element.addEventListener('pause', onPause);\n element.addEventListener('ended', onEndedEvt);\n element.addEventListener('error', onErrorEvt);\n\n // Sync duration if metadata is already available on attach.\n if (Number.isFinite(element.duration)) {\n setDurationMs(toMs(element.duration));\n }\n\n return () => {\n element.removeEventListener('loadstart', onLoadStart);\n element.removeEventListener('canplay', onCanPlay);\n element.removeEventListener('loadedmetadata', onLoadedMetadata);\n element.removeEventListener('timeupdate', onTimeUpdateEvt);\n element.removeEventListener('play', onPlay);\n element.removeEventListener('playing', onPlaying);\n element.removeEventListener('pause', onPause);\n element.removeEventListener('ended', onEndedEvt);\n element.removeEventListener('error', onErrorEvt);\n };\n }, [element, setState]);\n\n // Keep the element's playback rate in sync with hook state.\n useEffect(() => {\n if (element) element.playbackRate = playbackRate;\n }, [element, playbackRate]);\n\n const play = useCallback(() => {\n void elementRef.current?.play();\n }, []);\n\n const pause = useCallback(() => {\n elementRef.current?.pause();\n }, []);\n\n const togglePlay = useCallback(() => {\n const el = elementRef.current;\n if (!el) return;\n if (el.paused) void el.play();\n else el.pause();\n }, []);\n\n const seekToMs = useCallback((timeMs: number) => {\n const el = elementRef.current;\n if (el) {\n el.currentTime = timeMs / 1000;\n setCurrentTimeMs(timeMs);\n }\n }, []);\n\n const setPlaybackRate = useCallback((rate: number) => {\n setPlaybackRateState(rate);\n if (elementRef.current) elementRef.current.playbackRate = rate;\n }, []);\n\n const getCurrentTimeMs = useCallback(\n () => toMs(elementRef.current?.currentTime ?? 0),\n []\n );\n\n const getDurationMs = useCallback(\n () => toMs(elementRef.current?.duration ?? 0),\n []\n );\n\n const isPaused = useCallback(() => elementRef.current?.paused ?? true, []);\n\n return {\n setMediaElement,\n mediaElement: element,\n state,\n currentTimeMs,\n durationMs,\n playbackRate,\n isPlaying: state === 'playing',\n isLoading: state === 'loading',\n play,\n pause,\n togglePlay,\n seekToMs,\n setPlaybackRate,\n getCurrentTimeMs,\n getDurationMs,\n isPaused,\n };\n}\n"]}
|