Skip to content

Instantly share code, notes, and snippets.

@izszzz
Last active July 19, 2021 19:37
Show Gist options
  • Save izszzz/0d30252c213ace8013b9babdd6dedbc8 to your computer and use it in GitHub Desktop.
Save izszzz/0d30252c213ace8013b9babdd6dedbc8 to your computer and use it in GitHub Desktop.
redux-toolkit&devise_token_auth

ReduxToolkit DeviseTokenAuth CurrentUser

Description

save currentUser & header support monky patch

Example

import { useDispatch, useSelector } from "react-redux";
import {
  selectCurrentUser,
  selectHeaders,
  setHeaders,
} from "currentUser";

const dispatch = useDispatch();
const currentUser = useSelector(selectCurrentUser);
const headers = useSelector(selectHeaders);

axios.post(/* path */, /* params */, headers)
  .then(res=>{
    dispatch(setHeaders(res.headers));
  })
/* eslint-disable import/no-cycle */
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { IUser } from "../../interfaces";
import { RootState } from "../../store";
export interface ITokenHeaders {
["content-type"]: string;
["access-token"]: string;
client: string;
uid: string;
}
interface ICurrentUser {
currentUser?: IUser;
headers?: { headers: ITokenHeaders };
}
const initialState: ICurrentUser = {
currentUser: undefined,
headers: undefined,
};
const currentUserSlice = createSlice({
name: "currentUser",
initialState,
reducers: {
setCurrentUser: (state, action: PayloadAction<IUser>) => {
state.currentUser = action.payload;
},
setHeaders: (state, action: PayloadAction<ITokenHeaders>) => {
const {
"content-type": contentType,
"access-token": accessToken,
client,
uid,
} = action.payload;
// Batch Request
const prevAccessToken = state.headers?.headers["access-token"] || "";
state.headers = {
headers: {
"content-type": contentType,
"access-token": accessToken || prevAccessToken,
client,
uid,
},
};
},
remove: (state) => {
state.currentUser = undefined;
state.headers = undefined;
},
},
});
export const selectCurrentUser = (state: RootState): undefined | IUser =>
state.currentUser.currentUser;
export const selectHeaders = (
state: RootState
): undefined | { headers: ITokenHeaders } => state.currentUser.headers;
export const { setCurrentUser, setHeaders, remove } = currentUserSlice.actions;
export default currentUserSlice.reducer;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment