File size: 3,593 Bytes
11f4e50 | 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 | import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit';
import { authAPI } from '../services/api';
interface User {
id: string;
email: string;
subscription: string;
role: string;
videosGenerated?: number;
}
interface AuthState {
user: User | null;
token: string | null;
loading: boolean;
error: string | null;
}
const savedToken = localStorage.getItem('director_token');
const savedUser = localStorage.getItem('director_user');
const initialState: AuthState = {
user: savedUser ? JSON.parse(savedUser) : null,
token: savedToken || null,
loading: false,
error: null,
};
export const registerUser = createAsyncThunk(
'auth/register',
async ({ email, password }: { email: string; password: string }, { rejectWithValue }) => {
try {
const response = await authAPI.register(email, password);
return response.data;
} catch (error: any) {
return rejectWithValue(error.response?.data?.error || 'Registration failed.');
}
}
);
export const loginUser = createAsyncThunk(
'auth/login',
async ({ email, password }: { email: string; password: string }, { rejectWithValue }) => {
try {
const response = await authAPI.login(email, password);
return response.data;
} catch (error: any) {
return rejectWithValue(error.response?.data?.error || 'Login failed.');
}
}
);
const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
logout(state) {
state.user = null;
state.token = null;
state.error = null;
localStorage.removeItem('director_token');
localStorage.removeItem('director_user');
},
clearError(state) {
state.error = null;
},
},
extraReducers: (builder) => {
builder
.addCase(registerUser.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(registerUser.fulfilled, (state, action: PayloadAction<any>) => {
state.loading = false;
state.user = action.payload.user;
state.token = action.payload.token;
localStorage.setItem('director_token', action.payload.token);
localStorage.setItem('director_user', JSON.stringify(action.payload.user));
})
.addCase(registerUser.rejected, (state, action) => {
state.loading = false;
state.error = action.payload as string;
})
.addCase(loginUser.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(loginUser.fulfilled, (state, action: PayloadAction<any>) => {
state.loading = false;
state.user = action.payload.user;
state.token = action.payload.token;
localStorage.setItem('director_token', action.payload.token);
localStorage.setItem('director_user', JSON.stringify(action.payload.user));
})
.addCase(loginUser.rejected, (state, action) => {
state.loading = false;
state.error = action.payload as string;
});
},
});
export const { logout, clearError } = authSlice.actions;
export default authSlice.reducer;
|