Делаю "игру в слова", после сабмита формы нужно провалидировать данные согласно условиям - если валидация не прошла, вызвать dispatch() на показ ошибки в глобальных уведомлениях, если все ок - совершить некоторые изменения состояния в RTK, которые тоже включают проверки и доп логику. Сейчас в компоненте, после сабмита вызывается метод, который сделан на asyncThunk, но полагаю это не корректно (как минимум я не трогаю API бекенда, все на клиенте). Куда лучше запихнуть эту бизнес-логику?
const onSubmit = (inputId: number, word: string) => {
dispatch(submitWordTest({ inputId, word }));
};
<Game onSubmit={onSubmit} />
export const submitWordTest = createAsyncThunk(
"game/submitWord",
async (
{ inputId, word }: { inputId: number; word: string },
{ getState, dispatch, rejectWithValue },
) => {
const { game } = getState() as RootState;
if (inputId > 0) {
const { value } = game.inputs[inputId - 1];
const lastLetter = _.last(filterWord(value));
if (lastLetter !== word[0]) {
return rejectWithValue({
inputId,
message: `Слово не начинается на букву "${lastLetter?.toUpperCase()}"!`,
});
}
}
if (!game.words.includes(word)) {
return rejectWithValue({
inputId,
message: "Слово не подходит!",
});
}
dispatch(
setInputValue({
inputIndex: inputId,
value: word,
}),
);
dispatch(setInputSuccess(inputId));
dispatch(makeBotMove(word));
},
);