react-redux-django-auth 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +39 -6
- package/dist/index.d.ts +39 -6
- package/dist/index.js +904 -14
- package/dist/index.mjs +406 -11
- package/package.json +10 -2
package/dist/index.mjs
CHANGED
|
@@ -1,16 +1,411 @@
|
|
|
1
|
-
// src/
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
// src/hooks/useActivate.tsx
|
|
2
|
+
import { useState, useCallback, useEffect } from "react";
|
|
3
|
+
import { useDispatch, useSelector } from "react-redux";
|
|
4
|
+
|
|
5
|
+
// src/actions/auth.ts
|
|
6
|
+
import axios from "axios";
|
|
7
|
+
|
|
8
|
+
// src/actions/types.ts
|
|
9
|
+
var LOGIN_SUCCESS = "LOGIN_SUCCESS";
|
|
10
|
+
var LOGIN_FAIL = "LOGIN_FAIL";
|
|
11
|
+
var USER_LOADED_SUCCESS = "USER_LOADED_SUCCESS";
|
|
12
|
+
var USER_LOADED_FAIL = "USER_LOADED_FAIL";
|
|
13
|
+
var AUTHENTICATED_SUCCESS = "AUTHENTICATED_SUCCESS";
|
|
14
|
+
var AUTHENTICATED_FAIL = "AUTHENTICATED_FAIL";
|
|
15
|
+
var PASSWORD_RESET_SUCCESS = "PASSWORD_RESET_SUCCESS";
|
|
16
|
+
var PASSWORD_RESET_FAIL = "PASSWORD_RESET_FAIL";
|
|
17
|
+
var PASSWORD_RESET_CONFIRM_SUCCESS = "PASSWORD_RESET_CONFIRM_SUCCESS";
|
|
18
|
+
var PASSWORD_RESET_CONFIRM_FAIL = "PASSWORD_RESET_CONFIRM_FAIL";
|
|
19
|
+
var SIGNUP_SUCCESS = "SIGNUP_SUCCESS";
|
|
20
|
+
var SIGNUP_FAIL = "SIGNUP_FAIL";
|
|
21
|
+
var ACTIVATION_SUCCESS = "ACTIVATION_SUCCESS";
|
|
22
|
+
var ACTIVATION_FAIL = "ACTIVATION_FAIL";
|
|
23
|
+
var GOOGLE_AUTH_SUCCESS = "GOOGLE_AUTH_SUCCESS";
|
|
24
|
+
var GOOGLE_AUTH_FAIL = "GOOGLE_AUTH_FAIL";
|
|
25
|
+
var FACEBOOK_AUTH_SUCCESS = "FACEBOOK_AUTH_SUCCESS";
|
|
26
|
+
var FACEBOOK_AUTH_FAIL = "FACEBOOK_AUTH_FAIL";
|
|
27
|
+
var LOGOUT = "LOGOUT";
|
|
28
|
+
var CLEAR_ERRORS = "CLEAR_ERRORS";
|
|
29
|
+
|
|
30
|
+
// src/actions/auth.ts
|
|
31
|
+
var load_user = (apiUrl) => async (dispatch) => {
|
|
32
|
+
if (localStorage.getItem("access")) {
|
|
33
|
+
const config = {
|
|
34
|
+
headers: {
|
|
35
|
+
"Content-Type": "application/json",
|
|
36
|
+
"Authorization": `JWT ${localStorage.getItem("access")}`,
|
|
37
|
+
"Accept": "application/json"
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
const res = await axios.get(`${apiUrl}/auth/users/me/`, config);
|
|
42
|
+
dispatch({
|
|
43
|
+
type: USER_LOADED_SUCCESS,
|
|
44
|
+
payload: res.data
|
|
45
|
+
});
|
|
46
|
+
} catch (err) {
|
|
47
|
+
dispatch({
|
|
48
|
+
type: USER_LOADED_FAIL
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
dispatch({
|
|
53
|
+
type: USER_LOADED_FAIL
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
var login = (formData, apiUrl) => async (dispatch) => {
|
|
58
|
+
const config = {
|
|
59
|
+
headers: {
|
|
60
|
+
"Content-Type": "application/json"
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const body = JSON.stringify(formData);
|
|
64
|
+
try {
|
|
65
|
+
const res = await axios.post(`${apiUrl}/auth/jwt/create/`, body, config);
|
|
66
|
+
dispatch({
|
|
67
|
+
type: LOGIN_SUCCESS,
|
|
68
|
+
payload: {
|
|
69
|
+
...res.data,
|
|
70
|
+
status: res.status
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
dispatch(load_user(apiUrl));
|
|
74
|
+
} catch (err) {
|
|
75
|
+
const error = err;
|
|
76
|
+
if (error.response) {
|
|
77
|
+
dispatch({
|
|
78
|
+
type: LOGIN_FAIL,
|
|
79
|
+
payload: error.response.data
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
var signup = (formData, apiUrl) => async (dispatch) => {
|
|
85
|
+
const config = {
|
|
86
|
+
headers: {
|
|
87
|
+
"Content-Type": "application/json"
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
const body = JSON.stringify(formData);
|
|
91
|
+
try {
|
|
92
|
+
const res = await axios.post(`${apiUrl}/auth/users/`, body, config);
|
|
93
|
+
dispatch({
|
|
94
|
+
type: SIGNUP_SUCCESS,
|
|
95
|
+
payload: res.status
|
|
96
|
+
});
|
|
97
|
+
} catch (err) {
|
|
98
|
+
const error = err;
|
|
99
|
+
if (error.response) {
|
|
100
|
+
dispatch({
|
|
101
|
+
type: SIGNUP_FAIL,
|
|
102
|
+
payload: error.response.data
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
var verify = (uid, token, apiUrl) => async (dispatch) => {
|
|
108
|
+
const config = {
|
|
109
|
+
headers: {
|
|
110
|
+
"Content-Type": "application/json"
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const body = JSON.stringify({ uid, token });
|
|
114
|
+
try {
|
|
115
|
+
const res = await axios.post(`${apiUrl}/auth/users/activation/`, body, config);
|
|
116
|
+
dispatch({
|
|
117
|
+
type: ACTIVATION_SUCCESS,
|
|
118
|
+
payload: res.status
|
|
119
|
+
});
|
|
120
|
+
} catch (err) {
|
|
121
|
+
const error = err;
|
|
122
|
+
if (error.response) {
|
|
123
|
+
dispatch({
|
|
124
|
+
type: ACTIVATION_FAIL,
|
|
125
|
+
payload: error.response.data
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
var logout = () => (dispatch) => {
|
|
131
|
+
dispatch({
|
|
132
|
+
type: LOGOUT
|
|
133
|
+
});
|
|
134
|
+
};
|
|
135
|
+
var clearErrors = () => {
|
|
136
|
+
return {
|
|
137
|
+
type: CLEAR_ERRORS
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// src/hooks/useActivate.tsx
|
|
142
|
+
var useActivate = (uid, token, apiUrl) => {
|
|
143
|
+
const [loading, setLoading] = useState(false);
|
|
144
|
+
const dispatch = useDispatch();
|
|
145
|
+
const error = useSelector((state) => state.error);
|
|
146
|
+
const status = useSelector((state) => state.status);
|
|
147
|
+
const isStatus204 = status === 204;
|
|
148
|
+
useEffect(() => {
|
|
149
|
+
return () => {
|
|
150
|
+
dispatch(clearErrors());
|
|
151
|
+
};
|
|
152
|
+
}, [dispatch]);
|
|
153
|
+
const handleSubmit = useCallback(
|
|
154
|
+
async (e) => {
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
setLoading(true);
|
|
157
|
+
try {
|
|
158
|
+
await dispatch(verify(uid, token, apiUrl));
|
|
159
|
+
} catch (error2) {
|
|
160
|
+
console.error("Error submitting form", error2);
|
|
161
|
+
} finally {
|
|
162
|
+
setLoading(false);
|
|
163
|
+
}
|
|
9
164
|
},
|
|
10
|
-
|
|
165
|
+
[dispatch, uid, token, apiUrl]
|
|
11
166
|
);
|
|
167
|
+
return {
|
|
168
|
+
loading,
|
|
169
|
+
error,
|
|
170
|
+
onSubmit: handleSubmit,
|
|
171
|
+
status,
|
|
172
|
+
isStatus204
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
var useActivate_default = useActivate;
|
|
176
|
+
|
|
177
|
+
// src/hooks/useLogin.tsx
|
|
178
|
+
import { useState as useState2, useCallback as useCallback2, useEffect as useEffect2 } from "react";
|
|
179
|
+
import { useDispatch as useDispatch2, useSelector as useSelector2 } from "react-redux";
|
|
180
|
+
var useLogin = (initialFields, apiUrl) => {
|
|
181
|
+
const [loading, setLoading] = useState2(false);
|
|
182
|
+
const [formData, setFormData] = useState2(initialFields);
|
|
183
|
+
const dispatch = useDispatch2();
|
|
184
|
+
const isAuthenticated = useSelector2(
|
|
185
|
+
(state) => state.isAuthenticated
|
|
186
|
+
);
|
|
187
|
+
const error = useSelector2((state) => state.error);
|
|
188
|
+
const status = useSelector2((state) => state.status);
|
|
189
|
+
const isStatus200 = status === 200;
|
|
190
|
+
useEffect2(() => {
|
|
191
|
+
return () => {
|
|
192
|
+
dispatch(clearErrors());
|
|
193
|
+
};
|
|
194
|
+
}, [dispatch]);
|
|
195
|
+
const handleChange = useCallback2((e) => {
|
|
196
|
+
const { name, value } = e.target;
|
|
197
|
+
setFormData((prevFields) => ({ ...prevFields, [name]: value }));
|
|
198
|
+
}, []);
|
|
199
|
+
const handleSubmit = useCallback2(
|
|
200
|
+
async (e) => {
|
|
201
|
+
e.preventDefault();
|
|
202
|
+
setLoading(true);
|
|
203
|
+
try {
|
|
204
|
+
await dispatch(login(formData, apiUrl));
|
|
205
|
+
} catch (error2) {
|
|
206
|
+
console.error("Error submitting form", error2);
|
|
207
|
+
} finally {
|
|
208
|
+
setLoading(false);
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
[dispatch, formData, apiUrl]
|
|
212
|
+
);
|
|
213
|
+
return {
|
|
214
|
+
loading,
|
|
215
|
+
formData,
|
|
216
|
+
error,
|
|
217
|
+
onChange: handleChange,
|
|
218
|
+
onSubmit: handleSubmit,
|
|
219
|
+
isAuthenticated,
|
|
220
|
+
isStatus200
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
var useLogin_default = useLogin;
|
|
224
|
+
|
|
225
|
+
// src/hooks/useLogout.tsx
|
|
226
|
+
import { useCallback as useCallback3 } from "react";
|
|
227
|
+
import { useDispatch as useDispatch3 } from "react-redux";
|
|
228
|
+
var useLogout = () => {
|
|
229
|
+
const dispatch = useDispatch3();
|
|
230
|
+
const handleLogout = useCallback3(() => {
|
|
231
|
+
dispatch(logout());
|
|
232
|
+
}, [dispatch]);
|
|
233
|
+
return handleLogout;
|
|
234
|
+
};
|
|
235
|
+
var useLogout_default = useLogout;
|
|
236
|
+
|
|
237
|
+
// src/hooks/useSignup.tsx
|
|
238
|
+
import { useState as useState3, useCallback as useCallback4, useEffect as useEffect3 } from "react";
|
|
239
|
+
import { useDispatch as useDispatch4, useSelector as useSelector3 } from "react-redux";
|
|
240
|
+
var useSignup = (initialFields, apiUrl) => {
|
|
241
|
+
const [loading, setLoading] = useState3(false);
|
|
242
|
+
const [formData, setFormData] = useState3(initialFields);
|
|
243
|
+
const dispatch = useDispatch4();
|
|
244
|
+
const isAuthenticated = useSelector3(
|
|
245
|
+
(state) => state.isAuthenticated
|
|
246
|
+
);
|
|
247
|
+
const error = useSelector3((state) => state.error);
|
|
248
|
+
const status = useSelector3((state) => state.status);
|
|
249
|
+
const isStatus201 = status === 201;
|
|
250
|
+
useEffect3(() => {
|
|
251
|
+
return () => {
|
|
252
|
+
dispatch(clearErrors());
|
|
253
|
+
};
|
|
254
|
+
}, [dispatch]);
|
|
255
|
+
const handleChange = useCallback4((e) => {
|
|
256
|
+
const { name, value } = e.target;
|
|
257
|
+
setFormData((prevFields) => ({ ...prevFields, [name]: value }));
|
|
258
|
+
}, []);
|
|
259
|
+
const handleSubmit = useCallback4(
|
|
260
|
+
async (e) => {
|
|
261
|
+
e.preventDefault();
|
|
262
|
+
setLoading(true);
|
|
263
|
+
try {
|
|
264
|
+
await dispatch(signup(formData, apiUrl));
|
|
265
|
+
} catch (error2) {
|
|
266
|
+
console.error("Error submitting form", error2);
|
|
267
|
+
} finally {
|
|
268
|
+
setLoading(false);
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
[dispatch, formData, apiUrl]
|
|
272
|
+
);
|
|
273
|
+
return {
|
|
274
|
+
loading,
|
|
275
|
+
formData,
|
|
276
|
+
error,
|
|
277
|
+
onChange: handleChange,
|
|
278
|
+
onSubmit: handleSubmit,
|
|
279
|
+
isAuthenticated,
|
|
280
|
+
status,
|
|
281
|
+
isStatus201
|
|
282
|
+
};
|
|
283
|
+
};
|
|
284
|
+
var useSignup_default = useSignup;
|
|
285
|
+
|
|
286
|
+
// src/app.tsx
|
|
287
|
+
import React from "react";
|
|
288
|
+
import { Provider } from "react-redux";
|
|
289
|
+
|
|
290
|
+
// src/store.ts
|
|
291
|
+
import { configureStore } from "@reduxjs/toolkit";
|
|
292
|
+
|
|
293
|
+
// src/reducers/index.ts
|
|
294
|
+
import { combineReducers } from "redux";
|
|
295
|
+
|
|
296
|
+
// src/reducers/auth.ts
|
|
297
|
+
var initialState = {
|
|
298
|
+
access: localStorage.getItem("access"),
|
|
299
|
+
refresh: localStorage.getItem("refresh"),
|
|
300
|
+
isAuthenticated: null,
|
|
301
|
+
user: null,
|
|
302
|
+
error: null,
|
|
303
|
+
status: null
|
|
304
|
+
};
|
|
305
|
+
function authReducer(state = initialState, action) {
|
|
306
|
+
const { type, payload } = action;
|
|
307
|
+
switch (type) {
|
|
308
|
+
case AUTHENTICATED_SUCCESS:
|
|
309
|
+
return {
|
|
310
|
+
...state,
|
|
311
|
+
isAuthenticated: true
|
|
312
|
+
};
|
|
313
|
+
case LOGIN_SUCCESS:
|
|
314
|
+
case GOOGLE_AUTH_SUCCESS:
|
|
315
|
+
case FACEBOOK_AUTH_SUCCESS:
|
|
316
|
+
localStorage.setItem("access", payload.access);
|
|
317
|
+
localStorage.setItem("refresh", payload.refresh);
|
|
318
|
+
return {
|
|
319
|
+
...state,
|
|
320
|
+
isAuthenticated: true,
|
|
321
|
+
access: payload.access,
|
|
322
|
+
refresh: payload.refresh,
|
|
323
|
+
status: payload.status
|
|
324
|
+
};
|
|
325
|
+
case SIGNUP_SUCCESS:
|
|
326
|
+
return {
|
|
327
|
+
...state,
|
|
328
|
+
isAuthenticated: false,
|
|
329
|
+
status: payload
|
|
330
|
+
};
|
|
331
|
+
case USER_LOADED_SUCCESS:
|
|
332
|
+
return {
|
|
333
|
+
...state,
|
|
334
|
+
user: payload
|
|
335
|
+
};
|
|
336
|
+
case AUTHENTICATED_FAIL:
|
|
337
|
+
return {
|
|
338
|
+
...state,
|
|
339
|
+
isAuthenticated: false
|
|
340
|
+
};
|
|
341
|
+
case USER_LOADED_FAIL:
|
|
342
|
+
return {
|
|
343
|
+
...state,
|
|
344
|
+
user: null
|
|
345
|
+
};
|
|
346
|
+
case GOOGLE_AUTH_FAIL:
|
|
347
|
+
case FACEBOOK_AUTH_FAIL:
|
|
348
|
+
case LOGIN_FAIL:
|
|
349
|
+
case SIGNUP_FAIL:
|
|
350
|
+
case LOGOUT:
|
|
351
|
+
localStorage.removeItem("access");
|
|
352
|
+
localStorage.removeItem("refresh");
|
|
353
|
+
return {
|
|
354
|
+
...state,
|
|
355
|
+
access: null,
|
|
356
|
+
refresh: null,
|
|
357
|
+
isAuthenticated: false,
|
|
358
|
+
user: null,
|
|
359
|
+
error: payload
|
|
360
|
+
};
|
|
361
|
+
case PASSWORD_RESET_SUCCESS:
|
|
362
|
+
case PASSWORD_RESET_CONFIRM_SUCCESS:
|
|
363
|
+
case ACTIVATION_SUCCESS:
|
|
364
|
+
return {
|
|
365
|
+
...state,
|
|
366
|
+
status: payload
|
|
367
|
+
};
|
|
368
|
+
case ACTIVATION_FAIL:
|
|
369
|
+
case PASSWORD_RESET_CONFIRM_FAIL:
|
|
370
|
+
case PASSWORD_RESET_FAIL:
|
|
371
|
+
return {
|
|
372
|
+
...state,
|
|
373
|
+
error: payload
|
|
374
|
+
};
|
|
375
|
+
case CLEAR_ERRORS:
|
|
376
|
+
return {
|
|
377
|
+
...state,
|
|
378
|
+
error: null,
|
|
379
|
+
status: null
|
|
380
|
+
};
|
|
381
|
+
default:
|
|
382
|
+
return state;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// src/reducers/index.ts
|
|
387
|
+
var reducers_default = combineReducers({
|
|
388
|
+
auth: authReducer
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
// src/store.ts
|
|
392
|
+
var initialState2 = {};
|
|
393
|
+
var store = configureStore({
|
|
394
|
+
reducer: reducers_default,
|
|
395
|
+
// If you want to set an initial state, use preloadedState instead:
|
|
396
|
+
preloadedState: initialState2
|
|
397
|
+
});
|
|
398
|
+
var store_default = store;
|
|
399
|
+
|
|
400
|
+
// src/app.tsx
|
|
401
|
+
var AuthProvider = ({ children }) => {
|
|
402
|
+
return /* @__PURE__ */ React.createElement(Provider, { store: store_default }, children);
|
|
12
403
|
};
|
|
13
|
-
var
|
|
404
|
+
var app_default = AuthProvider;
|
|
14
405
|
export {
|
|
15
|
-
|
|
406
|
+
app_default as AuthProvider,
|
|
407
|
+
useActivate_default as useActivate,
|
|
408
|
+
useLogin_default as useLogin,
|
|
409
|
+
useLogout_default as useLogout,
|
|
410
|
+
useSignup_default as useSignup
|
|
16
411
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-redux-django-auth",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "A
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "A React Redux Authentication system for django app built with TypeScript.",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -32,5 +32,13 @@
|
|
|
32
32
|
"react-dom": "^18.2.0",
|
|
33
33
|
"tsup": "^7.2.0",
|
|
34
34
|
"typescript": "^5.2.2"
|
|
35
|
+
},
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@redux-devtools/extension": "^3.3.0",
|
|
38
|
+
"@reduxjs/toolkit": "^2.8.2",
|
|
39
|
+
"axios": "^1.11.0",
|
|
40
|
+
"react-redux": "^9.2.0",
|
|
41
|
+
"redux": "^5.0.1",
|
|
42
|
+
"redux-thunk": "^3.1.0"
|
|
35
43
|
}
|
|
36
44
|
}
|