import * as fui from "@fluentui/react-components"; import * as Icons from "@fluentui/react-icons"; import { useEffect, useState } from "react"; import GeneratorOptions from "../Models/GeneratorOptions"; import { GetLocaleString as loc } from "../Utils/Localization"; import { GeneratePassword } from "../Utils/PasswordGenerator"; import { useStorage } from "../Utils/Storage"; import { useTimeout } from "../Utils/Timeout"; import { useStyles } from "./GeneratorView.styles"; export default function GeneratorView(props: { collapse: boolean; }): JSX.Element { const { generatorOptions, extOptions } = useStorage(); const [password, setPassword] = useState(""); const [quickOpts, _setOpts] = useState(generatorOptions); const [error, setError] = useState(null); const [refreshTimer, copyTimer] = [useTimeout(310), useTimeout(1000)]; const checkedOptions = Object.keys(quickOpts).filter(k => quickOpts[k as keyof GeneratorOptions] as boolean); const cls = useStyles(); const IncludeIcon: Icons.FluentIcon = Icons.bundleIcon(Icons.AddCircleFilled, Icons.AddCircleRegular); const ExcludeIcon: Icons.FluentIcon = Icons.bundleIcon(Icons.SubtractCircleFilled, Icons.SubtractCircleRegular); const resetOptions = (): void => _setOpts(generatorOptions); const setOptions = (opts: Partial) => _setOpts({ ...quickOpts, ...opts }); function RefreshPassword(): void { setError(null); const options: GeneratorOptions = { ...generatorOptions, ...quickOpts }; try { setPassword(GeneratePassword(options)); } catch (e) { setError((e as Error).message); } } async function CopyPassword(): Promise { await window.navigator.clipboard.writeText(password); copyTimer.trigger(); } function OnCheckedValueChange(_: unknown, e: fui.MenuCheckedValueChangeData): void { const opts: Partial> = {}; let keys = Object.keys(quickOpts).filter(i => i !== "Length") as (keyof Omit)[]; if (e.name === "include") keys = keys.filter(i => !i.startsWith("Exclude")); else keys = keys.filter(i => i.startsWith("Exclude")); for (const key of keys) opts[key] = e.checkedItems.includes(key); setOptions(opts); } useEffect(resetOptions, [generatorOptions]); useEffect(RefreshPassword, [generatorOptions, quickOpts]); useEffect(refreshTimer.trigger, [password]); return (
{ error ? { error } : : } /> } /> } /> } { !props.collapse &&
{ loc("generator@quickOptions") }
setOptions({ Length: e.value }) } /> { quickOpts.Length }
}>{ loc("generator@include") } }> { loc("settings@uppercase") } }> { loc("settings@lowercase") } }> { loc("settings@numeric") } }> { loc("settings@special") } }>{ loc("generator@exclude") } { loc("settings@similar") } { loc("settings@ambiguous") } { loc("settings@repeating") } } onClick={ resetOptions } />
}
); }