| | import { create } from "zustand"; |
| | import type { AdCreativeDB, AdFilters, AdSortOptions } from "../types"; |
| |
|
| | interface GalleryState { |
| | ads: AdCreativeDB[]; |
| | total: number; |
| | limit: number; |
| | offset: number; |
| | filters: AdFilters; |
| | sortOptions: AdSortOptions; |
| | selectedAds: string[]; |
| | isLoading: boolean; |
| | error: string | null; |
| | |
| | setAds: (ads: AdCreativeDB[], total: number) => void; |
| | setLimit: (limit: number) => void; |
| | setOffset: (offset: number) => void; |
| | setFilters: (filters: Partial<AdFilters>) => void; |
| | setSortOptions: (sort: AdSortOptions) => void; |
| | toggleAdSelection: (adId: string) => void; |
| | clearSelection: () => void; |
| | selectAll: () => void; |
| | setIsLoading: (isLoading: boolean) => void; |
| | setError: (error: string | null) => void; |
| | removeAd: (adId: string) => void; |
| | } |
| |
|
| | export const useGalleryStore = create<GalleryState>((set, get) => ({ |
| | ads: [], |
| | total: 0, |
| | limit: 50, |
| | offset: 0, |
| | filters: {}, |
| | sortOptions: { |
| | field: "created_at", |
| | direction: "desc", |
| | }, |
| | selectedAds: [], |
| | isLoading: false, |
| | error: null, |
| | |
| | setAds: (ads, total) => set({ ads, total }), |
| | |
| | setLimit: (limit) => set({ limit, offset: 0 }), |
| | |
| | setOffset: (offset) => set({ offset }), |
| | |
| | setFilters: (filters) => set((state) => ({ |
| | filters: { ...state.filters, ...filters }, |
| | offset: 0, |
| | selectedAds: [], |
| | })), |
| | |
| | setSortOptions: (sort) => set({ sortOptions: sort, offset: 0 }), |
| | |
| | toggleAdSelection: (adId) => set((state) => ({ |
| | selectedAds: state.selectedAds.includes(adId) |
| | ? state.selectedAds.filter((id) => id !== adId) |
| | : [...state.selectedAds, adId], |
| | })), |
| | |
| | clearSelection: () => set({ selectedAds: [] }), |
| | |
| | selectAll: () => set((state) => ({ |
| | selectedAds: state.ads.map((ad) => ad.id), |
| | })), |
| | |
| | setIsLoading: (isLoading) => set({ isLoading }), |
| | |
| | setError: (error) => set({ error }), |
| | |
| | removeAd: (adId) => set((state) => ({ |
| | ads: state.ads.filter((ad) => ad.id !== adId), |
| | total: state.total - 1, |
| | selectedAds: state.selectedAds.filter((id) => id !== adId), |
| | })), |
| | })); |
| |
|