79 lines
2.8 KiB
JavaScript
79 lines
2.8 KiB
JavaScript
import { createSlice } from '@reduxjs/toolkit';
|
|
|
|
// ----------------------------------------------------
|
|
// Helper Function: กำหนดบทบาท (Role) จาก Django User Object
|
|
// ----------------------------------------------------
|
|
const determineRole = (user) => {
|
|
if (!user || !user.id) {
|
|
return 'guest';
|
|
}
|
|
|
|
// 1. ใช้ฟิลด์ 'role' ที่ส่งมาจาก Backend โดยตรง (ถ้ามี)
|
|
if (user.role) {
|
|
return user.role.toLowerCase(); // เช่น 'ADMIN' -> 'admin'
|
|
}
|
|
|
|
// 2. ใช้ฟิลด์ is_superuser/is_staff เป็น Fallback
|
|
if (user.is_superuser) {
|
|
return 'admin';
|
|
}
|
|
if (user.is_staff) {
|
|
return 'manager';
|
|
}
|
|
// ผู้ใช้ทั่วไป
|
|
return 'viewer';
|
|
};
|
|
|
|
// ----------------------------------------------------
|
|
// ฟังก์ชันช่วยในการอ่านค่าจาก Local Storage เพื่อกำหนดสถานะเริ่มต้น
|
|
// ----------------------------------------------------
|
|
const getInitialAuthState = () => {
|
|
const token = localStorage.getItem('token');
|
|
const user = JSON.parse(localStorage.getItem('user'));
|
|
|
|
// ดึง Role
|
|
const role = determineRole(user);
|
|
|
|
return {
|
|
isAuthenticated: !!token,
|
|
user: user || null,
|
|
role: role,
|
|
};
|
|
};
|
|
|
|
const initialState = getInitialAuthState();
|
|
|
|
const authSlice = createSlice({
|
|
name: 'auth',
|
|
initialState,
|
|
reducers: {
|
|
// Reducer สำหรับการล็อกอินสำเร็จ
|
|
loginSuccess: (state, action) => {
|
|
state.isAuthenticated = true;
|
|
state.user = action.payload.user;
|
|
state.role = action.payload.role;
|
|
},
|
|
|
|
// Reducer สำหรับการออกจากระบบ
|
|
logout: (state) => {
|
|
state.isAuthenticated = false;
|
|
state.user = null;
|
|
state.role = 'guest';
|
|
// ลบข้อมูลจาก localStorage
|
|
localStorage.removeItem('token');
|
|
localStorage.removeItem('user');
|
|
},
|
|
|
|
// Reducer สำหรับอัปเดตข้อมูลผู้ใช้ (เช่น หลังอัปเดตโปรไฟล์)
|
|
updateUser: (state, action) => {
|
|
state.user = action.payload.user;
|
|
state.role = action.payload.role; // อัปเดต Role ด้วย (เผื่อมีการอัปเดตสิทธิ์)
|
|
localStorage.setItem('user', JSON.stringify(action.payload.user));
|
|
localStorage.setItem('role', action.payload.role);
|
|
}
|
|
},
|
|
});
|
|
|
|
export const { loginSuccess, logout, updateUser } = authSlice.actions;
|
|
|
|
export default authSlice.reducer; |