✍️ What I Learned/TIL

[TIL] React 챗봇 만들기2 - redux-toolkit으로 챗봇 on/off여부 전역적인 상태관리

Jiwon() 2023. 8. 8. 23:18


1. 챗봇 on/off state 전역 상태관리를 위한 redux 세팅

챗봇 on/off 상태는 모든 페이지에서 똑같이 인식해야하므로 redux-toolkit을 사용하여 전역적으로 관리해주어야 한다.

  • redux에서 모듈 슬라이스 파일을 만들고, 모듈 슬라이스를 리덕스 configStore에 등록해줌

 

1) redux - module - chatBotUISlice.ts

import { createSlice } from '@reduxjs/toolkit';
import { ChatBotState } from '../../types/types';

const initialState: ChatBotState = {
  chatBotIsActive: false,
};

const chatBotUISlice = createSlice({
  name: 'chatBotUI',
  initialState,
  reducers: {
    toggleChatBotState: (state) => {
      state.chatBotIsActive = !state.chatBotIsActive;
    },
  },
});

export const { toggleChatBotState } = chatBotUISlice.actions;
export default chatBotUISlice.reducer;

 

 

2) redux - config - configStore.tsx

import { configureStore } from '@reduxjs/toolkit';
import chatBotUISlice from '../module/chatBotUISlice';
import userSlice from '../module/userSlice';
import modalSlice from '../module/modalSlice';

export const store = configureStore({
  reducer: {
    user: userSlice,
    modal: modalSlice,
    chatBotUI: chatBotUISlice,
  }
});

// Infer the `RootState` and `AppDispatch` types from the store itself
export type RootState = ReturnType<typeof store.getState>;
export type AppDispatch = typeof store.dispatch;

 

 


2. 챗봇 UI 컴포넌트 - Router.tsx에서 관리

1) shared - Router.tsx

import { BrowserRouter, Route, Routes } from 'react-router-dom';
import Main from '../pages/Main';
import Detail from '../pages/Detail';
import Mypage from '../pages/Mypage';
import Studyboard from '../pages/Studyboard';
import Freeboard from '../pages/Freeboard';
import Write from '../pages/Write';
import NotFound from '../pages/NotFound';
import PrivateRoute from './PrivateRoute';
import Layout from './Layout';

import { useAppDispatch, useAppSelector } from '../hooks';
import { RootState } from '../redux/config/configStore';
import { toggleChatBotState } from '../redux/module/chatBotUISlice';
import ChatBot from '../components/chatbot/ChatBot';
import ChatIcon from 'remixicon-react/QuestionAnswerFillIcon';

import * as S from '../styles/StChatBot';

const Router = () => {
  const { user } = useAppSelector((state: RootState) => state.user);
  const chatBotIsActive = useAppSelector((state: RootState) => state.chatBotUI.chatBotIsActive);
  const dispatch = useAppDispatch();
  const toggleChatBot = () => {
    dispatch(toggleChatBotState());
  };
  return (
    <BrowserRouter>
      <Routes>
        <Route element={<Layout />}>
          {/* ...Route 생략 */}

      {/* user가 있을 때만 챗봇 버튼이 보이도록 */}
      {user && (
        <>
          <S.ChatBotButton onClick={toggleChatBot}>
            <ChatIcon color="#fff" size={20} />
          </S.ChatBotButton>
          {chatBotIsActive ? <ChatBot /> : null}
        </>
      )}
    </BrowserRouter>
  );
};
export default Router;