import { useState, useEffect } from "react"; import * as OTPAuth from 'otpauth'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faCircleInfo } from "@fortawesome/free-solid-svg-icons"; import { ThemeToggle } from "./components/ThemeToggle"; // eslint-disable-next-line no-undef const api = typeof browser !== "undefined" ? browser : chrome; const App = () => { const [secret, setSecret] = useState(''); const [token, setToken] = useState('000000'); const [remaining, setRemaining] = useState(30); useEffect(() => { if (api?.storage?.local) { api.storage.local.get(['shasecret'], (result) => { if (result.shasecret) { setSecret(result.shasecret); } }); } }, []); useEffect(() => { if (!secret) return; const generateToken = () => { try { let totp = new OTPAuth.TOTP({ issuer: 'US', label: '2FA', algorithm: 'SHA1', digits: 6, period: 30, secret: OTPAuth.Secret.fromBase32(secret.trim().toUpperCase()), }); const newToken = totp.generate() setToken(newToken); if (api?.tabs?.query) { api.tabs.query({ active: true, currentWindow: true }, (tabs) => { if (tabs[0]?.url?.includes("sso.us.es")) { api.tabs.sendMessage(tabs[0].id, { action: "autofill", code: newToken }).catch(() => {}); } }); } else { console.debug("DevEnv"); } } catch (err) { console.error("Invalid secret:", err); setToken("ERR!"); } }; generateToken(); const timer = setInterval(() => { const now = Date.now() / 1000; const secondsInCycle = now % 30; const remainingTime = 30 - secondsInCycle; setRemaining(remainingTime); if (remainingTime > 29.9) generateToken(); }, 41); // ~41.66ms = 24fps return () => clearInterval(timer); }, [secret]); const handleSaveSecret = (e) => { if (e.key === 'Enter') { const val = e.target.value.trim(); if (api?.storage?.local) { api.storage.local.set({ 'shasecret': val }, () => { setSecret(val); console.log("Secret stored"); }); } e.target.value = ''; } }; const resetSecret = () => { if (api?.storage?.local) { api.storage.local.remove(['shasecret'], () => { setSecret(''); setToken('000000'); }); } }; const copyToClipboard = () => { navigator.clipboard.writeText(token); }; return (