import { generatePassword } from "@/utils/generators/generatePassword"; import { GeneratorOptions } from "@/utils/storage"; import useTimeout from "@/utils/useTimeout"; import { Button, Input, mergeClasses, MessageBar, MessageBarBody, Tooltip } from "@fluentui/react-components"; import { ArrowClockwise20Regular, CheckmarkRegular, Copy20Regular } from "@fluentui/react-icons"; import { ReactElement, useEffect, useState } from "react"; import { useStyles } from "./GeneratorView.styles"; export default function GeneratorView({ options }: GeneratorViewProps): ReactElement { const [password, setPassword] = useState(""); const [error, setError] = useState(null); const [refreshTimer, copyTimer] = [useTimeout(310), useTimeout(1000)]; const cls = useStyles(); const refresh = useCallback(() => { if (!options) return; setError(null); try { setPassword(generatePassword({ length: options.Length, uppercase: options.Uppercase, lowercase: options.Lowercase, numeric: options.Numeric, special: options.Special, custom: options.Custom, excludeSimilar: options.ExcludeSimilar, excludeAmbiguous: options.ExcludeAmbiguous, excludeRepeating: options.ExcludeRepeating, excludeCustom: options.ExcludeCustom ? options.ExcludeCustomSet : "", customSet: options.IncludeCustomSet })); } catch (e) { setError((e as Error).message); } refreshTimer.trigger(); }, [options]); const copy = useCallback(async () => { await window.navigator.clipboard.writeText(password); copyTimer.trigger(); }, [password]); useEffect(refresh, [options]); if (error) return ( { error } ); return (