You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			TypeScript
		
	
| import { isBoolean } from 'lodash';
 | |
| 
 | |
| import { PayloadAction, createSlice } from '@reduxjs/toolkit';
 | |
| import { SettingsKey } from '../../data/settings-key';
 | |
| 
 | |
| const SettingsBoolsKeyTrackedInRedux = [
 | |
|   SettingsKey.someDeviceOutdatedSyncing,
 | |
|   SettingsKey.settingsLinkPreview,
 | |
|   SettingsKey.hasBlindedMsgRequestsEnabled,
 | |
|   SettingsKey.hasFollowSystemThemeEnabled,
 | |
|   SettingsKey.hasShiftSendEnabled,
 | |
|   SettingsKey.hideRecoveryPassword,
 | |
| ] as const;
 | |
| 
 | |
| export type SettingsState = {
 | |
|   settingsBools: Record<(typeof SettingsBoolsKeyTrackedInRedux)[number], boolean>;
 | |
| };
 | |
| 
 | |
| export function getSettingsInitialState() {
 | |
|   return {
 | |
|     settingsBools: {
 | |
|       someDeviceOutdatedSyncing: false,
 | |
|       'link-preview-setting': false, // this is the value of SettingsKey.settingsLinkPreview
 | |
|       hasBlindedMsgRequestsEnabled: false,
 | |
|       hasFollowSystemThemeEnabled: false,
 | |
|       hasShiftSendEnabled: false,
 | |
|       hideRecoveryPassword: false,
 | |
|     },
 | |
|   };
 | |
| }
 | |
| 
 | |
| function isTrackedBoolean(key: string): key is (typeof SettingsBoolsKeyTrackedInRedux)[number] {
 | |
|   return SettingsBoolsKeyTrackedInRedux.indexOf(key as any) !== -1;
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * This slice is the one holding the settings of the currently logged in user in redux.
 | |
|  * This is in addition to the settings stored in the Storage class but is a memory only representation of them.
 | |
|  * You should not try to make changes here, but instead through the Storage class.
 | |
|  * What you can do with this slice, is to create selectors and hooks to keep your UI in sync with the state in whatever is Storage.
 | |
|  */
 | |
| const settingsSlice = createSlice({
 | |
|   name: 'settings',
 | |
|   // when this createSlice gets invoke, the storage is not ready, but redux still wants a state so we just avoid hitting the storage.
 | |
|   // Once the storage is ready,
 | |
|   initialState: getSettingsInitialState(),
 | |
|   reducers: {
 | |
|     updateAllOnStorageReady(
 | |
|       state,
 | |
|       {
 | |
|         payload,
 | |
|       }: PayloadAction<{
 | |
|         settingsLinkPreview: boolean;
 | |
|         someDeviceOutdatedSyncing: boolean;
 | |
|         hasBlindedMsgRequestsEnabled: boolean;
 | |
|         hasFollowSystemThemeEnabled: boolean;
 | |
|         hasShiftSendEnabled: boolean;
 | |
|         hideRecoveryPassword: boolean;
 | |
|       }>
 | |
|     ) {
 | |
|       const {
 | |
|         hasBlindedMsgRequestsEnabled,
 | |
|         hasFollowSystemThemeEnabled,
 | |
|         settingsLinkPreview,
 | |
|         someDeviceOutdatedSyncing,
 | |
|         hasShiftSendEnabled,
 | |
|         hideRecoveryPassword,
 | |
|       } = payload;
 | |
| 
 | |
|       state.settingsBools.someDeviceOutdatedSyncing = someDeviceOutdatedSyncing;
 | |
|       state.settingsBools['link-preview-setting'] = settingsLinkPreview;
 | |
|       state.settingsBools.hasBlindedMsgRequestsEnabled = hasBlindedMsgRequestsEnabled;
 | |
|       state.settingsBools.hasFollowSystemThemeEnabled = hasFollowSystemThemeEnabled;
 | |
|       state.settingsBools.hasShiftSendEnabled = hasShiftSendEnabled;
 | |
|       state.settingsBools.hideRecoveryPassword = hideRecoveryPassword;
 | |
| 
 | |
|       return state;
 | |
|     },
 | |
|     updateSettingsBoolValue(state, action: PayloadAction<{ id: string; value: boolean }>) {
 | |
|       const { id, value } = action.payload;
 | |
| 
 | |
|       if (!isTrackedBoolean(id) || !isBoolean(value)) {
 | |
|         return state;
 | |
|       }
 | |
| 
 | |
|       state.settingsBools[id] = value;
 | |
| 
 | |
|       return state;
 | |
|     },
 | |
|     deleteSettingsBoolValue(state, action: PayloadAction<string>) {
 | |
|       if (!isTrackedBoolean(action.payload)) {
 | |
|         return state;
 | |
|       }
 | |
| 
 | |
|       delete state.settingsBools[action.payload];
 | |
|       return state;
 | |
|     },
 | |
|   },
 | |
| });
 | |
| 
 | |
| const { actions, reducer } = settingsSlice;
 | |
| export const { updateSettingsBoolValue, deleteSettingsBoolValue, updateAllOnStorageReady } =
 | |
|   actions;
 | |
| export const settingsReducer = reducer;
 |