Files
mini-programs/src/components/NTRPEvaluatePopup/index.tsx
2026-02-11 09:09:53 +08:00

202 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import React, {
useState,
useImperativeHandle,
useEffect,
forwardRef,
memo,
} from "react";
import { Button, Input, View, Text, Image } from "@tarojs/components";
import Taro from "@tarojs/taro";
import classnames from "classnames";
import CommonPopup from "../CommonPopup";
import { useUserActions, useUserInfo } from "@/store/userStore";
import { EvaluateCallback, EvaluateScene } from "@/store/evaluateStore";
import { useNtrpLevels } from "@/store/pickerOptionsStore";
import NTRPTestEntryCard from "../NTRPTestEntryCard";
import NtrpPopupGuide from "../NTRPPopupGuide";
import Picker from "../Picker/Picker";
import CloseIcon from "@/static/ntrp/ntrp_popup_close.svg";
import styles from "./index.module.scss";
export enum EvaluateType {
EDIT = "edit",
EVALUATE = "evaluate",
}
export enum DisplayConditionType {
AUTO = "auto",
ALWAYS = "always",
}
export enum SceneType {
LIST = "list",
PUBLISH = "publish",
PERSONAL = "personal",
DETAIL = "detail",
}
interface NTRPEvaluatePopupProps {
// types: EvaluateType[];
// displayCondition: DisplayConditionType;
// scene: SceneType;
showGuide: boolean;
type: EvaluateScene;
// children: React.ReactNode;
}
// function showCondition(scene, ntrp) {
// if (scene === "list") {
// // TODO: 显示频率
// return Math.random() < 0.1 && [0, undefined].includes(ntrp);
// }
// return true;
// return !ntrpLevels.includes(ntrp);
// }
const NTRPEvaluatePopup = (props: NTRPEvaluatePopupProps, ref) => {
const {
// types = ["edit", "evaluate"],
// displayCondition = "auto",
// scene = "list",
type,
showGuide = false,
} = props;
const [visible, setVisible] = useState(false);
const [ntrp, setNtrp] = useState<string>("1.5");
const [guideShow, setGuideShow] = useState(() => showGuide);
const { updateUserInfo } = useUserActions();
const userInfo = useUserInfo();
const ntrpLevels = useNtrpLevels();
const [evaCallback, setEvaCallback] = useState<EvaluateCallback>({
type: "",
next: () => {},
onCancel: () => {},
});
useImperativeHandle(ref, () => ({
show: (evaluateCallback) => {
setVisible(true);
setEvaCallback(evaluateCallback);
},
}));
// function handleEvaluate() {
// setVisible(false);
// // TODO: 实现NTRP评估逻辑
// Taro.navigateTo({
// url: `/other_pages/ntrp-evaluate/index?redirect=${encodeURIComponent(
// getCurrentFullPath()
// )}`,
// });
// }
// 当弹窗打开或用户信息变化时,从用户信息中提取并更新 ntrp 状态
useEffect(() => {
if (visible) {
if (userInfo?.ntrp_level) {
// 从 ntrp_level 中提取数字部分(如 "2.5" 或 "NTRP 2.5"
const match = String(userInfo.ntrp_level).match(/-?\d+(\.\d+)?/);
if (match) {
setNtrp(match[0]);
} else {
setNtrp("1.5");
}
} else {
setNtrp("1.5");
}
}
}, [visible, userInfo?.ntrp_level]);
// const showEntry =
// displayCondition === "auto"
// ? showCondition(scene, ntrp)
// : displayCondition === "always";
function handleClose() {
console.log("hide ....");
setVisible(false);
setGuideShow(showGuide);
}
async function handleChangeNtrp() {
Taro.showLoading({ title: "修改中" });
// 更新用户信息,会自动更新 store 中的 ntrp_level
await updateUserInfo({ ntrp_level: ntrp });
Taro.hideLoading();
Taro.showToast({
title: "NTRP水平修改成功",
icon: "none",
});
evaCallback.next({ flag: true, score: String(ntrp) });
handleClose();
}
return (
<>
<CommonPopup
title="NTRP评估"
visible={visible}
onClose={handleClose}
showHeader={false}
hideFooter
enableDragToClose={false}
>
{guideShow ? (
<NtrpPopupGuide
close={() => handleClose()}
skipGuide={() => {
setGuideShow(false);
}}
evaluateCallback={evaCallback}
/>
) : (
<View className={styles.container}>
<View className={styles.header}>
<Text> NTRP </Text>
<View className={styles.closeBtn} onClick={handleClose}>
<Image className={styles.closeIcon} src={CloseIcon} />
</View>
</View>
<View className={styles.entryCard}>
<NTRPTestEntryCard type={type} evaluateCallback={evaCallback} />
</View>
<View className={styles.picker}>
{/* FIXME: 有异常渲染问题 */}
{visible && (
<Picker
visible
options={ntrpLevels}
defaultValue={[ntrp]}
onChange={(val) => {
console.log(val[0]);
if (val[0]?.value) {
setNtrp(val[0]?.value as string);
}
}}
/>
)}
</View>
<View className={styles.actions}>
<View className={styles.buttonWrap}>
<Button className={styles.button} onClick={handleClose}>
</Button>
</View>
<View className={styles.buttonWrap}>
<Button
className={classnames(styles.button, styles.primary)}
onClick={handleChangeNtrp}
>
</Button>
</View>
</View>
</View>
)}
</CommonPopup>
</>
);
};
export default memo(forwardRef(NTRPEvaluatePopup));