2025-06-26 15:12:34 +08:00

63 lines
1.8 KiB
TypeScript

import { User } from '@/types/user';
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
import * as SecureStore from 'expo-secure-store';
import { Platform } from 'react-native';
interface AuthState {
user: User | null;
token: string | null;
isAuthenticated: boolean;
task_id: string | null;
url: string | null;
refresh_token: string | null;
}
const initialState: AuthState = {
user: null,
token: null,
isAuthenticated: false,
task_id: null,
url: null,
refresh_token: null
};
export const authSlice = createSlice({
name: 'auth',
initialState,
reducers: {
setCredentials: (
state,
action: PayloadAction<{ user: User; token: string }>
) => {
const { user, token } = action.payload;
state.user = user;
state.token = token;
state.isAuthenticated = true;
},
clearCredentials: (state) => {
state.user = null;
state.token = null;
state.isAuthenticated = false;
if (Platform.OS === 'web') {
localStorage.setItem('user', "");
localStorage.setItem('token', "");
} else {
SecureStore.setItemAsync('user', "");
SecureStore.setItemAsync('token', "");
}
},
setGuestTaskData: (state, action: PayloadAction<{ task_id: string; url: string }>) => {
state.task_id = action.payload.task_id;
state.url = action.payload.url;
}
}
});
export const { setCredentials, clearCredentials, setGuestTaskData } = authSlice.actions;
export default authSlice.reducer;
// Selectors
export const selectCurrentUser = (state: { auth: AuthState }) => state.auth.user;
export const selectCurrentToken = (state: { auth: AuthState }) => state.auth.token;
export const selectIsAuthenticated = (state: { auth: AuthState }) => state.auth.isAuthenticated;