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;