import { useState, useRef, memo, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { useForm } from "react-hook-form"; import { useVerge } from "@/hooks/use-verge"; import { Notice } from "@/components/base"; import { isValidUrl } from "@/utils/helper"; import { useLockFn } from "ahooks"; import { TextField, Button, Grid2, Box, Stack, IconButton, InputAdornment, } from "@mui/material"; import Visibility from "@mui/icons-material/Visibility"; import VisibilityOff from "@mui/icons-material/VisibilityOff"; import { saveWebdavConfig, createWebdavBackup } from "@/services/cmds"; export interface BackupConfigViewerProps { onBackupSuccess: () => Promise; onSaveSuccess: () => Promise; onRefresh: () => Promise; onInit: () => Promise; setLoading: (loading: boolean) => void; } export const BackupConfigViewer = memo( ({ onBackupSuccess, onSaveSuccess, onRefresh, onInit, setLoading, }: BackupConfigViewerProps) => { const { t } = useTranslation(); const { verge } = useVerge(); const { webdav_url, webdav_username, webdav_password } = verge || {}; const [showPassword, setShowPassword] = useState(false); const usernameRef = useRef(null); const passwordRef = useRef(null); const urlRef = useRef(null); const { register, handleSubmit, watch } = useForm({ defaultValues: { url: webdav_url, username: webdav_username, password: webdav_password, }, }); const url = watch("url"); const username = watch("username"); const password = watch("password"); const webdavChanged = webdav_url !== url || webdav_username !== username || webdav_password !== password; console.log( "webdavChanged", webdavChanged, webdav_url, webdav_username, webdav_password, ); const handleClickShowPassword = () => { setShowPassword((prev) => !prev); }; useEffect(() => { if (webdav_url && webdav_username && webdav_password) { onInit(); } }, []); const checkForm = () => { const username = usernameRef.current?.value; const password = passwordRef.current?.value; const url = urlRef.current?.value; if (!url) { urlRef.current?.focus(); Notice.error(t("WebDAV URL Required")); throw new Error(t("WebDAV URL Required")); } else if (!isValidUrl(url)) { urlRef.current?.focus(); Notice.error(t("Invalid WebDAV URL")); throw new Error(t("Invalid WebDAV URL")); } if (!username) { usernameRef.current?.focus(); Notice.error(t("WebDAV URL Required")); throw new Error(t("Username Required")); } if (!password) { passwordRef.current?.focus(); Notice.error(t("WebDAV URL Required")); throw new Error(t("Password Required")); } }; const save = useLockFn(async (data: IWebDavConfig) => { checkForm(); try { setLoading(true); await saveWebdavConfig( data.url.trim(), data.username.trim(), data.password, ).then(() => { Notice.success(t("WebDAV Config Saved")); onSaveSuccess(); }); } catch (error) { Notice.error(t("WebDAV Config Save Failed", { error }), 3000); } finally { setLoading(false); } }); const handleBackup = useLockFn(async () => { checkForm(); try { setLoading(true); await createWebdavBackup().then(async () => { await onBackupSuccess(); Notice.success(t("Backup Created")); }); } catch (error) { Notice.error(t("Backup Failed", { error })); } finally { setLoading(false); } }); return (
e.preventDefault()}> {showPassword ? : } ), }, }} /> {webdavChanged || webdav_url === undefined || webdav_username === undefined || webdav_password === undefined ? ( ) : ( <> )}
); }, );