frontend/store/reducers/nodesInputReducer.ts

70 lines
1.7 KiB
TypeScript
Raw Normal View History

2022-10-22 10:37:05 +03:00
import {createSlice, PayloadAction, createSelector} from '@reduxjs/toolkit';
import {search, createHints} from './asyncActions';
export interface INode{
type: "Unknown" | "Category" | "Name" | string;
value: string;
}
export interface IHint{
node: INode;
coordinate: number;
}
export interface IProduct{
name: string;
category: string;
characteristics: {
name: string;
value: string;
}[];
}
interface INodesInput {
nodes: INode[],
hints: {
coordinate: number,
node: INode
}[],
current_word: string,
products: IProduct[]
}
const initialState: INodesInput = {
nodes: [],
hints: [],
current_word: "",
products: []
}
const nodesInputSlice = createSlice({
name: 'nodesInput',
initialState,
reducers: {
setCurrentWord(state, action: PayloadAction<string>) {
state.current_word = action.payload;
},
createNode(state, action: PayloadAction<INode>) {
state.nodes = state.nodes.concat([action.payload]);
}
},
extraReducers: (builder) => {
builder.addCase(search.fulfilled, (state, action) => {
state.products = action.payload;
})
builder.addCase(createHints.fulfilled, (state, action) => {
state.hints = action.payload;
})
}
})
export const {setCurrentWord, createNode} = nodesInputSlice.caseReducers;
export const hints = createSelector((state: INodesInput) => state.hints, hints => hints)
export const currentWord = createSelector((state: INodesInput) => state.current_word, word => word)
export const products = createSelector((state: INodesInput) => state.products, products => products)
export default nodesInputSlice.reducer;