63 lines
1.4 KiB
TypeScript
63 lines
1.4 KiB
TypeScript
import type { ResponseGetData } from '@/api/ius/types';
|
|
import { create } from 'zustand';
|
|
|
|
type Values = ResponseGetData;
|
|
|
|
type ElementValidation = {
|
|
message: string;
|
|
valid: boolean;
|
|
};
|
|
|
|
type FormState = {
|
|
defaultValues: Values;
|
|
init: (values: Values) => void;
|
|
reset: () => void;
|
|
resetValidation: () => void;
|
|
setValidation: (input: { name: string } & ElementValidation) => void;
|
|
setValue: ({ name, value }: { name: string; value: Values[number] }) => void;
|
|
status?: 'init' | 'edited';
|
|
validation: Record<string, ElementValidation | undefined>;
|
|
values: Values;
|
|
};
|
|
|
|
export const useFormStore = create<FormState>((set) => ({
|
|
defaultValues: {},
|
|
init: (values) =>
|
|
set(() => ({
|
|
defaultValues: values,
|
|
status: 'init',
|
|
values,
|
|
})),
|
|
reset: () =>
|
|
set((state) => ({
|
|
status: 'init',
|
|
validation: {},
|
|
values: state.defaultValues,
|
|
})),
|
|
resetValidation: () =>
|
|
set(() => ({
|
|
validation: {},
|
|
})),
|
|
setValidation: ({ message, name, valid }) =>
|
|
set((state) => ({
|
|
validation: {
|
|
...state.validation,
|
|
[name]: { message, valid },
|
|
},
|
|
})),
|
|
setValue: ({ name, value }) =>
|
|
set((state) => ({
|
|
status: 'edited',
|
|
validation: {
|
|
...state.validation,
|
|
[name]: undefined,
|
|
},
|
|
values: {
|
|
...state.values,
|
|
[name]: value,
|
|
},
|
|
})),
|
|
validation: {},
|
|
values: {},
|
|
}));
|