169 lines
4.7 KiB
TypeScript
169 lines
4.7 KiB
TypeScript
import React, { useState, useEffect } from "react";
|
||
import CommonPopup from "@/components/CommonPopup";
|
||
import { View } from "@tarojs/components";
|
||
import Picker from "./Picker";
|
||
import {
|
||
renderYearMonth,
|
||
renderYearMonthDay,
|
||
renderHourMinute,
|
||
} from "./PickerData";
|
||
import NTRPTestEntryCard from "../NTRPTestEntryCard";
|
||
import { EvaluateScene } from "@/store/evaluateStore";
|
||
// import imgs from "@/config/images";
|
||
import styles from "./index.module.scss";
|
||
interface PickerOption {
|
||
text: string | number;
|
||
value: string | number;
|
||
}
|
||
|
||
interface PickerProps {
|
||
minYear?: number;
|
||
maxYear?: number;
|
||
title?: string;
|
||
showHeader?: boolean;
|
||
confirmText?: string;
|
||
visible: boolean;
|
||
setvisible: (visible: boolean) => void;
|
||
options?: PickerOption[][] | PickerOption[];
|
||
value?: (string | number)[];
|
||
type?: "month" | "day" | "hour" | "ntrp" | null;
|
||
// img?: string;
|
||
onConfirm?: (options: PickerOption[], values: (string | number)[]) => void;
|
||
onChange?: (value: (string | number)[]) => void;
|
||
style?: React.CSSProperties;
|
||
ntrpTested?: boolean;
|
||
}
|
||
|
||
const PopupPicker = ({
|
||
minYear,
|
||
maxYear,
|
||
confirmText,
|
||
title,
|
||
showHeader,
|
||
visible,
|
||
setvisible,
|
||
value = [],
|
||
// img,
|
||
onConfirm,
|
||
onChange,
|
||
options = [],
|
||
type = null,
|
||
style,
|
||
ntrpTested,
|
||
}: PickerProps) => {
|
||
const [defaultValue, setDefaultValue] = useState<(string | number)[]>([]);
|
||
const [defaultOptions, setDefaultOptions] = useState<PickerOption[][]>([...options]);
|
||
const [pickerCurrentValue, setPickerCurrentValue] =
|
||
useState<(string | number)[]>(value);
|
||
|
||
const changePicker = (options: any[], values: any, columnIndex: number) => {
|
||
// 更新 Picker 的当前值
|
||
setPickerCurrentValue(values);
|
||
|
||
if (onChange) {
|
||
console.log("picker onChange", columnIndex, values, options);
|
||
if (
|
||
type === "day" &&
|
||
JSON.stringify(defaultValue) !== JSON.stringify(values)
|
||
) {
|
||
const [year, month] = values;
|
||
const daysInMonth = new Date(Number(year), Number(month), 0).getDate();
|
||
const dayOptions = Array.from({ length: daysInMonth }, (_, i) => ({
|
||
text: i + 1 + "日",
|
||
value: i + 1,
|
||
}));
|
||
const newOptions = [...defaultOptions];
|
||
if (JSON.stringify(newOptions[2]) !== JSON.stringify(dayOptions)) {
|
||
newOptions[2] = dayOptions;
|
||
setDefaultOptions(newOptions);
|
||
}
|
||
}
|
||
|
||
if (JSON.stringify(defaultValue) !== JSON.stringify(values)) {
|
||
setDefaultValue(values);
|
||
}
|
||
}
|
||
};
|
||
|
||
// 处理 Picker 的确认事件,获取当前选中的值
|
||
const handlePickerConfirm = (
|
||
options: PickerOption[],
|
||
values: (string | number)[]
|
||
) => {
|
||
setPickerCurrentValue(values);
|
||
setDefaultValue(values);
|
||
};
|
||
|
||
const handleConfirm = () => {
|
||
// 如果用户滚动过(defaultValue 不为空),使用 defaultValue
|
||
// 如果用户没有滚动(defaultValue 为空),使用传入的默认值(即当前显示的默认选项)
|
||
const valueToSave = defaultValue.length > 0 ? defaultValue : value;
|
||
if (onChange && valueToSave.length > 0) {
|
||
onChange(valueToSave);
|
||
}
|
||
setvisible(false);
|
||
};
|
||
|
||
const dialogClose = () => {
|
||
setvisible(false);
|
||
};
|
||
useEffect(() => {
|
||
if (type === "month") {
|
||
setDefaultOptions(renderYearMonth());
|
||
} else if (type === "day") {
|
||
setDefaultOptions(renderYearMonthDay(minYear, maxYear));
|
||
} else if (type === "hour") {
|
||
setDefaultOptions(renderHourMinute());
|
||
} else {
|
||
setDefaultOptions(options);
|
||
}
|
||
}, [type]);
|
||
|
||
// 当选择器打开时,初始化 defaultValue 和 pickerCurrentValue
|
||
useEffect(() => {
|
||
if (visible) {
|
||
if (value.length > 0) {
|
||
setDefaultValue([...value]);
|
||
setPickerCurrentValue([...value]);
|
||
} else {
|
||
// 如果 value 为空,重置为初始状态
|
||
setDefaultValue([]);
|
||
setPickerCurrentValue([]);
|
||
}
|
||
}
|
||
}, [visible, value]);
|
||
return (
|
||
<>
|
||
<CommonPopup
|
||
visible={visible}
|
||
onClose={dialogClose}
|
||
showHeader={showHeader || false}
|
||
title={title || null}
|
||
hideFooter={false}
|
||
cancelText="取消"
|
||
confirmText={confirmText || "完成"}
|
||
onConfirm={handleConfirm}
|
||
position="bottom"
|
||
round
|
||
zIndex={1000}
|
||
style={style}
|
||
>
|
||
{type === "ntrp" && !ntrpTested && (
|
||
<View className={styles.evaluateCardWrap}>
|
||
<NTRPTestEntryCard type={EvaluateScene.userEdit} />
|
||
</View>
|
||
)}
|
||
<Picker
|
||
visible={visible}
|
||
options={defaultOptions}
|
||
defaultValue={value}
|
||
onChange={changePicker}
|
||
onConfirm={handlePickerConfirm}
|
||
/>
|
||
</CommonPopup>
|
||
</>
|
||
);
|
||
};
|
||
|
||
export default PopupPicker;
|