feat(FE): refactor drawer zustand store

This commit is contained in:
randy-ar
2025-12-02 11:01:53 +07:00
parent c76f3a3715
commit 6b5838b5aa
5 changed files with 28 additions and 40 deletions
+3 -5
View File
@@ -4,7 +4,7 @@ import { usePathname, useRouter } from 'next/navigation';
import Drawer from '@/components/Drawer'; import Drawer from '@/components/Drawer';
import React, { ReactNode } from 'react'; import React, { ReactNode } from 'react';
import ProjectFlockTable from '@/components/pages/production/project-flock/ProjectFlockTable'; import ProjectFlockTable from '@/components/pages/production/project-flock/ProjectFlockTable';
import { useProjectFlockUiStore } from '@/stores/ui/slices/production/project-flock.slice'; import { useUiStore } from '@/stores/ui/ui.store';
export default function ProjectFlockLayout({ export default function ProjectFlockLayout({
children, children,
@@ -13,7 +13,7 @@ export default function ProjectFlockLayout({
}) { }) {
const pathname = usePathname(); const pathname = usePathname();
const router = useRouter(); const router = useRouter();
const toggleValidate = useProjectFlockUiStore((s) => s.toggleValidate); const toggleValidate = useUiStore((s) => s.toggleValidate);
const isAdd = pathname.endsWith('/add'); const isAdd = pathname.endsWith('/add');
const isEdit = pathname.includes('/detail/edit'); const isEdit = pathname.includes('/detail/edit');
@@ -23,9 +23,7 @@ export default function ProjectFlockLayout({
const isOpen = isAdd || isEdit || isDetail || isChickin; const isOpen = isAdd || isEdit || isDetail || isChickin;
const handleBackdropClick = () => { const handleBackdropClick = () => {
const unsub = useProjectFlockUiStore const unsub = useUiStore.getState().subscribeIsValid((isValid) => {
.getState()
.subscribeIsValid((isValid) => {
if (isValid) { if (isValid) {
unsub(); // berhenti listen unsub(); // berhenti listen
router.push('/production/project-flock'); router.push('/production/project-flock');
@@ -17,7 +17,7 @@ import {
import { Icon } from '@iconify/react'; import { Icon } from '@iconify/react';
import { FormikErrors, useFormik } from 'formik'; import { FormikErrors, useFormik } from 'formik';
import { useRouter } from 'next/navigation'; import { useRouter } from 'next/navigation';
import { useEffect, useMemo, useState } from 'react'; import { use, useEffect, useMemo, useState } from 'react';
import useSWR, { KeyedMutator } from 'swr'; import useSWR, { KeyedMutator } from 'swr';
import { import {
ProjectFlockBudgetsSchemaType, ProjectFlockBudgetsSchemaType,
@@ -45,8 +45,8 @@ import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWith
import NumberInput from '@/components/input/NumberInput'; import NumberInput from '@/components/input/NumberInput';
import Card from '@/components/Card'; import Card from '@/components/Card';
import ProjectFlockKandangTable from '@/components/pages/production/project-flock/form/ProjectFlockKandangTable'; import ProjectFlockKandangTable from '@/components/pages/production/project-flock/form/ProjectFlockKandangTable';
import { useProjectFlockUiStore } from '@/stores/ui/slices/production/project-flock.slice';
import { Nonstock } from '@/types/api/master-data/nonstock'; import { Nonstock } from '@/types/api/master-data/nonstock';
import { useUiStore } from '@/stores/ui/ui.store';
interface ProjectFlockFormProps { interface ProjectFlockFormProps {
formType?: 'add' | 'edit' | 'detail'; formType?: 'add' | 'edit' | 'detail';
@@ -83,8 +83,8 @@ const ProjectFlockForm = ({
initialValues?.flock_name?.lastIndexOf(' ') initialValues?.flock_name?.lastIndexOf(' ')
) ?? '' ) ?? ''
); );
const subscribeValidate = useProjectFlockUiStore((s) => s.subscribeValidate); const subscribeValidate = useUiStore((s) => s.subscribeValidate);
const setIsValid = useProjectFlockUiStore((s) => s.setIsValid); const setIsValid = useUiStore((s) => s.setIsValid);
const deleteModal = useModal(); const deleteModal = useModal();
const confirmModal = useModal(); const confirmModal = useModal();
@@ -1,21 +1,11 @@
import { DrawerUISlice } from '@/types/stores';
import { StateCreator } from 'zustand'; import { StateCreator } from 'zustand';
import { create } from 'zustand';
import { devtools } from 'zustand/middleware';
export type ProjectFloockUISlice = { export const createDrawerUISlice: StateCreator<
triggerValidate: boolean; DrawerUISlice,
toggleValidate: () => void;
subscribeValidate: (callback: () => void) => void;
isValid: boolean;
setIsValid: (v: boolean) => void;
subscribeIsValid: (callback: (isValid: boolean) => void) => () => void;
};
export const createProjectFlockUiSlice: StateCreator<
ProjectFloockUISlice,
[], [],
[], [],
ProjectFloockUISlice DrawerUISlice
> = (set, get, api) => ({ > = (set, get, api) => ({
// event flag untuk memicu formik validate // event flag untuk memicu formik validate
triggerValidate: false, triggerValidate: false,
@@ -48,14 +38,3 @@ export const createProjectFlockUiSlice: StateCreator<
}); });
}, },
}); });
export const useProjectFlockUiStore = create<ProjectFloockUISlice>()(
devtools(
(...args) => ({
...createProjectFlockUiSlice(...args),
}),
{
name: 'ProjectFlockUiStore',
}
)
);
+2
View File
@@ -5,11 +5,13 @@ import { devtools } from 'zustand/middleware';
import { UIStore } from '@/types/stores'; import { UIStore } from '@/types/stores';
import { createMainUiSlice } from '@/stores/ui/slices/main.slice'; import { createMainUiSlice } from '@/stores/ui/slices/main.slice';
import { createDrawerUISlice } from '@/stores/ui/slices/drawer.slice';
export const useUiStore = create<UIStore>()( export const useUiStore = create<UIStore>()(
devtools( devtools(
(...args) => ({ (...args) => ({
...createMainUiSlice(...args), ...createMainUiSlice(...args),
...createDrawerUISlice(...args),
}), }),
{ {
name: 'UIStore', name: 'UIStore',
+10 -1
View File
@@ -3,4 +3,13 @@ type MainUiSlice = {
setMainDrawerOpen: (open: boolean) => void; setMainDrawerOpen: (open: boolean) => void;
}; };
export type UIStore = MainUiSlice; type DrawerUISlice = {
triggerValidate: boolean;
toggleValidate: () => void;
subscribeValidate: (callback: () => void) => void;
isValid: boolean;
setIsValid: (v: boolean) => void;
subscribeIsValid: (callback: (isValid: boolean) => void) => () => void;
};
export type UIStore = MainUiSlice & DrawerUISlice;