<%_ if(features.loginandsignup) { _%>
import { ApiOkResponse } from 'apisauce';
import { Dispatch } from 'react';
import { createTypes, completeTypes, withPostSuccess } from 'redux-recompose';
import { setApiHeaders, removeApiHeaders } from '@config/api';
import { CurrentUser, AuthData } from '@interfaces/authInterfaces';
import { Nullable } from '@interfaces/globalInterfaces';
import { Action, State } from '@interfaces/reduxInterfaces';
import { login, logout } from '@services/AuthService';

export const actions = createTypes(
  completeTypes({ primaryActions: ['LOGIN', 'LOGOUT'], ignoredActions: ['AUTH_INIT'<%_ if(features.onboarding) { _%>, 'HAS_ACCESS'<%_ } _%>] }),
  '@@AUTH'
);

const TARGETS = {
<%_ if(features.onboarding) { _%>
  ONBOARDING: 'hasAccessOnBoarding',
<%_ } _%>
  CURRENT_USER: 'currentUser'
};

export const actionCreators = {
  init: () => (dispatch: Dispatch<Action<Nullable<CurrentUser>>>, getState: () => State) => {
  <%_ if(features.onboarding) { _%>
    const { currentUser, hasAccessOnBoarding } = getState().auth;
  <%_ } else { _%>
    const { currentUser } = getState().auth;
  <%_ } _%>
    if (currentUser) setApiHeaders(currentUser.sessionToken);
    dispatch({
      type: actions.AUTH_INIT,
      target: TARGETS.CURRENT_USER,
      <%_ if(features.onboarding) { _%>
      hasAccessOnBoarding,
      <%_ } _%>
      payload: currentUser
    });
  },
  login: (authData: AuthData) => ({
    type: actions.LOGIN,
    target: TARGETS.CURRENT_USER,
    service: login,
    payload: authData,
    injections: [
      withPostSuccess((_: any, response: ApiOkResponse<CurrentUser>) => {
        setApiHeaders(response.data?.sessionToken!);
      })
    ]
  }),
  logout: () => ({
    type: actions.LOGOUT,
    target: TARGETS.CURRENT_USER,
    service: logout,
    successSelector: () => null,
    injections: [
      withPostSuccess((<%_ if(features.onboarding) { _%>dispatch: Dispatch<any><%_ } _%>) => {
        removeApiHeaders();
      <%_ if(features.onboarding) { _%>
        dispatch(actionCreators.setHasAccessOnBoarding(false));
      <%_ } _%>
      })
    ]
  })<%_ if(features.onboarding) { _%>,
  setHasAccessOnBoarding: (value: boolean) => ({
    type: actions.HAS_ACCESS,
    target: TARGETS.ONBOARDING,
    payload: value
  })
  <%_ }_%>
};
<%_ } else if (features.onboarding) { _%>
import { Dispatch } from 'react';
import { createTypes } from 'redux-recompose';
import { Action, State } from '@interfaces/reduxInterfaces';

export const actions = createTypes(['AUTH_INIT', 'HAS_ACCESS'], '@@AUTH');

const TARGETS = {
  ONBOARDING: 'hasAccessOnBoarding'
};

export const actionCreators = {
  init: () => (dispatch: Dispatch<Action<boolean>>, getState: () => State) => {
    const { hasAccessOnBoarding } = getState().auth;
    dispatch({
      type: actions.AUTH_INIT,
      target: TARGETS.ONBOARDING,
      payload: hasAccessOnBoarding
    });
  },
  setHasAccessOnBoarding: (value: boolean) => ({
    type: actions.HAS_ACCESS,
    target: TARGETS.ONBOARDING,
    payload: value
  })
};
<%_ } else { _%>
import { createTypes } from 'redux-recompose';

export const actions = createTypes(['AUTH_INIT'], '@@AUTH');

export const actionCreators = {
  init: () => ({ type: actions.AUTH_INIT })
};
<%_ } _%>
