import { Observable } from 'rxjs' import { combineEpics, ActionsObservable } from 'redux-observable' import { Store } from 'redux' import * as actions from './actions' import * as api from './api' import * as AuthSelector from '../auth/selectors' import * as OnboardingActions from '../onboarding/actions' import * as OnboardingSelectors from '../onboarding/selectors' export const setSettingStatusEpic = (action$: ActionsObservable, { getState }: Store) => { return action$.ofType( actions.setSettingStatus.toString(), actions.updateDomainMuteList.toString(), actions.addEmailToMuteList.toString(), actions.removeEmailFromMuteList.toString(), actions.setInboxesToRunExtensionOn.toString(), actions.addDomainToMuteList.toString(), actions.removeDomainFromMuteList.toString(), ) .mergeMap(() => { const settings = getState().settings chrome.storage.sync.set({ settings: { ...settings } }) const accessToken = AuthSelector.accessToken(getState()) const userId = AuthSelector.userId(getState()) if (!userId) { return Observable.empty() } return api.updateUserProperties2(userId, accessToken, { extensionSettings: settings }) .map(() => actions.setUserPropertiesSettingsSuccess()) .startWith(actions.setUserPropertiesSettingsPending()) .catch(() => { return Observable.of(actions.setUserPropertiesSettingsFailed()) }) }) } export const userHasSeenUnfollow = (action$: ActionsObservable, { getState }: Store) => { return action$.ofType( actions.addEmailToMuteList.toString(), actions.removeEmailFromMuteList.toString(), actions.addDomainToMuteList.toString(), actions.removeDomainFromMuteList.toString(), ) .filter(() => !OnboardingSelectors.userHasSeenUnfollow(getState())) .mergeMap(() => Observable.of(OnboardingActions.userHasSeenUnfollow(true))) } export const epic = combineEpics( setSettingStatusEpic, userHasSeenUnfollow, )