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;
|
|