@cannabioid1337

Куда класть бизнес логику в Redux Toolkit?

Делаю "игру в слова", после сабмита формы нужно провалидировать данные согласно условиям - если валидация не прошла, вызвать 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));
  },
);
  • Вопрос задан
  • 35 просмотров
Решения вопроса 1
Я бы сказал, что redux тут вообще не нужен. Но если уж пользоваться им, то ваше решение вполне нормальное.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы