import { GeneratePassword } from "@/utils/PasswordGenerator"; import { GeneratorOptions, useStorage } from "@/utils/storage"; import useTimeout from "@/utils/useTimeout"; import * as fui from "@fluentui/react-components"; import * as ic from "@fluentui/react-icons"; import { useEffect, useState } from "react"; import { useStyles } from "./GeneratorView.styles"; import QuickOptions from "./QuickOptions"; const GeneratorView: React.FC<{ collapse: boolean }> = props => { const { generatorOptions } = useStorage(); const [options, setOptions] = useState(generatorOptions); const [showInsert, setShowInsert] = useState(false); const [password, setPassword] = useState(""); const [error, setError] = useState(null); const [refreshTimer, copyTimer, insertTimer] = [useTimeout(310), useTimeout(1000), useTimeout(1000)]; const cls = useStyles(); const refresh = useCallback(() => { setError(null); try { setPassword(GeneratePassword(options)); } catch (e) { setError((e as Error).message); } }, [options]); const copy = useCallback(async () => { await window.navigator.clipboard.writeText(password); copyTimer.trigger(); }, [password]); const insert = useCallback(async () => { const tabId: number = (await browser.tabs.query({ active: true, currentWindow: true }))[0].id!; await browser.tabs.sendMessage(tabId, password); insertTimer.trigger(); copy(); }, [password]); useEffect(() => setOptions(generatorOptions), [generatorOptions]); useEffect(refresh, [options]); useEffect(refreshTimer.trigger, [password]); useEffect(() => { (async () => { try { const tabId: number = (await browser.tabs.query({ active: true, currentWindow: true }))[0].id!; const fieldCount: number = await browser.tabs.sendMessage(tabId, "probe"); if (fieldCount > 0) setShowInsert(true); } catch { } })(); }, []); return (
{ error ? { error } : : } /> } /> { showInsert && : } /> } } /> } { !props.collapse && setOptions(e) } /> }
); }; export default GeneratorView;