import { useSnapshot } from 'valtio' import { noCase } from 'change-case' import { titleCase } from 'title-case' import { useMemo } from 'react' import { disabledSettings, options, qsOptions } from '../optionsStorage' import { hideAllModals, miscUiState } from '../globalState' import Button from './Button' import Slider from './Slider' import Screen from './Screen' import { showOptionsModal } from './SelectOption' import PixelartIcon, { pixelartIcons } from './PixelartIcon' type GeneralItem = { id?: string text?: string, disabledReason?: string, disabledDuringGame?: boolean tooltip?: string // description?: string enableWarning?: string willHaveNoEffect?: boolean values?: Array disableIf?: [option: keyof typeof options, value: any] } export type OptionMeta = GeneralItem & ({ type: 'toggle', } | { type: 'slider' min?: number, max?: number, valueText?: (value: number) => string, unit?: string, delayApply?: boolean, } | { type: 'element' render: () => React.ReactNode, }) // todo not reactive const isLocked = (item: GeneralItem) => { return disabledSettings.value.has(item.id!) } const useCommonComponentsProps = (item: OptionMeta) => { let disabledBecauseOfSetting = false if (item.disableIf) { // okay to use hook conditionally as disableIf must be a constant const disableIfSetting = useSnapshot(options)[item.disableIf[0]] disabledBecauseOfSetting = disableIfSetting === item.disableIf[1] } return { disabledBecauseOfSetting } } export const OptionButton = ({ item }: { item: Extract }) => { const { disabledBecauseOfSetting } = useCommonComponentsProps(item) const optionValue = useSnapshot(options)[item.id!] const valuesTitlesMap = useMemo(() => { if (!item.values) { return { // true: ON, // false: OFF, true: 'ON', false: 'OFF', } } return Object.fromEntries(item.values.map((value) => { if (typeof value === 'string') { return [value, titleCase(noCase(value))] } else { return [value[0], value[1]] } })) }, [item.values]) let { disabledReason } = item if (disabledBecauseOfSetting) disabledReason = `Disabled because ${item.disableIf![0]} is ${item.disableIf![1]}` return } }