import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit' import { RootState } from '@root/store' import * as Analytics from 'expo-firebase-analytics' import * as Localization from 'expo-localization' import { pickBy } from 'lodash' enum availableLanguages { 'zh-Hans', 'en' } export const changeAnalytics = createAsyncThunk( 'settings/changeAnalytics', async (newValue: SettingsState['analytics']) => { await Analytics.setAnalyticsCollectionEnabled(newValue) return newValue } ) export type SettingsState = { language: keyof availableLanguages theme: 'light' | 'dark' | 'auto' browser: 'internal' | 'external' analytics: boolean } export const settingsInitialState = { notification: { enabled: false }, language: Object.keys( pickBy(availableLanguages, (_, key) => Localization.locale.includes(key)) ) ? Object.keys( pickBy(availableLanguages, (_, key) => Localization.locale.includes(key) ) )[0] : 'en', theme: 'auto', browser: 'internal', analytics: true } const settingsSlice = createSlice({ name: 'settings', initialState: settingsInitialState as SettingsState, reducers: { changeLanguage: ( state, action: PayloadAction> ) => { state.language = action.payload }, changeTheme: ( state, action: PayloadAction> ) => { state.theme = action.payload }, changeBrowser: ( state, action: PayloadAction> ) => { state.browser = action.payload } }, extraReducers: builder => { builder.addCase(changeAnalytics.fulfilled, (state, action) => { state.analytics = action.payload }) } }) export const getSettingsLanguage = (state: RootState) => state.settings.language export const getSettingsTheme = (state: RootState) => state.settings.theme export const getSettingsBrowser = (state: RootState) => state.settings.browser export const getSettingsAnalytics = (state: RootState) => state.settings.analytics export const { changeLanguage, changeTheme, changeBrowser } = settingsSlice.actions export default settingsSlice.reducer