react-native-priv-sdk
Version:
Official MyCover.ai SDK. Supercharge your product with MyCover AI Insurance offerings. Create embedded insurance offerings or full white label insurance applications that excite your customers.
353 lines (303 loc) • 13.5 kB
text/typescript
import { create } from 'zustand';
import { FormFieldModel } from '../models/FormFieldModel';
import { UssdProviderModel } from '../models/UssdProviderModel';
import { ProductCategoriesModel } from '../models/ProductCategoriesModel';
import { ProductDetailsModel } from '../models/ProductDetailsModel';
import { FormDataUrlResponse } from '../models/FormDataUrlResponse';
import { type FileData } from '../screens/purchase/form/components/CustomImagePicker';
export interface FormStoreState {
formData: Record<string, any>;
globalItemPair: Record<string, any>;
urlFormData: Map<string, FormDataUrlResponse[]>;
showFullScreenLoader: boolean;
urlDependents: Map<string, FormFieldModel>;
imageList: Array<Map<string, FileData>>;
imagePlaceholder: Map<string, string>;
tempImagePlaceholder: Map<string, string>;
productPrice: number;
autoValidate: boolean;
selectedBank: UssdProviderModel | null;
selectedProductCategory: ProductCategoriesModel | null;
selectedProductDetails: ProductDetailsModel | null;
globalItemList: Array<Record<string, any>>;
formErrors: Map<string, any>;
shouldValidateImageplusDrop: boolean;
}
export interface FormStoreActions {
setFormData: (key: string, value: any) => void;
updateSetFormData: (
key: string,
value: ((prevFormData: Record<string, any>) => Record<string, any>) | any
) => void;
updateFormData: (newFormData: Record<string, any>) => void;
setGlobalItemPair: (key: string, value: any) => void;
setUrlFormData: (key: string, value: FormDataUrlResponse[]) => void;
setUrlDependents: (key: string, value: FormFieldModel) => void;
clearFormData: () => void;
clearUrlFormData: () => void;
setShowFullScreenLoader: (showFullScreenLoader: boolean) => void;
setImageList: (key: string, fileData: FileData) => void;
setImagePlaceholder: (key: string, value: string) => void;
setTempImagePlaceholder: (key: string, value: string) => void;
setProductPrice: (productPrice: number) => void;
setAutoValidate: (autoValidate: boolean) => void;
setSelectedBank: (selectedBank: UssdProviderModel | null) => void;
setSelectedProductCategory: (
selectedProductCategory: ProductCategoriesModel | null
) => void;
setSelectedProductDetails: (
selectedProductDetails: ProductDetailsModel | null
) => void;
removeItemGlobalItemList: (index: number) => void;
setGlobalItemList: (globalItemList: Array<Record<string, any>>) => void;
updateGlobalItemList: (newItem: Record<string, any>) => void;
newUpdateGlobalItemList: (newItem: Record<string, any>) => void;
setFormErrors: (key: string, value: any) => void;
removeFormError: (key: string) => void;
clearFormErrors: () => void;
clearGlobalItemPair: () => void;
// New remove actions
removeImageList: (key: string) => void;
removeTempImagePlaceholder: (key: string) => void;
removeImagePlaceholder: (key: string) => void;
removeFormData: (key: string) => void;
removeGlobalItemPair: (key: string) => void;
setShouldValidateImageplusDrop: (
shouldValidateImageplusDrop: boolean
) => void;
// Reset functions
resetFormData: () => void;
resetUrlFormData: () => void;
resetShowFullScreenLoader: () => void;
resetUrlDependents: () => void;
resetImageList: () => void;
resetImagePlaceholder: () => void;
resetTempImagePlaceholder: () => void;
resetProductPrice: () => void;
resetAutoValidate: () => void;
resetSelectedBank: () => void;
resetSelectedProductCategory: () => void;
resetSelectedProductDetails: () => void;
resetGlobalItemList: () => void;
resetGlobalItemPair: () => void;
resetFormErrors: () => void;
resetShouldValidateImageplusDrop: () => void;
}
export interface FormStore extends FormStoreState, FormStoreActions {}
export const useFormStore = create<FormStore>((set) => ({
formData: {} as Record<string, any>,
globalItemPair: {} as Record<string, any>,
urlFormData: new Map<string, FormDataUrlResponse[]>(),
showFullScreenLoader: false,
urlDependents: new Map<string, FormFieldModel>(),
imageList: [] as Array<Map<string, FileData>>,
imagePlaceholder: new Map<string, string>(),
tempImagePlaceholder: new Map<string, string>(),
productPrice: 0 as number,
autoValidate: false,
selectedBank: null as UssdProviderModel | null,
selectedProductCategory: null as ProductCategoriesModel | null,
selectedProductDetails: null as ProductDetailsModel | null,
globalItemList: [] as Array<Record<string, any>>,
formErrors: new Map<string, any>(),
shouldValidateImageplusDrop: false,
// New remove actions
removeImageList: (key) =>
set((state) => {
const updatedImageList = state.imageList.map((map) => {
map.delete(key); // remove the key from each map
return map;
});
return { imageList: updatedImageList };
}),
removeImagePlaceholder: (key) =>
set((state) => {
state.imagePlaceholder.delete(key);
return { imagePlaceholder: state.imagePlaceholder };
}),
removeTempImagePlaceholder: (key) =>
set((state) => {
state.tempImagePlaceholder.delete(key);
return { tempImagePlaceholder: state.tempImagePlaceholder };
}),
removeFormData: (key) =>
set((state) => {
const updatedFormData = { ...state.formData };
delete updatedFormData[key];
return { formData: updatedFormData };
}),
removeItemGlobalItemList: (index: number) =>
set((state) => {
const updatedList = [...state.globalItemList]; // Copy current list
updatedList.splice(index, 1); // Remove the item at the specified index
return { globalItemList: updatedList }; // Return updated list
}),
//
removeGlobalItemPair: (key) =>
set((state) => {
const updatedGlobalItemPair = { ...state.globalItemPair };
delete updatedGlobalItemPair[key];
return { globalItemPair: updatedGlobalItemPair };
}),
setFormData: (key: string, value: any) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedFormData = { ...state.formData, [key]: value };
return { formData: updatedFormData };
}),
updateSetFormData: (key, value) =>
set((state) => {
const updatedFormData =
typeof value === 'function'
? value(state.formData) // Functional update
: { ...state.formData, [key]: value }; // Direct update
return { formData: updatedFormData };
}),
// updateSetFormData: (
// key: string,
// value: ((prevFormData: Record<string, any>) => Record<string, any>) | any,
// ) =>
// set((state: FormStoreState & FormStoreActions) => {
// // Check if value is a function, and call it with the current formData
// const updatedFormData =
// typeof value === 'function'
// ? value(state.formData) // If value is a function, pass current formData to it
// : {...state.formData, [key]: value}; // Otherwise, directly update formData
// return {formData: updatedFormData};
// }),
updateFormData: (newFormData: Record<string, any>) =>
set(() => {
return { formData: newFormData };
}),
setGlobalItemPair: (key: string, value: any) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedGlobalItemPair = { ...state.globalItemPair, [key]: value };
return { globalItemPair: updatedGlobalItemPair };
}),
setUrlFormData: (key: string, value: FormDataUrlResponse[]) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedUrlFormData = new Map(state.urlFormData);
updatedUrlFormData.set(key, value);
return { urlFormData: updatedUrlFormData };
}),
// setUrlDependents: (urlDependents: Map<string, FormFieldModel>) =>
// set(() => ({urlDependents})),
setUrlDependents: (key: string, value: FormFieldModel) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedUrlDependents = new Map(state.urlDependents);
updatedUrlDependents.set(key, value);
return { urlDependents: updatedUrlDependents };
}),
clearFormData: () =>
set(() => {
return { formData: new Map<string, any>() };
}),
// Renamed function to clear the urlFormData map
clearUrlFormData: () =>
set(() => {
return { urlFormData: new Map<string, FormDataUrlResponse[]>() };
}),
// setGlobalItemPair: (key: string, value: any) =>
// set((state: FormStoreState & FormStoreActions) => {
// const updatedGlobalItemPair = new Map(state.globalItemPair);
// updatedGlobalItemPair.set(key, value);
// return {globalItemPair: updatedGlobalItemPair};
// }),
setFormErrors: (key: string, value: any) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedFormErrors = new Map(state.formErrors);
updatedFormErrors.set(key, value);
return { formErrors: updatedFormErrors };
}),
removeFormError: (key: string) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedFormErrors = new Map(state.formErrors);
updatedFormErrors.delete(key); // Remove the error associated with the key
return { formErrors: updatedFormErrors };
}),
// Function to clear the globalItemPair map
clearGlobalItemPair: () =>
set(() => {
return { globalItemPair: new Map<string, any>() };
}),
// Function to clear the formErrors map
clearFormErrors: () =>
set(() => {
return { formErrors: new Map<string, any>() };
}),
setShowFullScreenLoader: (showFullScreenLoader: boolean) =>
set(() => ({ showFullScreenLoader })),
setImageList: (key: string, fileData: FileData) =>
set((state: FormStoreState & FormStoreActions) => {
// Create a new map entry with the key and fileData
const newEntry = new Map<string, FileData>();
newEntry.set(key, fileData);
const updatedImageList = [...state.imageList, newEntry];
return { imageList: updatedImageList };
}),
setImagePlaceholder: (key: string, value: string) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedImagePlaceholder = new Map(state.imagePlaceholder);
updatedImagePlaceholder.set(key, value); // Set the key-value pair
return { imagePlaceholder: updatedImagePlaceholder };
}),
setTempImagePlaceholder: (key: string, value: string) =>
set((state: FormStoreState & FormStoreActions) => {
const updatedTempImagePlaceholder = new Map(state.tempImagePlaceholder);
updatedTempImagePlaceholder.set(key, value); // Set the key-value pair
return { tempImagePlaceholder: updatedTempImagePlaceholder };
}),
setProductPrice: (productPrice: number) => set(() => ({ productPrice })),
setAutoValidate: (autoValidate: boolean) => set(() => ({ autoValidate })),
setSelectedBank: (selectedBank: UssdProviderModel | null) =>
set(() => ({ selectedBank })),
setSelectedProductCategory: (
selectedProductCategory: ProductCategoriesModel | null
) => set(() => ({ selectedProductCategory })),
setSelectedProductDetails: (
selectedProductDetails: ProductDetailsModel | null
) => set(() => ({ selectedProductDetails })),
setGlobalItemList: (globalItemList: Array<Record<string, any>>) =>
set(() => ({ globalItemList })),
updateGlobalItemList: (newItem: Record<string, any>) =>
set((state) => ({
globalItemList: [...state.globalItemList, newItem], // Add new item to the array
})),
newUpdateGlobalItemList: (
newItem: Record<string, any> | ((prevGlobalItemList: any[]) => any[])
) =>
set((state: FormStoreState & FormStoreActions) => {
// Check if newItem is a function, and call it with the current globalItemList
const updatedGlobalItemList =
typeof newItem === 'function'
? newItem(state.globalItemList) // If it's a function, pass current globalItemList to it
: [...state.globalItemList, newItem]; // Otherwise, add the new item directly to the list
return { globalItemList: updatedGlobalItemList };
}),
setShouldValidateImageplusDrop: (shouldValidateImageplusDrop: boolean) =>
set(() => ({ shouldValidateImageplusDrop })),
// Reset functions
resetFormData: () => set(() => ({ formData: {} })),
resetUrlFormData: () =>
set(() => ({ urlFormData: new Map<string, FormDataUrlResponse[]>() })),
resetShowFullScreenLoader: () => set(() => ({ showFullScreenLoader: false })),
resetUrlDependents: () =>
set(() => ({ urlDependents: new Map<string, FormFieldModel>() })),
resetImageList: () => set(() => ({ imageList: [] })),
resetImagePlaceholder: () =>
set(() => ({ imagePlaceholder: new Map<string, string>() })),
resetTempImagePlaceholder: () =>
set(() => ({ tempImagePlaceholder: new Map<string, string>() })),
resetProductPrice: () => set(() => ({ productPrice: 0 })),
resetAutoValidate: () => set(() => ({ autoValidate: false })),
resetSelectedBank: () => set(() => ({ selectedBank: null })),
resetSelectedProductCategory: () =>
set(() => ({ selectedProductCategory: null })),
resetSelectedProductDetails: () =>
set(() => ({ selectedProductDetails: null })),
resetGlobalItemList: () => set(() => ({ globalItemList: [] })),
resetGlobalItemPair: () =>
set(() => ({ globalItemPair: new Map<string, any>() })),
resetFormErrors: () => set(() => ({ formErrors: new Map<string, any>() })),
resetShouldValidateImageplusDrop: () =>
set(() => ({ shouldValidateImageplusDrop: false })),
}));