import * as React from 'react' import { Button, Dialog, TextField, dialog } from "mdui" import useEventListener from "../useEventListener.ts" import { checkApiSuccessOrSncakbar, snackbar } from "../snackbar.ts" import Client from "../../api/Client.ts" import * as CryptoJS from 'crypto-js' import data from "../../Data.ts" import Avatar from "../Avatar.tsx" import User from "../../api/client_data/User.ts" import getUrlForFileByHash from "../../getUrlForFileByHash.ts" interface Refs { myProfileDialogRef: React.MutableRefObject user: User } export default function MyProfileDialog({ myProfileDialogRef, user }: Refs) { const editAvatarButtonRef = React.useRef(null) const chooseAvatarFileRef = React.useRef(null) useEventListener(editAvatarButtonRef, 'click', () => { chooseAvatarFileRef.current!.value = '' chooseAvatarFileRef.current!.click() }) useEventListener(chooseAvatarFileRef, 'change', async (_e) => { const file = chooseAvatarFileRef.current!.files?.[0] as File if (file == null) return let re = await Client.uploadFileLikeApi( 'avatar', file ) if (checkApiSuccessOrSncakbar(re, "上传失败")) return const hash = re.data!.file_hash re = await Client.invoke("User.setAvatar", { token: data.access_token, file_hash: hash }) if (checkApiSuccessOrSncakbar(re, "修改失败")) return snackbar({ message: "修改成功 (刷新页面以更新)", placement: "top", }) }) const userProfileEditDialogRef = React.useRef(null) const editNickNameRef = React.useRef(null) const editUserNameRef = React.useRef(null) const accountSettingsDialogRef = React.useRef(null) const editPasswordDialogRef = React.useRef(null) const editPasswordOldInputRef = React.useRef(null) const editPasswordNewInputRef = React.useRef(null) return (<> { // 公用 - 資料卡 }
{user?.nickname}
userProfileEditDialogRef.current!.open = true}>编辑资料 accountSettingsDialogRef.current!.open = true}>账号设定 {/* 隱私設定 */} dialog({ headline: "退出登录", description: "请确保在退出登录前, 设定了用户名或者已经记录下了用户 ID, 以免无法登录账号", actions: [ { text: "取消", onClick: () => { return true }, }, { text: "确定", onClick: () => { data.refresh_token = '' data.access_token = '' data.apply() location.reload() return true }, } ], })}>退出登录
{ // 账号设定 } editPasswordDialogRef.current!.open = true}>修改密码 accountSettingsDialogRef.current!.open = false}>关闭
editPasswordDialogRef.current!.open = false}>关闭 { const re = await Client.invoke("User.resetPassword", { token: data.access_token, old_password: CryptoJS.SHA256(editPasswordOldInputRef.current?.value || '').toString(CryptoJS.enc.Hex), new_password: CryptoJS.SHA256(editPasswordNewInputRef.current?.value || '').toString(CryptoJS.enc.Hex), }) if (checkApiSuccessOrSncakbar(re, "修改失败")) return snackbar({ message: "修改成功 (其他客户端需要重新登录)", placement: "top", }) data.access_token = re.data!.access_token as string data.refresh_token = re.data!.refresh_token as string data.apply() editPasswordDialogRef.current!.open = false }}>确定
{ // 個人資料編輯 }
{ const input = e.target as HTMLInputElement input.select() input.setSelectionRange(0, 1145141919810) }}> userProfileEditDialogRef.current!.open = false}>取消 { const re = await Client.invoke("User.updateProfile", { token: data.access_token, nickname: editNickNameRef.current?.value, username: editUserNameRef.current?.value, }) if (checkApiSuccessOrSncakbar(re, "修改失败")) return snackbar({ message: "修改成功 (刷新页面以更新)", placement: "top", }) userProfileEditDialogRef.current!.open = false }}>更新
) }