import { ServerErrorResponse } from '@/interface/Shared';
import { AsyncThunkPayloadCreator, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';

export function createSafeThunk<Returned, Arg = void>(
  typePrefix: string,
  payloadCreator: (arg: Arg, thunkAPI: { rejectWithValue: (value: ServerErrorResponse) => any }) => Promise<Returned>,
) {
  return createAsyncThunk<Returned, Arg>(typePrefix, async (arg, thunkAPI) => {
    try {
      return await payloadCreator(arg, thunkAPI);
    } catch (error) {
      if (axios.isAxiosError(error) && error.response) {
        return thunkAPI.rejectWithValue(error.response.data as ServerErrorResponse);
      }
      throw error;
    }
  });
}
