import { useState, useEffect, ChangeEvent, ReactElement } from "react"; import { AccountSettings } from "@linkwarden/types"; import { toast } from "react-hot-toast"; import SettingsLayout from "@/layouts/SettingsLayout"; import TextInput from "@/components/TextInput"; import { resizeImage } from "@/lib/client/resizeImage"; import ProfilePhoto from "@/components/ProfilePhoto"; import React from "react"; import Link from "next/link"; import Checkbox from "@/components/Checkbox"; import EmailChangeVerificationModal from "@/components/ModalContent/EmailChangeVerificationModal"; import { Button } from "@/components/ui/button"; import { i18n } from "next-i18next.config"; import { useTranslation } from "next-i18next"; import getServerSideProps from "@/lib/client/getServerSideProps"; import { useUpdateUser, useUser } from "@linkwarden/router/user"; import { z } from "zod"; import ImportDropdown from "@/components/ImportDropdown"; import { useConfig } from "@linkwarden/router/config"; import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, } from "@/components/ui/dropdown-menu"; import { Separator } from "@/components/ui/separator"; import { NextPageWithLayout } from "../_app"; const Page: NextPageWithLayout = () => { const [emailChangeVerificationModal, setEmailChangeVerificationModal] = useState(false); const [submitLoader, setSubmitLoader] = useState(false); const { data: account } = useUser(); const updateUser = useUpdateUser(); const [user, setUser] = useState( account?.id ? account : ({ // @ts-ignore id: null, name: "", username: "", email: "", emailVerified: null, password: undefined, image: "", isPrivate: false, // @ts-ignore createdAt: null, whitelistedUsers: [], } as unknown as AccountSettings) ); const { data: config } = useConfig(); const { t } = useTranslation(); const [whitelistedUsersTextbox, setWhiteListedUsersTextbox] = useState(""); useEffect(() => { if (!account?.id) return; setUser({ ...account, whitelistedUsers: stringToArray(whitelistedUsersTextbox), }); }, [account, whitelistedUsersTextbox]); const handleImageUpload = async (e: ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return toast.error(t("image_upload_no_file_error")); const fileExtension = file.name.split(".").pop()?.toLowerCase(); const allowedExtensions = ["png", "jpeg", "jpg"]; if (allowedExtensions.includes(fileExtension as string)) { const resizedFile = await resizeImage(file); if ( resizedFile.size < 1048576 // 1048576 Bytes == 1MB ) { const reader = new FileReader(); reader.onload = () => { setUser({ ...user, image: reader.result as string }); }; reader.readAsDataURL(resizedFile); } else { toast.error(t("image_upload_size_error")); } } else { toast.error(t("image_upload_format_error")); } }; const submit = async (password?: string) => { if (!/^[a-z0-9_-]{3,50}$/.test(user.username || "")) { return toast.error(t("username_invalid_guide")); } const emailSchema = z.string().trim().email().toLowerCase(); const emailValidation = emailSchema.safeParse(user.email || ""); if (config?.EMAIL_PROVIDER && !emailValidation.success) { return toast.error(t("email_invalid")); } setSubmitLoader(true); const load = toast.loading(t("applying_settings")); await updateUser.mutateAsync( { ...user, password: password ? password : undefined, }, { onSettled: (data, error) => { setSubmitLoader(false); toast.dismiss(load); if (error) { toast.error(error.message); } else { if (data.response.email !== user.email) { toast.success(t("email_change_request")); setEmailChangeVerificationModal(false); } toast.success(t("settings_applied")); } }, } ); if (user.locale !== account?.locale) { setTimeout(() => { location.reload(); }, 1000); } }; useEffect(() => { setWhiteListedUsersTextbox(account?.whitelistedUsers?.join(", ") || ""); }, [account]); const stringToArray = (str: string) => { return str?.replace(/\s+/g, "").split(","); }; return ( <>

{t("accountSettings")}

{t("display_name")}

setUser({ ...user, name: e.target.value })} />

{t("username")}

setUser({ ...user, username: e.target.value })} />
{config?.EMAIL_PROVIDER && (

{t("email")}

setUser({ ...user, email: e.target.value })} />
)}

{t("language")}

{t("profile_photo")}

e.preventDefault()}> {user.image && ( <> { setUser({ ...user, image: "", }); }} className="text-error" > {t("remove_photo")} )}
setUser({ ...user, isPrivate: !user.isPrivate })} />

{t("profile_privacy_info")}

{user.isPrivate && (

{t("whitelisted_users")}

{t("whitelisted_users_info")}