import React, { useEffect, useState } from 'react' import { getCookie, setCookie } from 'cookies-next' import { useRouter } from 'next/router' import { useTranslation } from 'react-i18next' import { Dialog, DialogTrigger, DialogClose, DialogTitle, } from '~components/common/Dialog' import DialogContent from '~components/common/DialogContent' import Button from '~components/common/Button' import InputTableField from '~components/common/InputTableField' import SelectTableField from '~components/common/SelectTableField' import SliderTableField from '~components/common/SliderTableField' import SwitchTableField from '~components/common/SwitchTableField' import SelectItem from '~components/common/SelectItem' import type { DialogProps } from '@radix-ui/react-dialog' import CrossIcon from '~public/icons/Cross.svg' import './index.scss' interface Props extends DialogProps { defaultFilterSet: FilterSet filterSet: FilterSet sendAdvancedFilters: (filters: FilterSet) => void } const MAX_CHARACTERS = 5 const MAX_WEAPONS = 13 const MAX_SUMMONS = 8 const FilterModal = (props: Props) => { // Set up router const router = useRouter() const locale = router.locale // Set up translation const { t } = useTranslation('common') // Refs const headerRef = React.createRef() const footerRef = React.createRef() // States const [open, setOpen] = useState(false) const [chargeAttackOpen, setChargeAttackOpen] = useState(false) const [fullAutoOpen, setFullAutoOpen] = useState(false) const [autoGuardOpen, setAutoGuardOpen] = useState(false) const [filterSet, setFilterSet] = useState({}) // Filter states const [fullAuto, setFullAuto] = useState(props.defaultFilterSet.full_auto) const [autoGuard, setAutoGuard] = useState(props.defaultFilterSet.auto_guard) const [chargeAttack, setChargeAttack] = useState( props.defaultFilterSet.charge_attack ) const [minCharacterCount, setMinCharacterCount] = useState( props.defaultFilterSet.characters_count ) const [minWeaponCount, setMinWeaponCount] = useState( props.defaultFilterSet.weapons_count ) const [minSummonCount, setMinSummonCount] = useState( props.defaultFilterSet.summons_count ) const [maxButtonsCount, setMaxButtonsCount] = useState( props.defaultFilterSet.button_count ) const [maxTurnsCount, setMaxTurnsCount] = useState( props.defaultFilterSet.turn_count ) const [userQuality, setUserQuality] = useState( props.defaultFilterSet.user_quality ) const [nameQuality, setNameQuality] = useState( props.defaultFilterSet.name_quality ) const [originalOnly, setOriginalOnly] = useState( props.defaultFilterSet.original ) // Hooks useEffect(() => { if (props.open !== undefined) setOpen(props.open) }) useEffect(() => { setFilterSet(props.filterSet) }, [props.filterSet]) useEffect(() => { setFullAuto(filterSet.full_auto) setAutoGuard(filterSet.auto_guard) setChargeAttack(filterSet.charge_attack) setMinCharacterCount(filterSet.characters_count) setMinSummonCount(filterSet.summons_count) setMinWeaponCount(filterSet.weapons_count) setMaxButtonsCount(filterSet.button_count) setMaxTurnsCount(filterSet.turn_count) setNameQuality(filterSet.name_quality) setUserQuality(filterSet.user_quality) setOriginalOnly(filterSet.original) }, [filterSet]) function openSelect(name: 'charge_attack' | 'full_auto' | 'auto_guard') { setChargeAttackOpen(name === 'charge_attack' ? !chargeAttackOpen : false) setFullAutoOpen(name === 'full_auto' ? !fullAutoOpen : false) setAutoGuardOpen(name === 'auto_guard' ? !autoGuardOpen : false) } function saveFilters() { const filters: FilterSet = {} filters.full_auto = fullAuto filters.auto_guard = autoGuard filters.charge_attack = chargeAttack filters.characters_count = minCharacterCount filters.weapons_count = minWeaponCount filters.summons_count = minSummonCount filters.name_quality = nameQuality filters.user_quality = userQuality filters.original = originalOnly if (maxButtonsCount) filters.button_count = maxButtonsCount if (maxTurnsCount) filters.turn_count = maxTurnsCount setCookie('filters', filters, { path: '/' }) props.sendAdvancedFilters(filters) openChange() } function resetFilters() { setFullAuto(props.defaultFilterSet.full_auto) setAutoGuard(props.defaultFilterSet.auto_guard) setChargeAttack(props.defaultFilterSet.charge_attack) setMinCharacterCount(props.defaultFilterSet.characters_count) setMinWeaponCount(props.defaultFilterSet.weapons_count) setMinSummonCount(props.defaultFilterSet.summons_count) setMaxButtonsCount(props.defaultFilterSet.button_count) setMaxTurnsCount(props.defaultFilterSet.turn_count) setUserQuality(props.defaultFilterSet.user_quality) setNameQuality(props.defaultFilterSet.name_quality) setOriginalOnly(props.defaultFilterSet.original) } function openChange() { if (open) { setOpen(false) if (props.onOpenChange) props.onOpenChange(false) } else { setOpen(true) if (props.onOpenChange) props.onOpenChange(true) } } function onEscapeKeyDown(event: KeyboardEvent) { event.preventDefault() openChange() } function onOpenAutoFocus(event: Event) { event.preventDefault() } // Value listeners function handleChargeAttackValueChange(value: string) { setChargeAttack(parseInt(value)) } function handleFullAutoValueChange(value: string) { const newValue = parseInt(value) setFullAuto(newValue) if (newValue === 0 || (newValue === -1 && autoGuard === 1)) setAutoGuard(newValue) } function handleAutoGuardValueChange(value: string) { const newValue = parseInt(value) setAutoGuard(newValue) if (newValue === 1 || (newValue === -1 && fullAuto === 0)) setFullAuto(newValue) } function handleMinCharactersValueChange(value: number) { setMinCharacterCount(value) } function handleMinSummonsValueChange(value: number) { setMinSummonCount(value) } function handleMinWeaponsValueChange(value: number) { setMinWeaponCount(value) } function handleMaxButtonsCountValueChange(value?: string) { if (!value) return setMaxButtonsCount(parseInt(value)) } function handleMaxTurnsCountValueChange(value?: string) { if (!value) return setMaxTurnsCount(parseInt(value)) } function handleNameQualityValueChange(value?: boolean) { setNameQuality(value) } function handleUserQualityValueChange(value: boolean) { setUserQuality(value) } function handleOriginalOnlyValueChange(value: boolean) { setOriginalOnly(value) } // Sliders const minCharactersField = () => ( ) const minWeaponsField = () => ( ) const minSummonsField = () => ( ) // Selects const fullAutoField = () => ( openSelect('full_auto')} onClose={() => setFullAutoOpen(false)} onChange={handleFullAutoValueChange} > {t('modals.filters.options.on_and_off')} {t('modals.filters.options.on')} {t('modals.filters.options.off')} ) const autoGuardField = () => ( openSelect('auto_guard')} onClose={() => setAutoGuardOpen(false)} onChange={handleAutoGuardValueChange} > {t('modals.filters.options.on_and_off')} {t('modals.filters.options.on')} {t('modals.filters.options.off')} ) const chargeAttackField = () => ( openSelect('charge_attack')} onClose={() => setChargeAttackOpen(false)} onChange={handleChargeAttackValueChange} > {t('modals.filters.options.on_and_off')} {t('modals.filters.options.on')} {t('modals.filters.options.off')} ) // Switches const nameQualityField = () => ( ) const userQualityField = () => ( ) const originalOnlyField = () => ( ) // Inputs const maxButtonsField = () => ( ) const maxTurnsField = () => ( ) return ( {props.children}
{t('modals.filters.title')}
{chargeAttackField()} {fullAutoField()} {autoGuardField()} {/* {maxButtonsField()} */} {/* {maxTurnsField()} */} {minCharactersField()} {minSummonsField()} {minWeaponsField()} {nameQualityField()} {userQualityField()} {originalOnlyField()}
) } export default FilterModal