verdnatura-chat/app/reducers/login.ts

120 lines
2.5 KiB
TypeScript

import * as types from '../actions/actionsTypes';
import { TActionsLogin } from '../actions/login';
import { IUser, TUserStatus } from '../definitions';
export interface IUserLogin {
id: string;
token: string;
username: string;
name: string;
language?: string;
status: TUserStatus;
statusText: string;
roles: string[];
avatarETag?: string;
isFromWebView: boolean;
showMessageInMainThread: boolean;
enableMessageParserEarlyAdoption: boolean;
emails: Record<string, any>[];
customFields: Record<string, string>;
settings?: Record<string, string>;
}
export interface ILogin {
user: Partial<IUser>;
isLocalAuthenticated: boolean;
isAuthenticated: boolean;
isFetching: boolean;
error: Record<string, any>;
services: Record<string, any>;
failure: boolean;
}
export const initialState: ILogin = {
isLocalAuthenticated: true,
isAuthenticated: false,
isFetching: false,
user: {},
error: {},
services: {},
failure: false
};
export default function login(state = initialState, action: TActionsLogin): ILogin {
switch (action.type) {
case types.APP.INIT:
return initialState;
case types.LOGIN.REQUEST:
return {
...state,
isFetching: true,
isAuthenticated: false,
failure: false,
error: {}
};
case types.LOGIN.SUCCESS:
return {
...state,
isFetching: false,
isAuthenticated: true,
user: action.user,
failure: false,
error: {}
};
case types.LOGIN.FAILURE:
return {
...state,
isFetching: false,
isAuthenticated: false,
failure: true,
error: action.err
};
case types.LOGOUT:
return initialState;
case types.USER.SET:
return {
...state,
user: {
...state.user,
...action.user
}
};
case types.USER.CLEAR:
return {
...state,
user: {},
isAuthenticated: false,
isLocalAuthenticated: false
};
case types.LOGIN.SET_SERVICES:
return {
...state,
services: {
...action.data
}
};
case types.LOGIN.SET_PREFERENCE:
return {
...state,
user: {
...state.user,
settings: state.user?.settings
? {
...state.user?.settings,
preferences: state.user?.settings?.preferences
? { ...state.user.settings.preferences, ...action.preference }
: { ...action.preference }
}
: { profile: {}, preferences: {} }
}
};
case types.LOGIN.SET_LOCAL_AUTHENTICATED:
return {
...state,
isLocalAuthenticated: action.isLocalAuthenticated
};
default:
return state;
}
}