"use client";
import { useLocale, useTranslator } from "../../i18n/context.js";
import { usePlayer } from "../../player/context.js";
import { renderElement } from "../../utils/use-render.js";
import { logMissingFeature, selectTime } from "@videojs/core/dom";
import { translateText } from "@videojs/core/i18n";
import { forwardRef, useEffect, useState } from "react";
import { isInteractiveActivation } from "@videojs/utils/dom";
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
import { TimeCore, TimeDataAttrs } from "@videojs/core";
import { remainingSuffixText } from "@videojs/core/i18n/text/time";
import { formatTimeAsPhrase } from "@videojs/utils/time";
//#region src/ui/time/time-value.tsx
/**
* Displays a formatted time value (current, duration, or remaining).
*
* @example
* ```tsx
*
*
*
* ```
*/
const Value = forwardRef(function Value(componentProps, forwardedRef) {
const { render, className, style, type, negativeSign, label, toggle = false, ...elementProps } = componentProps;
const time = usePlayer(selectTime);
const translator = useTranslator();
const locale = useLocale();
const [core] = useState(() => new TimeCore());
const defaultType = type ?? TimeCore.defaultProps.type;
const [activeType, setActiveType] = useState(defaultType);
useEffect(() => {
setActiveType(defaultType);
}, [defaultType, toggle]);
core.setProps({
type: activeType,
negativeSign,
label,
toggle
});
if (!time) {
logMissingFeature("Time.Value", "time");
return null;
}
core.setMedia(time);
const state = core.getState();
const attrs = core.getAttrs(state, defaultType);
const resolvedLabelParams = core.getLabelParams(state) ? { duration: state.type === "remaining" ? translateText(remainingSuffixText, translator, { duration: formatTimeAsPhrase(Math.abs(state.seconds), { locale }) }) : formatTimeAsPhrase(Math.abs(state.seconds), { locale }) } : void 0;
const content = state.negative ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
"aria-hidden": "true",
children: negativeSign ?? TimeCore.defaultProps.negativeSign
}), state.text] }) : state.text;
const toggleType = () => {
setActiveType((value) => {
if (defaultType === "current") return value === "remaining" ? "current" : "remaining";
return value === "duration" ? "remaining" : "duration";
});
};
const handleClick = (event) => {
if (event.defaultPrevented) return;
toggleType();
};
const handleKeyDown = (event) => {
if (event.defaultPrevented || !isInteractiveActivation(event.nativeEvent)) return;
event.preventDefault();
if (event.repeat) return;
toggleType();
};
return renderElement("time", {
render,
className,
style
}, {
state,
stateAttrMap: TimeDataAttrs,
ref: [forwardedRef],
props: [{
dateTime: state.datetime,
children: content,
...attrs,
"aria-label": translateText(attrs["aria-label"], translator, resolvedLabelParams),
...toggle ? {
onClick: handleClick,
onKeyDown: handleKeyDown
} : void 0
}, elementProps]
});
});
//#endregion
export { Value };
//# sourceMappingURL=time-value.js.map