import { motion } from 'framer-motion'; import { memo } from 'react'; import { classNames } from '~/utils/classNames'; import { cubicEasingFn } from '~/utils/easings'; import { genericMemo } from '~/utils/react'; export type SliderOptions = { left: { value: T; text: string }; middle?: { value: T; text: string }; right: { value: T; text: string }; }; interface SliderProps { selected: T; options: SliderOptions; setSelected?: (selected: T) => void; } export const Slider = genericMemo(({ selected, options, setSelected }: SliderProps) => { const hasMiddle = !!options.middle; const isLeftSelected = hasMiddle ? selected === options.left.value : selected === options.left.value; const isMiddleSelected = hasMiddle && options.middle ? selected === options.middle.value : false; return (
setSelected?.(options.left.value)}> {options.left.text} {options.middle && ( setSelected?.(options.middle!.value)}> {options.middle.text} )} setSelected?.(options.right.value)} > {options.right.text}
); }); interface SliderButtonProps { selected: boolean; children: string | JSX.Element | Array; setSelected: () => void; } const SliderButton = memo(({ selected, children, setSelected }: SliderButtonProps) => { return ( ); });