Files
team-planner/frontend/src/store/ideas.ts
vigdorov 85c4a36e17
Some checks reported errors
continuous-integration/drone/push Build was killed
add deploy
2025-12-31 09:50:51 +03:00

84 lines
2.1 KiB
TypeScript

import { create } from 'zustand';
import type { IdeaStatus, IdeaPriority } from '../types/idea';
interface IdeasFilters {
status?: IdeaStatus;
priority?: IdeaPriority;
module?: string;
search?: string;
}
interface IdeasSorting {
sortBy: string;
sortOrder: 'ASC' | 'DESC';
}
interface IdeasPagination {
page: number;
limit: number;
}
interface IdeasStore {
// Filters
filters: IdeasFilters;
setFilter: <K extends keyof IdeasFilters>(
key: K,
value: IdeasFilters[K],
) => void;
clearFilters: () => void;
// Sorting
sorting: IdeasSorting;
setSorting: (sortBy: string, sortOrder?: 'ASC' | 'DESC') => void;
// Pagination
pagination: IdeasPagination;
setPage: (page: number) => void;
setLimit: (limit: number) => void;
// UI State
createModalOpen: boolean;
setCreateModalOpen: (open: boolean) => void;
}
const initialFilters: IdeasFilters = {};
const initialSorting: IdeasSorting = { sortBy: 'createdAt', sortOrder: 'DESC' };
const initialPagination: IdeasPagination = { page: 1, limit: 20 };
export const useIdeasStore = create<IdeasStore>((set) => ({
// Filters
filters: initialFilters,
setFilter: (key, value) =>
set((state) => ({
filters: { ...state.filters, [key]: value || undefined },
pagination: { ...state.pagination, page: 1 }, // Reset page on filter change
})),
clearFilters: () =>
set({ filters: initialFilters, pagination: { ...initialPagination } }),
// Sorting
sorting: initialSorting,
setSorting: (sortBy, sortOrder) =>
set((state) => ({
sorting: {
sortBy,
sortOrder:
sortOrder ??
(state.sorting.sortBy === sortBy && state.sorting.sortOrder === 'ASC'
? 'DESC'
: 'ASC'),
},
})),
// Pagination
pagination: initialPagination,
setPage: (page) =>
set((state) => ({ pagination: { ...state.pagination, page } })),
setLimit: (limit) =>
set((state) => ({ pagination: { ...state.pagination, limit, page: 1 } })),
// UI State
createModalOpen: false,
setCreateModalOpen: (open) => set({ createModalOpen: open }),
}));