200 lines
6.2 KiB
JavaScript
200 lines
6.2 KiB
JavaScript
import { createSlice } from "@reduxjs/toolkit";
|
|
import fetchLoginUser from "./fetch-async/fetchLoginUser";
|
|
import fetchRegisterUser from "./fetch-async/fetchRegisterUser";
|
|
import fetchRefreshToken from "./fetch-async/fetchRefreshToken";
|
|
import fetchUserProfile from "./fetch-async/fetchUserProfile";
|
|
import fetchDeleteUploaded from "./fetch-async/fetchDeleteUploaded";
|
|
|
|
import {
|
|
USER_NAME_UNDEFINED,
|
|
USER_EMAIL_UNDEFINED,
|
|
JWT_TOKEN,
|
|
JWT_REFRESH_TOKEN,
|
|
TYPE_WINDOW_UNDEFINED,
|
|
TOKEN_UNDEFINED,
|
|
UNKNOWN_ERROR,
|
|
} from "./constants";
|
|
|
|
const getInitialToken = () => {
|
|
if (typeof window === TYPE_WINDOW_UNDEFINED) return null;
|
|
|
|
const token = localStorage.getItem(JWT_TOKEN);
|
|
if (!token || token === TOKEN_UNDEFINED) return null;
|
|
return token;
|
|
};
|
|
|
|
const initialState = {
|
|
userId: null,
|
|
userName: USER_NAME_UNDEFINED,
|
|
userEmail: USER_EMAIL_UNDEFINED,
|
|
loadedFiles: [],
|
|
maxFilesToLoad: 0,
|
|
token: getInitialToken(),
|
|
refreshToken: localStorage.getItem(JWT_REFRESH_TOKEN),
|
|
loading: false,
|
|
deleting: false,
|
|
deleteSuccess: false,
|
|
deletedCount: 0,
|
|
error: null,
|
|
};
|
|
|
|
const userDetailsSlice = createSlice({
|
|
name: "userDetails",
|
|
initialState,
|
|
reducers: {
|
|
logoutUser(state) {
|
|
state.userId = null;
|
|
state.userName = USER_NAME_UNDEFINED;
|
|
state.userEmail = USER_EMAIL_UNDEFINED;
|
|
state.loadedFiles = [];
|
|
state.maxFilesToLoad = 0;
|
|
state.token = null;
|
|
state.refreshToken = null;
|
|
state.loading = false;
|
|
state.deleting = false;
|
|
state.deleteSuccess = false;
|
|
state.deletedCount = 0;
|
|
state.error = null;
|
|
localStorage.removeItem(JWT_TOKEN);
|
|
localStorage.removeItem(JWT_REFRESH_TOKEN);
|
|
},
|
|
clearError(state) {
|
|
state.error = null;
|
|
},
|
|
clearDeleteStatus(state) {
|
|
state.deleteSuccess = false;
|
|
state.deletedCount = 0;
|
|
},
|
|
addLoadedFiles(state, action) {
|
|
state.loadedFiles = [...state.loadedFiles, ...action.payload];
|
|
},
|
|
},
|
|
extraReducers: (builder) => {
|
|
builder.addCase(fetchRegisterUser.pending, (state) => {
|
|
state.loading = true;
|
|
state.error = null;
|
|
});
|
|
builder.addCase(fetchRegisterUser.fulfilled, (state, action) => {
|
|
state.loading = false;
|
|
state.error = null;
|
|
state.userName = action.payload.payload.username;
|
|
state.userEmail = action.payload.payload.email;
|
|
const token = action.payload.payload.token;
|
|
state.token = token || null;
|
|
if (token) {
|
|
localStorage.setItem(JWT_TOKEN, token);
|
|
} else {
|
|
localStorage.removeItem(JWT_TOKEN);
|
|
}
|
|
const refreshToken = action.payload.payload.refreshToken;
|
|
state.refreshToken = refreshToken || null;
|
|
if (refreshToken) {
|
|
localStorage.setItem(JWT_REFRESH_TOKEN, refreshToken);
|
|
} else {
|
|
localStorage.removeItem(JWT_REFRESH_TOKEN);
|
|
}
|
|
});
|
|
builder.addCase(fetchRegisterUser.rejected, (state, action) => {
|
|
state.loading = false;
|
|
state.error = action.payload?.status ?? 500;
|
|
});
|
|
|
|
builder.addCase(fetchLoginUser.pending, (state) => {
|
|
state.loading = true;
|
|
state.error = null;
|
|
});
|
|
builder.addCase(fetchLoginUser.fulfilled, (state, action) => {
|
|
state.loading = false;
|
|
state.error = null;
|
|
state.userName = action.payload.payload.username;
|
|
state.userEmail = action.payload.payload.email;
|
|
|
|
const token = action.payload.payload.token;
|
|
state.token = token || null;
|
|
if (token) {
|
|
localStorage.setItem(JWT_TOKEN, token);
|
|
} else {
|
|
localStorage.removeItem(JWT_TOKEN);
|
|
}
|
|
|
|
const refreshToken = action.payload.payload.refreshToken;
|
|
state.refreshToken = refreshToken || null;
|
|
if (refreshToken) {
|
|
localStorage.setItem(JWT_REFRESH_TOKEN, refreshToken);
|
|
} else {
|
|
localStorage.removeItem(JWT_REFRESH_TOKEN);
|
|
}
|
|
});
|
|
builder.addCase(fetchLoginUser.rejected, (state, action) => {
|
|
state.loading = false;
|
|
state.error = action.payload ?? { status: 500, message: "Unknown error" };
|
|
});
|
|
|
|
builder.addCase(fetchRefreshToken.fulfilled, (state, action) => {
|
|
const token = action.payload?.payload?.token;
|
|
const refreshToken = action.payload?.payload?.refreshToken;
|
|
|
|
state.token = token || null;
|
|
state.refreshToken = refreshToken || null;
|
|
|
|
if (token) localStorage.setItem(JWT_TOKEN, token);
|
|
else localStorage.removeItem(JWT_TOKEN);
|
|
|
|
if (refreshToken) localStorage.setItem(JWT_REFRESH_TOKEN, refreshToken);
|
|
else localStorage.removeItem(JWT_REFRESH_TOKEN);
|
|
});
|
|
|
|
builder.addCase(fetchRefreshToken.rejected, (state, action) => {
|
|
state.error = action.payload ?? { status: 500, message: UNKNOWN_ERROR };
|
|
});
|
|
|
|
builder.addCase(fetchUserProfile.pending, (state) => {
|
|
state.loading = true;
|
|
state.error = null;
|
|
});
|
|
|
|
builder.addCase(fetchUserProfile.fulfilled, (state, action) => {
|
|
state.loading = false;
|
|
state.error = null;
|
|
|
|
const p = action.payload?.payload;
|
|
|
|
if (p?.id) state.userId = p.id;
|
|
if (p?.username) state.userName = p.username;
|
|
if (p?.email) state.userEmail = p.email;
|
|
if (p?.loadedFiles) state.loadedFiles = p.loadedFiles;
|
|
if (p?.maxLoadedFiles != null) state.maxFilesToLoad = p.maxLoadedFiles;
|
|
});
|
|
|
|
builder.addCase(fetchUserProfile.rejected, (state, action) => {
|
|
state.loading = false;
|
|
state.error = action.payload ?? { status: 500, message: "Unknown error" };
|
|
});
|
|
|
|
// Delete uploaded files
|
|
builder.addCase(fetchDeleteUploaded.pending, (state) => {
|
|
state.deleting = true;
|
|
state.deleteSuccess = false;
|
|
state.deletedCount = 0;
|
|
state.error = null;
|
|
});
|
|
|
|
builder.addCase(fetchDeleteUploaded.fulfilled, (state, action) => {
|
|
state.deleting = false;
|
|
state.deleteSuccess = true;
|
|
state.deletedCount = action.payload?.payload ?? 0;
|
|
state.loadedFiles = [];
|
|
state.error = null;
|
|
});
|
|
|
|
builder.addCase(fetchDeleteUploaded.rejected, (state, action) => {
|
|
state.deleting = false;
|
|
state.deleteSuccess = false;
|
|
state.error = action.payload ?? { status: 500, message: "Unknown error" };
|
|
});
|
|
},
|
|
});
|
|
|
|
//export const { logoutUser, clearError, clearDeleteStatus, addLoadedFiles } = userDetailsSlice.actions;
|
|
//export default userDetailsSlice.reducer;
|