summaryrefslogtreecommitdiff
path: root/src-migrate
diff options
context:
space:
mode:
authorit-fixcomart <it@fixcomart.co.id>2024-10-17 14:39:17 +0700
committerit-fixcomart <it@fixcomart.co.id>2024-10-17 14:39:17 +0700
commitf555e7bc9d070e7e0bd4900941592480d4ba6c6a (patch)
tree3403b6a19c7f05d73428ba269cff1832bf5074f5 /src-migrate
parent6ea86ff925228528d0323df1ca2fc157afca8fab (diff)
<iman> update pengajuan tempo
Diffstat (limited to 'src-migrate')
-rw-r--r--src-migrate/modules/register/stores/usePengajuanTempoStore.ts93
-rw-r--r--src-migrate/types/tempo.ts59
-rw-r--r--src-migrate/validations/tempo.ts28
3 files changed, 180 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..6f3bc13d
--- /dev/null
+++ b/src-migrate/modules/register/stores/usePengajuanTempoStore.ts
@@ -0,0 +1,93 @@
+import { create } from 'zustand';
+import { TempoProps } from '~/types/tempo';
+import { TempoSchema } 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: '',
+ industry_id: '',
+ street: '',
+ state: '',
+ city: '',
+ zip: '',
+ mobile: '',
+ bankName: '',
+ accountName: '',
+ accountNumber: '',
+ estimasi: '',
+ tempoDuration: '',
+ bersedia: '',
+ 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: '',
+ industry_id: '',
+ street: '',
+ state: '',
+ city: '',
+ zip: '',
+ mobile: '',
+ bankName: '',
+ accountName: '',
+ accountNumber: '',
+ estimasi: '',
+ tempoDuration: '',
+ bersedia: '',
+ categoryProduk: '',
+ tempoLimit: '',
+ },
+ }),
+}));
diff --git a/src-migrate/types/tempo.ts b/src-migrate/types/tempo.ts
new file mode 100644
index 00000000..f8a3c5b8
--- /dev/null
+++ b/src-migrate/types/tempo.ts
@@ -0,0 +1,59 @@
+import { TempoSchema } from '~/validations/tempo';
+import { OdooApiRes } from './odoo';
+import { z } from 'zod';
+
+export type tempoProps = {
+ name: string;
+ industry_id: string;
+ street: string;
+ state: string;
+ city: string;
+ zip: string;
+ mobile: string;
+ bankName: string;
+ accountName: string;
+ accountNumber: string;
+ estimasi: string;
+ tempoDuration: string;
+ bersedia: string;
+};
+
+export type TempoApiProps = OdooApiRes<TempoProps>;
+
+export type TempoProps = z.infer<typeof TempoSchema>;
+
+export type TempoResApiProps = {
+ Tempo: boolean;
+ reason: 'EMAIL_USED' | 'NOT_ACTIVE' | null;
+};
+
+type ActivationResProps = {
+ activation: boolean;
+ user: TempoProps | null;
+};
+
+export type ActivationTokenProps = {
+ token: string;
+};
+
+export type ActivationTokenResApiProps = ActivationResProps & {
+ reason: 'INVALID_TOKEN' | null;
+};
+
+export type ActivationOtpProps = {
+ email: string;
+ otp: string;
+};
+
+export type ActivationOtpResApiProps = ActivationResProps & {
+ reason: 'INVALID_OTP' | null;
+};
+
+export type ActivationReqProps = {
+ email: string;
+};
+
+export type ActivationReqResApiProps = {
+ activation_request: boolean;
+ reason: 'NOT_FOUND' | 'ACTIVE' | null;
+};
diff --git a/src-migrate/validations/tempo.ts b/src-migrate/validations/tempo.ts
new file mode 100644
index 00000000..6999c1c6
--- /dev/null
+++ b/src-migrate/validations/tempo.ts
@@ -0,0 +1,28 @@
+import { z } from 'zod';
+
+export const TempoSchema = z.object({
+ name: z.string().min(1, { message: 'Nama harus diisi' }),
+ street: z.string().min(1, { message: 'Alamat harus diisi' }),
+ industry_id: z.string().min(1, { message: 'Jenis usaha harus dipilih' }),
+ zip: z.string().min(1, { message: 'Kode pos harus diisi' }),
+ state: z.string().min(1, { message: 'Provinsi harus dipilih' }),
+ city: z.string().min(1, { message: 'Kota harus dipilih' }),
+ mobile: z
+ .string()
+ .min(1, { message: 'Nomor telepon harus diisi' })
+ .refine((val) => /^\d{10,12}$/.test(val), {
+ message: 'Format nomor telepon tidak valid, contoh: 081234567890',
+ }),
+ bankName: z.string().min(1, { message: 'Nama bank harus diisi' }),
+ accountName: z.string().min(1, { message: 'Nama rekening harus diisi' }),
+ accountNumber: z.string().min(1, { message: 'Nomor rekening harus diisi' }),
+ estimasi: z
+ .string()
+ .min(1, { message: 'Estimasi pemmbelian pertahun harus diisi' }),
+ tempoDuration: z.string().min(1, { message: 'Durasi tempo harus dipilih' }),
+ tempoLimit: z.string().min(1, { message: 'Limit tempo harus dipilih' }),
+ bersedia: z.string().min(1, { message: 'Harus dipilih' }),
+ categoryProduk: z
+ .string()
+ .min(1, { message: 'Category produk harus dipilih' }),
+});