Files
ALwrity/frontend/src/stores/dashboardStore.ts
2025-08-06 12:48:02 +05:30

110 lines
2.9 KiB
TypeScript

import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import { DashboardState, SnackbarState } from '../components/shared/types';
export interface DashboardStore extends DashboardState {
// Actions
toggleFavorite: (toolName: string) => void;
setSearchQuery: (query: string) => void;
setSelectedCategory: (category: string | null) => void;
setSelectedSubCategory: (subCategory: string | null) => void;
setError: (error: string | null) => void;
setLoading: (loading: boolean) => void;
showSnackbar: (message: string, severity?: SnackbarState['severity']) => void;
hideSnackbar: () => void;
clearFilters: () => void;
}
export const useDashboardStore = create<DashboardStore>()(
persist(
(set, get) => ({
// Initial state
loading: false,
error: null,
searchQuery: '',
selectedCategory: null,
selectedSubCategory: null,
favorites: [],
snackbar: {
open: false,
message: '',
severity: 'info',
},
// Actions
toggleFavorite: (toolName: string) => {
const { favorites } = get();
const newFavorites = favorites.includes(toolName)
? favorites.filter(f => f !== toolName)
: [...favorites, toolName];
set({ favorites: newFavorites });
// Show snackbar
const message = favorites.includes(toolName)
? 'Removed from favorites'
: 'Added to favorites';
get().showSnackbar(message, 'success');
},
setSearchQuery: (query: string) => {
set({ searchQuery: query });
},
setSelectedCategory: (category: string | null) => {
set({
selectedCategory: category,
selectedSubCategory: null, // Reset sub-category when changing main category
});
},
setSelectedSubCategory: (subCategory: string | null) => {
set({ selectedSubCategory: subCategory });
},
setError: (error: string | null) => {
set({ error });
},
setLoading: (loading: boolean) => {
set({ loading });
},
showSnackbar: (message: string, severity: SnackbarState['severity'] = 'info') => {
set({
snackbar: {
open: true,
message,
severity,
},
});
},
hideSnackbar: () => {
set({
snackbar: {
...get().snackbar,
open: false,
},
});
},
clearFilters: () => {
set({
searchQuery: '',
selectedCategory: null,
selectedSubCategory: null,
});
},
}),
{
name: 'alwrity-dashboard-storage',
partialize: (state) => ({
favorites: state.favorites,
searchQuery: state.searchQuery,
selectedCategory: state.selectedCategory,
selectedSubCategory: state.selectedSubCategory,
}),
}
)
);