-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
121 lines (105 loc) · 3.01 KB
/
Copy pathindex.js
File metadata and controls
121 lines (105 loc) · 3.01 KB
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
118
119
120
121
import React from 'react';
import { createRoot } from 'react-dom/client';
import dva, { routerV6Compat } from 'dva';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import App from './App';
// 1. Initialize dva app
const app = dva();
// 2. Define models
app.model({
namespace: 'user',
state: {
currentUser: null,
isAuthenticated: false,
users: []
},
reducers: {
saveCurrentUser(state, { payload }) {
return { ...state, currentUser: payload, isAuthenticated: !!payload };
},
saveUsers(state, { payload }) {
return { ...state, users: payload };
},
logout(state) {
return { ...state, currentUser: null, isAuthenticated: false };
}
},
effects: {
*login({ payload }, { put, call }) {
// Simulate API call
yield new Promise(resolve => setTimeout(resolve, 1000));
const user = {
id: 1,
name: payload.username,
email: `${payload.username}@example.com`
};
yield put({ type: 'saveCurrentUser', payload: user });
},
*fetchUsers(action, { put }) {
// Simulate API call
yield new Promise(resolve => setTimeout(resolve, 500));
const users = Array.from({ length: 10 }, (_, i) => ({
id: i + 1,
name: `User ${i + 1}`,
email: `user${i + 1}@example.com`,
role: i % 2 === 0 ? 'admin' : 'user'
}));
yield put({ type: 'saveUsers', payload: users });
}
}
});
app.model({
namespace: 'posts',
state: {
list: [],
loading: false,
currentPost: null
},
reducers: {
savePosts(state, { payload }) {
return { ...state, list: payload };
},
setLoading(state, { payload }) {
return { ...state, loading: payload };
},
saveCurrentPost(state, { payload }) {
return { ...state, currentPost: payload };
}
},
effects: {
*fetchPosts(action, { put }) {
yield put({ type: 'setLoading', payload: true });
// Simulate API call
yield new Promise(resolve => setTimeout(resolve, 800));
const posts = Array.from({ length: 20 }, (_, i) => ({
id: i + 1,
title: `Post Title ${i + 1}`,
content: `This is the content of post ${i + 1}`,
author: `Author ${i + 1}`,
createdAt: new Date(Date.now() - i * 86400000).toISOString()
}));
yield put({ type: 'savePosts', payload: posts });
yield put({ type: 'setLoading', payload: false });
},
*fetchPost({ payload: id }, { put, select }) {
const posts = yield select(state => state.posts.list);
const post = posts.find(p => p.id === parseInt(id));
if (post) {
yield put({ type: 'saveCurrentPost', payload: post });
}
}
}
});
// 3. Start app
app.start();
// 4. Create React 18 root
const container = document.getElementById('root');
const root = createRoot(container);
root.render(
<Provider store={app._store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>
);