summaryrefslogtreecommitdiff
path: root/src-migrate/modules/register/stores
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2025-01-15 16:29:48 +0700
committerit-fixcomart <it@fixcomart.co.id>2025-01-15 16:29:48 +0700
commit98236a47c3558c4b701009a275c7ae917ee8bf67 (patch)
tree21e0300680a724c8a24ed815ea4e9a32ab13a895 /src-migrate/modules/register/stores
parent1fa1a7873aa67cdd9ca211c239276a148cd4cdda (diff)
parent7a14ed5ccdde86d0400d6aa02ac866317d4add63 (diff)
Merge branch 'new-release' into Feature/switch-account
# Conflicts: # src/lib/auth/components/CompanyProfile.jsx # src/lib/auth/components/Menu.jsx
Diffstat (limited to 'src-migrate/modules/register/stores')
-rw-r--r--src-migrate/modules/register/stores/usePengajuanTempoStore.ts334
1 files changed, 334 insertions, 0 deletions
diff --git a/src-migrate/modules/register/stores/usePengajuanTempoStore.ts b/src-migrate/modules/register/stores/usePengajuanTempoStore.ts
new file mode 100644
index 00000000..1e086c06
--- /dev/null
+++ b/src-migrate/modules/register/stores/usePengajuanTempoStore.ts
@@ -0,0 +1,334 @@
+import { create } from 'zustand';
+import {
+ TempoProps,
+ TempoPropsKontakPerson,
+ TempoPropsPengiriman,
+ TempoPropsSupplier,
+ TempoPropsDokumen,
+} from '~/types/tempo';
+import {
+ TempoSchema,
+ TempoSchemaKontakPerson,
+ TempoSchemaPengiriman,
+ TempoSchemaSupplier,
+ TempoSchemaDokumen,
+} from '~/validations/tempo';
+import { boolean, ZodError } from 'zod';
+
+type State = {
+ form: TempoProps;
+ errors: {
+ [key in keyof TempoProps]?: string;
+ };
+ isCheckedTNC: boolean;
+ isOpenTNC: boolean;
+ isValidCaptcha: boolean;
+};
+
+type Action = {
+ updateForm: (name: string, value: string) => void;
+ updateValidCaptcha: (value: boolean) => void;
+ toggleCheckTNC: () => void;
+ openTNC: () => void;
+ closeTNC: () => void;
+ validate: () => void;
+ resetForm: () => void;
+};
+
+export const usePengajuanTempoStore = create<State & Action>((set, get) => ({
+ form: {
+ name: '',
+ industryId: '',
+ street: '',
+ state: '',
+ city: '',
+ district: '',
+ subDistrict: '',
+ zip: '',
+ mobile: '',
+ bankName: '',
+ accountName: '',
+ accountNumber: '',
+ estimasi: '',
+ tempoDuration: '',
+ bersedia: '',
+ portal: '',
+ website: '',
+ categoryProduk: '',
+ tempoLimit: '',
+ },
+ updateForm: (name, value) =>
+ set((state) => ({ form: { ...state.form, [name]: value } })),
+
+ errors: {},
+ validate: () => {
+ try {
+ TempoSchema.parse(get().form);
+ set({ errors: {} });
+ } catch (error) {
+ if (error instanceof ZodError) {
+ const errors: State['errors'] = {};
+ error.errors.forEach(
+ (e) => (errors[e.path[0] as keyof TempoProps] = e.message)
+ );
+ set({ errors });
+ }
+ }
+ },
+
+ isCheckedTNC: false,
+ toggleCheckTNC: () => set((state) => ({ isCheckedTNC: !state.isCheckedTNC })),
+
+ isOpenTNC: false,
+ openTNC: () => set(() => ({ isOpenTNC: true })),
+ closeTNC: () => set(() => ({ isOpenTNC: false })),
+
+ isValidCaptcha: false,
+ updateValidCaptcha: (value) => set(() => ({ isValidCaptcha: value })),
+
+ resetForm: () =>
+ set({
+ form: {
+ name: '',
+ industryId: '',
+ street: '',
+ state: '',
+ city: '',
+ district: '',
+ subDistrict: '',
+ zip: '',
+ mobile: '',
+ bankName: '',
+ accountName: '',
+ accountNumber: '',
+ website: '',
+ estimasi: '',
+ tempoDuration: '',
+ bersedia: '',
+ portal: '',
+ categoryProduk: '',
+ },
+ }),
+}));
+
+type StateKontakPerson = {
+ formKontakPerson: TempoPropsKontakPerson;
+ errorsKontakPerson: {
+ [key in keyof TempoPropsKontakPerson]?: string;
+ };
+};
+type ActionKontakPerson = {
+ updateFormKontakPerson: (name: string, value: string) => void;
+
+ validateKontakPerson: () => void;
+};
+export const usePengajuanTempoStoreKontakPerson = create<
+ StateKontakPerson & ActionKontakPerson
+>((set, get) => ({
+ formKontakPerson: {
+ direkturTittle: '',
+ direkturName: '',
+ direkturMobile: '',
+ direkturEmail: '',
+ purchasingTittle: '',
+ purchasingName: '',
+ purchasingEmail: '',
+ financeMobile: '',
+ financeTittle: '',
+ financeName: '',
+ financeEmail: '',
+ purchasingMobile: '',
+ },
+ updateFormKontakPerson: (name, value) =>
+ set((state) => ({
+ formKontakPerson: { ...state.formKontakPerson, [name]: value },
+ })),
+
+ errorsKontakPerson: {},
+ validateKontakPerson: () => {
+ try {
+ TempoSchemaKontakPerson.parse(get().formKontakPerson);
+ set({ errorsKontakPerson: {} });
+ } catch (error) {
+ if (error instanceof ZodError) {
+ const errorsKontakPerson: StateKontakPerson['errorsKontakPerson'] = {};
+ error.errors.forEach(
+ (e) =>
+ (errorsKontakPerson[e.path[0] as keyof TempoPropsKontakPerson] =
+ e.message)
+ );
+ set({ errorsKontakPerson });
+ }
+ }
+ },
+}));
+
+type StatePengiriman = {
+ formPengiriman: TempoPropsPengiriman;
+ errorsPengiriman: {
+ [key in keyof TempoPropsPengiriman]?: string;
+ };
+};
+type ActionPengiriman = {
+ updateFormPengiriman: (name: string, value: string) => void;
+
+ validatePengiriman: () => void;
+};
+export const usePengajuanTempoStorePengiriman = create<
+ StatePengiriman & ActionPengiriman
+>((set, get) => ({
+ formPengiriman: {
+ PICTittle: '',
+ PICName: '',
+ streetPengiriman: '',
+ statePengiriman: '',
+ cityPengiriman: '',
+ districtPengiriman: '',
+ subDistrictPengiriman: '',
+ zipPengiriman: '',
+ invoicePicTittle: '',
+ invoicePic: '',
+ isSameAddrees: '',
+ isSameAddreesStreet: '',
+ streetInvoice: '',
+ stateInvoice: '',
+ cityInvoice: '',
+ districtInvoice: '',
+ subDistrictInvoice: '',
+ zipInvoice: '',
+ tukarInvoiceInput: '',
+ tukarInvoiceInputPembayaran: '',
+ dokumenPengiriman: '',
+ dokumenPengirimanInput: '',
+ dokumenKirimInput: '',
+ dokumenPengirimanInvoice: '',
+ },
+ updateFormPengiriman: (name, value) =>
+ set((state) => ({
+ formPengiriman: { ...state.formPengiriman, [name]: value },
+ })),
+
+ errorsPengiriman: {},
+ validatePengiriman: () => {
+ try {
+ TempoSchemaPengiriman.parse(get().formPengiriman);
+ set({ errorsPengiriman: {} });
+ } catch (error) {
+ if (error instanceof ZodError) {
+ const errorsPengiriman: StatePengiriman['errorsPengiriman'] = {};
+ error.errors.forEach(
+ (e) =>
+ (errorsPengiriman[e.path[0] as keyof TempoPropsPengiriman] =
+ e.message)
+ );
+ set({ errorsPengiriman });
+ }
+ }
+ },
+}));
+type StateDokumen = {
+ formDokumen: TempoPropsDokumen;
+ errorsDokumen: {
+ [key in keyof TempoPropsDokumen]?: string;
+ };
+};
+type ActionDokumen = {
+ updateFormDokumen: (
+ name: string,
+ fileName: string,
+ fileFormat: string,
+ value: string
+ ) => void;
+
+ validateDokumen: () => void;
+ getJumlahDokumenDiisi: () => void;
+};
+export const usePengajuanTempoStoreDokumen = create<
+ StateDokumen & ActionDokumen
+>((set, get) => ({
+ formDokumen: {
+ dokumenNib: { name: '', format: '', base64: '' },
+ dokumenNpwp: { name: '', format: '', base64: '' },
+ dokumenSppkp: { name: '', format: '', base64: '' },
+ dokumenSiup: { name: '', format: '', base64: '' },
+ dokumenTdp: { name: '', format: '', base64: '' },
+ dokumenSkdp: { name: '', format: '', base64: '' },
+ dokumenSkt: { name: '', format: '', base64: '' },
+ dokumenAktaPerubahan: { name: '', format: '', base64: '' },
+ dokumenKtpDirut: { name: '', format: '', base64: '' },
+ dokumenAktaPendirian: { name: '', format: '', base64: '' },
+ dokumenLaporanKeuangan: { name: '', format: '', base64: '' },
+ dokumenFotoKantor: { name: '', format: '', base64: '' },
+ dokumenTempatBekerja: { name: '', format: '', base64: '' },
+ },
+
+ // Memperbarui dokumen dengan name, format, dan base64
+ updateFormDokumen: (name, fileName, fileFormat, value) =>
+ set((state) => ({
+ formDokumen: {
+ ...state.formDokumen,
+ [name]: {
+ name: fileName,
+ format: fileFormat,
+ base64: value,
+ },
+ },
+ })),
+
+ errorsDokumen: {},
+ validateDokumen: () => {
+ try {
+ TempoSchemaDokumen.parse(get().formDokumen);
+ set({ errorsDokumen: {} });
+ } catch (error) {
+ if (error instanceof ZodError) {
+ const errorsDokumen: StateDokumen['errorsDokumen'] = {};
+ error.errors.forEach(
+ (e) =>
+ (errorsDokumen[e.path[0] as keyof TempoPropsDokumen] = e.message)
+ );
+ set({ errorsDokumen });
+ }
+ }
+ },
+
+ getJumlahDokumenDiisi: () => {
+ const formDokumen = get().formDokumen;
+ // Menghitung jumlah field yang base64 tidak kosong
+ const jumlahTerisi = Object.values(formDokumen).filter(
+ (dokumen) => dokumen.base64 !== ''
+ ).length;
+ return jumlahTerisi;
+ },
+}));
+
+type StateSupplier = {
+ hasSavedata: boolean;
+ formSupplier: [];
+ errorsSupplier: {
+ [key in keyof TempoPropsSupplier]?: string;
+ };
+};
+type ActionSupplier = {
+ updateFormSupplier: (data: []) => void;
+ updateHasSave: (data: boolean) => void;
+ validateSupplier: () => void;
+};
+export const usePengajuanTempoStoreSupplier = create<
+ StateSupplier & ActionSupplier
+>((set, get) => ({
+ formSupplier: [],
+ hasSavedata: true,
+ updateFormSupplier: (data) => {
+ set(() => ({
+ formSupplier: data,
+ }));
+ },
+ updateHasSave: (data) => {
+ set(() => ({
+ hasSavedata: data,
+ }));
+ },
+ errorsSupplier: {},
+ validateSupplier: () => {},
+}));