setting.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { createSlice, PayloadAction } from "@reduxjs/toolkit";
  2. import type { RootState } from "../store";
  3. export interface ISettingItem {
  4. key: string;
  5. value: string | number | boolean | string[] | undefined;
  6. }
  7. interface IState {
  8. settings?: ISettingItem[];
  9. key?: string;
  10. value?: string | string[] | number | boolean;
  11. }
  12. const initialState: IState = {};
  13. const KEY = "user-settings";
  14. const set = (settings: ISettingItem[]) => {
  15. localStorage.setItem(KEY, JSON.stringify(settings));
  16. };
  17. export const slice = createSlice({
  18. name: "setting",
  19. initialState,
  20. reducers: {
  21. refresh: (state, action: PayloadAction<ISettingItem[]>) => {
  22. state.settings = action.payload;
  23. },
  24. onChange: (state, action: PayloadAction<ISettingItem>) => {
  25. state.key = action.payload.key;
  26. state.value = action.payload.value;
  27. //将新的改变放入 settings
  28. if (typeof state.settings !== "undefined") {
  29. const index = state.settings.findIndex(
  30. (element) => element.key === action.payload.key
  31. );
  32. if (index >= 0) {
  33. state.settings[index].value = action.payload.value;
  34. } else {
  35. state.settings.push(action.payload);
  36. }
  37. } else {
  38. state.settings = [action.payload];
  39. }
  40. set(state.settings);
  41. },
  42. },
  43. });
  44. export const { refresh, onChange } = slice.actions;
  45. export const setting = (state: RootState): IState => state.setting;
  46. export const settingInfo = (state: RootState): ISettingItem[] | undefined =>
  47. state.setting.settings;
  48. export const onChangeKey = (state: RootState): string | undefined =>
  49. state.setting.key;
  50. export const onChangeValue = (
  51. state: RootState
  52. ): string | string[] | number | boolean | undefined => state.setting.value;
  53. export default slice.reducer;