inventory / frontend / src / features / search / SearchSlice.jsx
SearchSlice.jsx
Raw
import { createSlice, createAsyncThunk } from "@reduxjs/toolkit";
import sebnInventory from "../../apis/sebnInventory";

export const searchSap = createAsyncThunk(
  "search/searchSap",
  async (thunkAPI) => {
    const response = await sebnInventory.get(
      `sap_item/?${thunkAPI.mode}__icontains=${thunkAPI.value}`
    );
    return response.data.results;
  }
);

export const submitItem = createAsyncThunk(
  "search/submitItem",
  async (thunkAPI) => {
    const {
      area,
      description,
      inventory_id,
      inventory_taking,
      label_id,
      name,
      sap_id,
      serial_nbr,
    } = thunkAPI;
    const response = await sebnInventory.post(`item/`, {
      area: area,
      description: description,
      inventory_taking: inventory_taking,
      inventory_id: inventory_id,
      label_id: label_id,
      name: name,
      sap_id: sap_id,
      serial_nbr: serial_nbr,
    });
    return response.data;
  }
);

export const searchSlice = createSlice({
  name: "search",
  initialState: {
    search_value: "",
    search_mode: "inventory_id",
    search_result: [],
    selected_item: null,
    history: [],
  },
  reducers: {
    setSearchMode: (state, action) => {
      state.search_mode = action.payload;
      state.selected_item = null;
    },
    setSearchValue: (state, action) => {
      state.search_value = action.payload;
      state.selected_item = null;
    },
    setSelectedItem: (state, action) => {
      state.selected_item = action.payload;
      state.search_result = [];
    },
    invokeItemForm: (state) => {
      state.search_value = "";
      state.selected_item = {
        area: "",
        description: "",
        inventory_id: null,
        inventory_taking: null,
        label_id: "",
        name: "",
        sap_id: "",
        serial_nbr: "",
      };
    },
    cancelSubmit: (state) => {
      state.search_result = [];
      state.selected_item = null;
    },
  },
  extraReducers: {
    [searchSap.fulfilled]: (state, action) => {
      state.search_result = action.payload;
    },
    [submitItem.fulfilled]: (state, action) => {
      state.history.push(action.payload);
      state.selected_item = null;
      state.search_value = "";
    },
  },
});

export const {
  setSearchMode,
  setSearchValue,
  setSelectedItem,
  cancelSubmit,
  invokeItemForm,
} = searchSlice.actions;

export default searchSlice.reducer;