Jake Vanderwerf
2025-09-30 19d20832e881112d197254b1c41edc4c0f03758e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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;