Skip to content

Instantly share code, notes, and snippets.

@PatrickNiyogitare28
Created July 7, 2023 14:07
Show Gist options
  • Save PatrickNiyogitare28/8eabea89dafb4e0ba9f75f23af1176a2 to your computer and use it in GitHub Desktop.
Save PatrickNiyogitare28/8eabea89dafb4e0ba9f75f23af1176a2 to your computer and use it in GitHub Desktop.
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import type { RootState } from 'src/store/store'
import { SuccessListAPIResponse } from 'src/types/api-response';
import { MessageCategory } from 'src/types/category';
import { msgCategoriesService } from '@services/msg-categories.service';

// declaring the types for our state
export type MsgCategoriesState = {
    categories: Array<MessageCategory>,
    loading: boolean,
    error: boolean,
    message: string,
    reload: boolean
}

const initialState: MsgCategoriesState = {
    categories: [],
    loading: false,
    error: false,
    message: "",
    reload: false
}
export const getCategories = createAsyncThunk('GET_CATEGORIES', async () => {
    const response = await msgCategoriesService.getAll();
    return response
  })
  export const triggerReloadCategories = createAsyncThunk('RELOAD_CATEGORIES', async () => {
  })
  
  
  export const categoriesSlice = createSlice({
    name: 'categories',
    initialState,
    reducers: {
    },
  
    extraReducers: builder => {
      builder
        .addCase(getCategories.pending, state => {
          state.loading = true;
        })
        .addCase(getCategories.fulfilled, (state, { payload }) => {
          state.loading = false;
          state.categories = ((payload as SuccessListAPIResponse).content as Array<MessageCategory>);
        })
        .addCase(getCategories.rejected, state => {
          state.loading = false
          state.error = true
        })
        /*Reload categories*/
        .addCase(triggerReloadCategories.pending, state => {
          state.reload = false;
        })
        .addCase(triggerReloadCategories.fulfilled, (state, { payload }) => {
          state.reload = true;
        })
        .addCase(triggerReloadCategories.rejected, state => {
          state.reload = false
        })
    },
  })
  
  export const selectedMsgCategories = (state: RootState) => state.categories
  
  export default categoriesSlice.reducer
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment