import { t } from "i18next"; import { useCallback, useEffect, useState } from "react"; import { useCopyToClipboard } from "react-use"; import WindowControlBar from "@/components/WindowControlBar"; import { APP_NAME, APP_VERSION, SDK_VERSION } from "@/config"; import { feedbackToast } from "@/utils/common"; import styles from "./index.module.scss"; import LoginForm from "./LoginForm"; export const Login = () => { const [_, copyToClipboard] = useCopyToClipboard(); const [banner, setBanner] = useState(null); const clearBanner = useCallback(() => setBanner(null), []); const handleCopy = () => { copyToClipboard(`${`${APP_NAME} ${APP_VERSION}`}/${SDK_VERSION}`); feedbackToast({ msg: t("toast.copySuccess") }); }; return (
{banner ? : null}
{`${APP_NAME} ${APP_VERSION}`}
{SDK_VERSION}
); }; const LoginToastBanner = ({ text, onDone }: { text: string; onDone: () => void }) => { const [phase, setPhase] = useState<"in" | "out">("in"); useEffect(() => { const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; const stay = window.setTimeout(() => setPhase("out"), reduce ? 2000 : 2150); const done = window.setTimeout(onDone, reduce ? 2000 : 2350); return () => { window.clearTimeout(stay); window.clearTimeout(done); }; }, [onDone]); return (
{text}
); };