purewhiter--mobilegym
96 行
2.6 KiB
TypeScript
96 行
2.6 KiB
TypeScript
import { createAppStoreWithActions } from '../../os/createAppStore';
|
|
import type { AnswerSheetState, Field } from './types';
|
|
|
|
// ── 默认数据(演示用,正式运行时由 Runner 通过 set_state 注入) ──
|
|
const DEMO_FIELDS: Field[] = [
|
|
{
|
|
type: 'choice',
|
|
label: '温差更大的城市',
|
|
options: ['北京', '上海', '一样大'],
|
|
},
|
|
{
|
|
type: 'number',
|
|
label: '会议数量',
|
|
hint: '请填写整数',
|
|
},
|
|
{
|
|
type: 'text',
|
|
label: '日期',
|
|
hint: '如:周一',
|
|
repeatable: true,
|
|
},
|
|
];
|
|
|
|
const initialState: AnswerSheetState = {
|
|
question: '北京和上海,明天哪个城市温差更大?一共有几场会议?哪几天有雨?',
|
|
hint: '请根据查询结果填写以下信息',
|
|
fields: DEMO_FIELDS,
|
|
answers: {},
|
|
submitted: false,
|
|
};
|
|
|
|
// ── Actions ──
|
|
|
|
interface AnswerSheetActions {
|
|
setAnswer: (fieldIndex: number, value: string | string[]) => void;
|
|
addRepeatableItem: (fieldIndex: number) => void;
|
|
removeRepeatableItem: (fieldIndex: number, itemIndex: number) => void;
|
|
updateRepeatableItem: (fieldIndex: number, itemIndex: number, value: string) => void;
|
|
submit: () => void;
|
|
unsubmit: () => void;
|
|
}
|
|
|
|
export const useAnswerSheetStore = createAppStoreWithActions<
|
|
AnswerSheetState,
|
|
AnswerSheetActions
|
|
>(
|
|
'answer_sheet',
|
|
initialState,
|
|
(set) => ({
|
|
setAnswer: (fieldIndex, value) => {
|
|
set((state) => ({
|
|
answers: { ...state.answers, [String(fieldIndex)]: value },
|
|
}));
|
|
},
|
|
|
|
addRepeatableItem: (fieldIndex) => {
|
|
set((state) => {
|
|
const key = String(fieldIndex);
|
|
const current = state.answers[key];
|
|
const list = Array.isArray(current) ? [...current] : current ? [current] : [];
|
|
list.push('');
|
|
return { answers: { ...state.answers, [key]: list } };
|
|
});
|
|
},
|
|
|
|
removeRepeatableItem: (fieldIndex, itemIndex) => {
|
|
set((state) => {
|
|
const key = String(fieldIndex);
|
|
const current = state.answers[key];
|
|
if (!Array.isArray(current)) return {};
|
|
const list = current.filter((_, i) => i !== itemIndex);
|
|
return { answers: { ...state.answers, [key]: list } };
|
|
});
|
|
},
|
|
|
|
updateRepeatableItem: (fieldIndex, itemIndex, value) => {
|
|
set((state) => {
|
|
const key = String(fieldIndex);
|
|
const current = state.answers[key];
|
|
if (!Array.isArray(current)) return {};
|
|
const list = [...current];
|
|
list[itemIndex] = value;
|
|
return { answers: { ...state.answers, [key]: list } };
|
|
});
|
|
},
|
|
|
|
submit: () => {
|
|
set({ submitted: true });
|
|
},
|
|
|
|
unsubmit: () => {
|
|
set({ submitted: false });
|
|
},
|
|
}),
|
|
);
|