import { GeneratorOptions, useStorage } from "@/utils/storage"; import * as fui from "@fluentui/react-components"; import * as ic from "@fluentui/react-icons"; import { ReactElement } from "react"; import { useStyles } from "./QuickOptions.styles"; export default function QuickOptions({ onChange }: QuickOptionsProps): ReactElement { const { extOptions, generatorOptions } = useStorage(); const [quickOpts, setOptions] = useState(generatorOptions); const checkedOptions = useMemo( () => Object.keys(quickOpts).filter(k => quickOpts[k as keyof GeneratorOptions] as boolean), [quickOpts] ); const onCheckedValueChange = useCallback((_: unknown, e: fui.MenuCheckedValueChangeData): void => { const opts: Partial> = {}; const keys = Object.keys(quickOpts) .filter(i => i !== "Length" && i !== "IncludeCustomSet" && i !== "ExcludeCustomSet" && i.startsWith("Exclude") === (e.name === "exclude") ) as (keyof Omit)[]; for (const key of keys) opts[key] = e.checkedItems.includes(key); setOptions({ ...generatorOptions, ...quickOpts, ...opts }); }, [quickOpts]); useEffect(() => onChange(quickOpts), [onChange, quickOpts]); const IncludeIcon: ic.FluentIcon = ic.bundleIcon(ic.AddCircleFilled, ic.AddCircleRegular); const ExcludeIcon: ic.FluentIcon = ic.bundleIcon(ic.SubtractCircleFilled, ic.SubtractCircleRegular); const cls = useStyles(); return (
setOptions({ ...quickOpts, Length: e.value }) } /> { quickOpts.Length }
}> { i18n.t("popup.include") } { i18n.t("common.characters.uppercase") } { i18n.t("common.characters.lowercase") } { i18n.t("common.characters.numeric") } { i18n.t("common.characters.special") } { i18n.t("common.characters.custom") } } onClick={ () => browser.runtime.openOptionsPage() } /> }> { i18n.t("popup.exclude") } { i18n.t("common.characters.similar") } { i18n.t("common.characters.ambiguous") } { i18n.t("common.characters.repeating.label") } { i18n.t("common.characters.custom") } } onClick={ () => browser.runtime.openOptionsPage() } /> } onClick={ () => setOptions(generatorOptions) } />
); }; export type QuickOptionsProps = { onChange: (value: GeneratorOptions) => void; };