Initial commit of react-revamp for Auditor Portal
This commit is contained in:
138
src/store/feedStore.ts
Normal file
138
src/store/feedStore.ts
Normal file
@@ -0,0 +1,138 @@
|
||||
import { create } from 'zustand';
|
||||
|
||||
export interface FeedTab {
|
||||
date: string;
|
||||
isRectificationTab: boolean;
|
||||
totalAnomalyCount: number;
|
||||
anomalies: any[];
|
||||
anomaliesCopy: any[];
|
||||
selectedAnomalyIndex: number;
|
||||
filters: any;
|
||||
page: number;
|
||||
rowsPerPage: number;
|
||||
}
|
||||
|
||||
// Tracks what filter params were last used to fetch dashboard stats
|
||||
interface DashboardCache {
|
||||
siteId: string;
|
||||
auditStatus: string;
|
||||
fromDate: string;
|
||||
tillDate: string;
|
||||
assetIds: string;
|
||||
minChainage: string;
|
||||
maxChainage: string;
|
||||
stats: {
|
||||
total: number;
|
||||
audited: number;
|
||||
pending: number;
|
||||
anomaliesFound: number;
|
||||
} | null;
|
||||
}
|
||||
|
||||
interface FeedState {
|
||||
tabs: FeedTab[];
|
||||
selectedTabIndex: number;
|
||||
assets: any[];
|
||||
assetTypes: any[];
|
||||
filterFromDate: string;
|
||||
filterTillDate: string;
|
||||
filterMinChainage: string;
|
||||
filterMaxChainage: string;
|
||||
selectedAssetIds: number[];
|
||||
sites: any[];
|
||||
auditStatus: string;
|
||||
selectedSite: any;
|
||||
isFiltersModalOpen: boolean;
|
||||
isInitialized: boolean;
|
||||
// Cache: last filter key used for the second GlobalFeed effect
|
||||
lastFetchedFilterKey: string;
|
||||
// Dashboard stats cache
|
||||
dashboardCache: DashboardCache;
|
||||
|
||||
// Actions
|
||||
setTabs: (tabs: FeedTab[]) => void;
|
||||
setSelectedTabIndex: (index: number) => void;
|
||||
setAssets: (assets: any[]) => void;
|
||||
setAssetTypes: (assetTypes: any[]) => void;
|
||||
setSelectedAssetIds: (ids: number[]) => void;
|
||||
setSites: (sites: any[]) => void;
|
||||
setSelectedSite: (site: any) => void;
|
||||
setAuditStatus: (status: string) => void;
|
||||
setIsFiltersModalOpen: (isOpen: boolean) => void;
|
||||
setIsInitialized: (val: boolean) => void;
|
||||
setLastFetchedFilterKey: (key: string) => void;
|
||||
setDashboardCache: (cache: DashboardCache) => void;
|
||||
addTab: (tab: FeedTab) => void;
|
||||
closeTab: (index: number) => void;
|
||||
updateTab: (index: number, partialTab: Partial<FeedTab>) => void;
|
||||
setFilterFromDate: (date: string) => void;
|
||||
setFilterTillDate: (date: string) => void;
|
||||
setFilterMinChainage: (val: string) => void;
|
||||
setFilterMaxChainage: (val: string) => void;
|
||||
resetStore: () => void;
|
||||
}
|
||||
|
||||
const EMPTY_DASHBOARD_CACHE: DashboardCache = {
|
||||
siteId: '__unset__',
|
||||
auditStatus: '__unset__',
|
||||
fromDate: '__unset__',
|
||||
tillDate: '__unset__',
|
||||
assetIds: '__unset__',
|
||||
minChainage: '__unset__',
|
||||
maxChainage: '__unset__',
|
||||
stats: null,
|
||||
};
|
||||
|
||||
const initialFeedState = {
|
||||
tabs: [],
|
||||
selectedTabIndex: -1,
|
||||
assets: [],
|
||||
assetTypes: [],
|
||||
filterFromDate: '',
|
||||
filterTillDate: '',
|
||||
filterMinChainage: '',
|
||||
filterMaxChainage: '',
|
||||
selectedAssetIds: [],
|
||||
selectedSite: null,
|
||||
sites: [],
|
||||
auditStatus: 'Auto Audits',
|
||||
isFiltersModalOpen: false,
|
||||
isInitialized: false,
|
||||
lastFetchedFilterKey: '',
|
||||
dashboardCache: EMPTY_DASHBOARD_CACHE,
|
||||
};
|
||||
|
||||
export const useFeedStore = create<FeedState>((set) => ({
|
||||
...initialFeedState,
|
||||
|
||||
resetStore: () => set(initialFeedState),
|
||||
|
||||
setTabs: (tabs) => set({ tabs }),
|
||||
setSelectedTabIndex: (index) => set({ selectedTabIndex: index }),
|
||||
setAssets: (assets) => set({ assets }),
|
||||
setAssetTypes: (assetTypes) => set({ assetTypes }),
|
||||
setSelectedAssetIds: (selectedAssetIds) => set({ selectedAssetIds }),
|
||||
setSites: (sites) => set({ sites }),
|
||||
setSelectedSite: (selectedSite) => set({ selectedSite }),
|
||||
setAuditStatus: (auditStatus) => set({ auditStatus }),
|
||||
setIsFiltersModalOpen: (isFiltersModalOpen) => set({ isFiltersModalOpen }),
|
||||
setIsInitialized: (isInitialized) => set({ isInitialized }),
|
||||
setLastFetchedFilterKey: (lastFetchedFilterKey) => set({ lastFetchedFilterKey }),
|
||||
setDashboardCache: (dashboardCache) => set({ dashboardCache }),
|
||||
setFilterFromDate: (filterFromDate) => set({ filterFromDate }),
|
||||
setFilterTillDate: (filterTillDate) => set({ filterTillDate }),
|
||||
setFilterMinChainage: (filterMinChainage) => set({ filterMinChainage }),
|
||||
setFilterMaxChainage: (filterMaxChainage) => set({ filterMaxChainage }),
|
||||
addTab: (tab) => set((state) => ({ tabs: [...state.tabs, tab], selectedTabIndex: state.tabs.length })),
|
||||
closeTab: (index) => set((state) => {
|
||||
const newTabs = [...state.tabs];
|
||||
newTabs.splice(index, 1);
|
||||
const newIndex = state.selectedTabIndex >= newTabs.length ? newTabs.length - 1 : state.selectedTabIndex;
|
||||
return { tabs: newTabs, selectedTabIndex: newIndex };
|
||||
}),
|
||||
updateTab: (index, partialTab) => set((state) => {
|
||||
const newTabs = [...state.tabs];
|
||||
newTabs[index] = { ...newTabs[index], ...partialTab };
|
||||
return { tabs: newTabs };
|
||||
})
|
||||
}));
|
||||
Reference in New Issue
Block a user