@yamada-ui/rating
Version:
Yamada UI rating component
1 lines • 7.62 kB
Source Map (JSON)
{"version":3,"sources":["../src/use-rating-item.ts"],"sourcesContent":["import type { PropGetter } from \"@yamada-ui/core\"\nimport type { ChangeEvent } from \"react\"\nimport { trackFocusVisible } from \"@yamada-ui/use-focus-visible\"\nimport { dataAttr, handlerAll } from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useState } from \"react\"\nimport { useRatingContext } from \"./rating-context\"\n\nexport interface UseRatingItemProps {\n fractionValue: number\n groupValue: number\n value: number\n}\n\nexport const useRatingItem = ({\n fractionValue,\n groupValue,\n value,\n}: UseRatingItemProps) => {\n const {\n id,\n name,\n highlightSelectedOnly,\n outside,\n resolvedValue,\n roundedValue,\n setHoveredValue,\n setValue,\n formControlProps,\n } = useRatingContext()\n const {\n \"aria-disabled\": ariaDisabled,\n \"aria-readonly\": _ariaReadOnly,\n disabled,\n readOnly,\n ...omittedFormControlProps\n } = formControlProps\n const [focused, setFocused] = useState<boolean>(false)\n const [focusVisible, setFocusVisible] = useState<boolean>(false)\n const active = value === resolvedValue\n const checked = value === roundedValue\n const filled = highlightSelectedOnly\n ? value === resolvedValue\n : value <= resolvedValue\n\n const onBlur = useCallback(() => {\n setFocused(false)\n\n if (outside) setHoveredValue(-1)\n }, [outside, setHoveredValue])\n\n const onInputChange = useCallback(\n (ev: ChangeEvent<HTMLInputElement>) => {\n if (readOnly || disabled) return\n\n const value = parseFloat(ev.target.value)\n\n setHoveredValue(value)\n },\n [disabled, readOnly, setHoveredValue],\n )\n\n const onChange = useCallback(\n (value: number) => {\n if (readOnly || disabled) return\n\n setValue(value)\n },\n [disabled, readOnly, setValue],\n )\n\n const onMouseDown = useCallback(() => {\n if (readOnly || disabled) return\n\n onChange(value)\n }, [disabled, onChange, readOnly, value])\n\n const onTouchStart = useCallback(() => {\n if (readOnly || disabled) return\n\n onChange(value)\n }, [disabled, onChange, readOnly, value])\n\n const getItemProps: PropGetter<\"label\"> = useCallback(\n (props = {}, ref = null) => {\n const zIndex = active ? 1 : -1\n\n return {\n ref,\n htmlFor: `${id}-${groupValue}-${value}`,\n ...omittedFormControlProps,\n ...props,\n \"data-active\": dataAttr(active),\n \"data-disabled\": dataAttr(disabled),\n \"data-filled\": dataAttr(filled),\n \"data-focus\": dataAttr(focused),\n \"data-focus-visible\": dataAttr(focused && focusVisible),\n zIndex: fractionValue !== 1 ? zIndex : undefined,\n onMouseDown: handlerAll(onMouseDown, props.onMouseDown),\n onTouchStart: handlerAll(onTouchStart, props.onTouchStart),\n }\n },\n [\n disabled,\n omittedFormControlProps,\n fractionValue,\n groupValue,\n id,\n active,\n filled,\n focusVisible,\n focused,\n onMouseDown,\n onTouchStart,\n value,\n ],\n )\n\n const getInputProps: PropGetter<\"input\"> = useCallback(\n (props = {}, ref = null) => {\n return {\n ref,\n \"aria-disabled\": ariaDisabled,\n \"aria-label\": `${value}`,\n disabled,\n readOnly,\n ...omittedFormControlProps,\n ...props,\n id: `${id}-${groupValue}-${value}`,\n type: \"radio\",\n name,\n style: {\n border: \"0px\",\n clip: \"rect(0px, 0px, 0px, 0px)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: \"0px\",\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n },\n \"data-active\": dataAttr(active),\n \"data-checked\": dataAttr(checked),\n checked,\n value,\n onBlur: handlerAll(onBlur, props.onBlur),\n onChange: handlerAll(onInputChange, props.onChange),\n onFocus: handlerAll(() => setFocused(true), props.onFocus),\n onKeyDown: handlerAll(\n (ev) => (ev.key === \" \" ? onChange(value) : void 0),\n props.onKeyDown,\n ),\n }\n },\n [\n ariaDisabled,\n disabled,\n readOnly,\n value,\n omittedFormControlProps,\n id,\n groupValue,\n name,\n checked,\n onInputChange,\n onBlur,\n active,\n onChange,\n ],\n )\n\n useEffect(() => {\n return trackFocusVisible(setFocusVisible)\n }, [])\n\n return {\n active,\n checked,\n filled,\n getInputProps,\n getItemProps,\n }\n}\n\nexport type UseRatingItemReturn = ReturnType<typeof useRatingItem>\n"],"mappings":"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","names":["value"]}