Update settings.tsx

This commit is contained in:
yorkeking 2023-04-04 01:00:02 +08:00 committed by GitHub
parent 82d7fc0a87
commit e162d66a5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,4 +1,4 @@
import { useState, useEffect, useRef, useMemo } from "react"; import { useState, useEffect, useMemo, HTMLProps } from "react";
import EmojiPicker, { Theme as EmojiTheme } from "emoji-picker-react"; import EmojiPicker, { Theme as EmojiTheme } from "emoji-picker-react";
@ -8,6 +8,8 @@ import ResetIcon from "../icons/reload.svg";
import CloseIcon from "../icons/close.svg"; import CloseIcon from "../icons/close.svg";
import ClearIcon from "../icons/clear.svg"; import ClearIcon from "../icons/clear.svg";
import EditIcon from "../icons/edit.svg"; import EditIcon from "../icons/edit.svg";
import EyeIcon from "../icons/eye.svg";
import EyeOffIcon from "../icons/eye-off.svg";
import { List, ListItem, Popover, showToast } from "./ui-lib"; import { List, ListItem, Popover, showToast } from "./ui-lib";
@ -20,7 +22,7 @@ import {
useUpdateStore, useUpdateStore,
useAccessStore, useAccessStore,
} from "../store"; } from "../store";
import { Avatar, PromptHints } from "./home"; import { Avatar } from "./chat";
import Locale, { AllLangs, changeLang, getLang } from "../locales"; import Locale, { AllLangs, changeLang, getLang } from "../locales";
import { getCurrentVersion } from "../utils"; import { getCurrentVersion } from "../utils";
@ -47,6 +49,28 @@ function SettingItem(props: {
); );
} }
function PasswordInput(props: HTMLProps<HTMLInputElement>) {
const [visible, setVisible] = useState(false);
function changeVisibility() {
setVisible(!visible);
}
return (
<span style={{ display: "flex", justifyContent: "end" }}>
<input
{...props}
style={{ minWidth: "150px" }}
type={visible ? "text" : "password"}
/>
<IconButton
icon={visible ? <EyeIcon /> : <EyeOffIcon />}
onClick={changeVisibility}
/>
</span>
);
}
export function Settings(props: { closeSettings: () => void }) { export function Settings(props: { closeSettings: () => void }) {
const [showEmojiPicker, setShowEmojiPicker] = useState(false); const [showEmojiPicker, setShowEmojiPicker] = useState(false);
const [config, updateConfig, resetConfig, clearAllData, clearSessions] = const [config, updateConfig, resetConfig, clearAllData, clearSessions] =
@ -72,7 +96,6 @@ export function Settings(props: { closeSettings: () => void }) {
} }
const [usage, setUsage] = useState<{ const [usage, setUsage] = useState<{
granted?: number;
used?: number; used?: number;
}>(); }>();
const [loadingUsage, setLoadingUsage] = useState(false); const [loadingUsage, setLoadingUsage] = useState(false);
@ -81,8 +104,7 @@ export function Settings(props: { closeSettings: () => void }) {
requestUsage() requestUsage()
.then((res) => .then((res) =>
setUsage({ setUsage({
granted: res?.total_granted, used: res,
used: res?.total_used,
}), }),
) )
.finally(() => { .finally(() => {
@ -105,6 +127,13 @@ export function Settings(props: { closeSettings: () => void }) {
const builtinCount = SearchService.count.builtin; const builtinCount = SearchService.count.builtin;
const customCount = promptStore.prompts.size ?? 0; const customCount = promptStore.prompts.size ?? 0;
const showUsage = accessStore.token !== "";
useEffect(() => {
if (showUsage) {
checkUsage();
}
}, [showUsage]);
return ( return (
<> <>
<div className={styles["window-header"]}> <div className={styles["window-header"]}>
@ -182,7 +211,7 @@ export function Settings(props: { closeSettings: () => void }) {
{checkingUpdate ? ( {checkingUpdate ? (
<div /> <div />
) : hasNewVersion ? ( ) : hasNewVersion ? (
<Link href="http://leichat.top/" target="_blank" className="link"> <Link href={UPDATE_URL} target="_blank" className="link">
{Locale.Settings.Update.GoToUpdate} {Locale.Settings.Update.GoToUpdate}
</Link> </Link>
) : ( ) : (
@ -285,7 +314,8 @@ export function Settings(props: { closeSettings: () => void }) {
checked={config.sendPreviewBubble} checked={config.sendPreviewBubble}
onChange={(e) => onChange={(e) =>
updateConfig( updateConfig(
(config) => (config.sendPreviewBubble = e.currentTarget.checked), (config) =>
(config.sendPreviewBubble = e.currentTarget.checked),
) )
} }
></input> ></input>
@ -328,14 +358,14 @@ export function Settings(props: { closeSettings: () => void }) {
title={Locale.Settings.AccessCode.Title} title={Locale.Settings.AccessCode.Title}
subTitle={Locale.Settings.AccessCode.SubTitle} subTitle={Locale.Settings.AccessCode.SubTitle}
> >
<input <PasswordInput
value={accessStore.accessCode} value={accessStore.accessCode}
type="text" type="text"
placeholder={Locale.Settings.AccessCode.Placeholder} placeholder={Locale.Settings.AccessCode.Placeholder}
onChange={(e) => { onChange={(e) => {
accessStore.updateCode(e.currentTarget.value); accessStore.updateCode(e.currentTarget.value);
}} }}
></input> />
</SettingItem> </SettingItem>
) : ( ) : (
<></> <></>
@ -345,28 +375,27 @@ export function Settings(props: { closeSettings: () => void }) {
title={Locale.Settings.Token.Title} title={Locale.Settings.Token.Title}
subTitle={Locale.Settings.Token.SubTitle} subTitle={Locale.Settings.Token.SubTitle}
> >
<input <PasswordInput
value={accessStore.token} value={accessStore.token}
type="text" type="text"
placeholder={Locale.Settings.Token.Placeholder} placeholder={Locale.Settings.Token.Placeholder}
onChange={(e) => { onChange={(e) => {
accessStore.updateToken(e.currentTarget.value); accessStore.updateToken(e.currentTarget.value);
}} }}
></input> />
</SettingItem> </SettingItem>
<SettingItem <SettingItem
title={Locale.Settings.Usage.Title} title={Locale.Settings.Usage.Title}
subTitle={ subTitle={
loadingUsage showUsage
? Locale.Settings.Usage.IsChecking ? loadingUsage
: Locale.Settings.Usage.SubTitle( ? Locale.Settings.Usage.IsChecking
usage?.granted ?? "[?]", : Locale.Settings.Usage.SubTitle(usage?.used ?? "[?]")
usage?.used ?? "[?]", : Locale.Settings.Usage.NoAccess
)
} }
> >
{loadingUsage ? ( {!showUsage || loadingUsage ? (
<div /> <div />
) : ( ) : (
<IconButton <IconButton