class StateManager { constructor(initialState = {}) { this.state = { page: 1, loading: false, hasMore: true, retries: { count: 0, maxRetries: 3, delay: 1000 }, filters: { content: initialState.content || 'tattoo', style: [], theme: [], type: [], city: [], artstyle: [], arttheme: [], artmedium: [], pstyle: [], favouritesOnly: false, order: initialState.defaultOrder || 'date', direction: 'desc' }, ...initialState }; this.listeners = []; } setState(newState) { // Update state with new values if (typeof newState === 'function') { this.state = { ...this.state, ...newState(this.state) }; } else { this.state = { ...this.state, ...newState }; } // Notify listeners of state change this.notifyListeners(); return this.state; } getState() { return this.state; } subscribe(listener) { this.listeners.push(listener); return () => { this.listeners = this.listeners.filter(l => l !== listener); }; } notifyListeners() { this.listeners.forEach(listener => listener(this.state)); } // Common state updates setLoading(loading) { return this.setState({ loading }); } setPage(page) { return this.setState({ page }); } nextPage() { return this.setState(state => ({ page: state.page + 1 })); } resetPagination() { return this.setState({ page: 1, hasMore: true }); } updateFilters(filters) { return this.setState(state => ({ filters: filters, page: 1, hasMore: true })); } updateContentType(contentType) { return this.setState(state => ({ filters: { ...state.filters, content: contentType }, page: 1, hasMore: true })); } // Reset state to initial values reset() { return this.setState({ page: 1, loading: false, hasMore: true, retries: { count: 0, maxRetries: 3, delay: 1000 } }); } } export default StateManager;