/* eslint-disable @next/next/no-img-element */ "use client"; import { UserInfo } from "@/ldap"; import React from "react"; import styles from "./AboutMe.module.css"; import AvatarChanger from "@/components/AvatarChanger"; import Input from "@/components/Input"; import { Form, Formik, FormikHelpers } from "formik"; import { AboutMeFormValues, PasswordUpdateFormValues, aboutMeSchema, passwordUpdateSchema } from "@/schemas"; import PrettyForm from "@/components/PrettyForm"; import Toast from "@/components/Toast"; import { AuthProviderState } from "@/auth/AuthProvider"; import { exec } from "child_process"; type UpdateResponse = { ok: boolean; error?: string; }; async function fileAsBase64(f: File) { const reader = new FileReader(); reader.readAsArrayBuffer(f); return new Promise((resolve, reject) => { reader.onload = () => { const result = reader.result as ArrayBuffer; const buffer = Buffer.from(result); resolve(buffer.toString("base64")); }; reader.onerror = () => reject(reader.error); }); } function AuthProviderButton({ provider }: { provider: AuthProviderState }) { // bullshit hack const holdTime = provider.connected ? 3000 : 0; const interval = React.useRef(); const inputRef = React.useRef(null); const execute = async () => { const name = provider.name.toLowerCase(); if (!provider.connected) { window.location.href = `/oauth/${name}/login`; } else { await fetch(`/api/unlink?provider=${name}`, { method: "POST" }); window.location.reload(); } }; const mouseDown = () => { interval.current = setTimeout(execute, holdTime); }; const mouseUp = () => { if (interval.current) clearTimeout(interval.current); }; return ( ); } function AuthProviderEntry({ provider }: { provider: AuthProviderState }) { return ( <>

{provider.name}:{" "} {provider.connected ? provider.username : "Not connected"}

); } export default function AboutMe({ info, providers }: { info: UserInfo; providers: AuthProviderState[]; }) { const [globalError, setGlobalError] = React.useState(null); const [madeProfileChanges, setMadeChanges] = React.useState(false); const [madePasswordChanges, setMadePasswordChanges] = React.useState(false); const initialValues: AboutMeFormValues = { username: info.username, displayName: info.displayName, email: info.email, avatar: info.avatar }; async function handleFormSubmit( { displayName, email, avatar }: AboutMeFormValues, { setSubmitting }: FormikHelpers ) { setMadeChanges(false); setSubmitting(true); const req = await fetch("/api/update", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ displayName, email, avatar: avatar != null ? avatar.split(",")[1] : null }) }); setSubmitting(false); try { const res: UpdateResponse = await req.json(); if (!res.ok && res.error !== null) { switch (res.error) { case "avatarBig": break; } } setMadeChanges(true); } catch { console.error(req); } } const [passwordError, setPasswordError] = React.useState(null); const initialPasswordValues: PasswordUpdateFormValues = { password: "", newPassword: "", confirmPassword: "" }; async function handlePasswordSubmit( { password, newPassword }: PasswordUpdateFormValues, { setFieldError, setSubmitting }: FormikHelpers ) { setMadePasswordChanges(false); setSubmitting(true); const req = await fetch("/api/changePassword", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ currentPassword: password, newPassword: newPassword }) }); setSubmitting(false); try { const res: UpdateResponse = await req.json(); if (!res.ok && res.error !== null) { switch (res.error) { case "incorrectPassword": setFieldError("password", "Incorrect password."); break; } } setMadePasswordChanges(true); } catch { console.error(req); } } return (

{info.username}

{({ isSubmitting }) => (
{madeProfileChanges ? Saved your changes. : null} ( fieldProps.form.setFieldValue("avatar", newBlob) } /> )} /> )}

Change password

{({ isSubmitting }) => (
{madePasswordChanges ? ( Changed your password. ) : null}
)}

Connections

{providers.map((provider) => ( ))}

{ document.cookie = "ticket=; expires=" + new Date().toUTCString() + "; path=/"; window.location.href = "/"; }} />
); }