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.mjs CHANGED
@@ -1,16 +1,411 @@
1
- // src/index.tsx
2
- import React from "react";
3
- var Button = ({ label, onClick }) => {
4
- return /* @__PURE__ */ React.createElement(
5
- "button",
6
- {
7
- onClick,
8
- style: { padding: "10px", borderRadius: "5px", border: "1px solid #ccc" }
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
- label
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 src_default = Button;
404
+ var app_default = AuthProvider;
14
405
  export {
15
- src_default as default
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.0.0",
4
- "description": "A simple React component package with TypeScript.",
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
  }