feat: initialize dashboard structure with auth, feed management, and activity feed filtering components

This commit is contained in:
2026-06-16 16:42:48 +05:30
parent a4c0892741
commit 0a35bba378
17 changed files with 1840 additions and 536 deletions

View File

@@ -1,4 +1,5 @@
import { create } from 'zustand';
import { persist } from 'zustand/middleware';
export interface FeedTab {
date: string;
@@ -21,11 +22,16 @@ interface DashboardCache {
assetIds: string;
minChainage: string;
maxChainage: string;
searchAnomalyId: string;
filterPlaza: string;
isRectificationEnabled?: boolean;
date?: string;
stats: {
total: number;
audited: number;
pending: number;
anomaliesFound: number;
globalTotal: number;
batchTotal: number;
batchAudited: number;
batchPending: number;
batchAnomaliesFound: number;
} | null;
}
@@ -38,6 +44,7 @@ interface FeedState {
filterTillDate: string;
filterMinChainage: string;
filterMaxChainage: string;
filterPlaza: string;
selectedAssetIds: number[];
sites: any[];
auditStatus: string;
@@ -48,6 +55,8 @@ interface FeedState {
lastFetchedFilterKey: string;
// Dashboard stats cache
dashboardCache: DashboardCache;
searchAnomalyId: string;
isRectificationEnabled: boolean;
// Actions
setTabs: (tabs: FeedTab[]) => void;
@@ -69,6 +78,9 @@ interface FeedState {
setFilterTillDate: (date: string) => void;
setFilterMinChainage: (val: string) => void;
setFilterMaxChainage: (val: string) => void;
setFilterPlaza: (val: string) => void;
setSearchAnomalyId: (id: string) => void;
setIsRectificationEnabled: (val: boolean) => void;
resetStore: () => void;
}
@@ -80,6 +92,10 @@ const EMPTY_DASHBOARD_CACHE: DashboardCache = {
assetIds: '__unset__',
minChainage: '__unset__',
maxChainage: '__unset__',
searchAnomalyId: '__unset__',
filterPlaza: '__unset__',
isRectificationEnabled: false,
date: '',
stats: null,
};
@@ -92,47 +108,74 @@ const initialFeedState = {
filterTillDate: '',
filterMinChainage: '',
filterMaxChainage: '',
filterPlaza: '',
selectedAssetIds: [],
selectedSite: null,
sites: [],
auditStatus: 'Auto Audits',
auditStatus: 'Manual',
isFiltersModalOpen: false,
isInitialized: false,
lastFetchedFilterKey: '',
dashboardCache: EMPTY_DASHBOARD_CACHE,
searchAnomalyId: '',
isRectificationEnabled: false,
};
export const useFeedStore = create<FeedState>((set) => ({
...initialFeedState,
export const useFeedStore = create<FeedState>()(
persist(
(set) => ({
...initialFeedState,
resetStore: () => 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 };
})
}));
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 }),
setFilterPlaza: (filterPlaza) => set({ filterPlaza }),
setSearchAnomalyId: (searchAnomalyId) => set({ searchAnomalyId }),
setIsRectificationEnabled: (isRectificationEnabled) => set({ isRectificationEnabled }),
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 };
})
}),
{
name: 'feed-store-storage',
partialize: (state) => ({
tabs: state.tabs,
selectedTabIndex: state.selectedTabIndex,
filterFromDate: state.filterFromDate,
filterTillDate: state.filterTillDate,
filterMinChainage: state.filterMinChainage,
filterMaxChainage: state.filterMaxChainage,
filterPlaza: state.filterPlaza,
selectedAssetIds: state.selectedAssetIds,
selectedSite: state.selectedSite,
auditStatus: state.auditStatus,
searchAnomalyId: state.searchAnomalyId,
isRectificationEnabled: state.isRectificationEnabled,
}),
}
)
);