|
1 | | -import create from 'zustand'; |
| 1 | +import { enhanceTags } from 'src/utils/DataEnhancement' |
| 2 | +import create from 'zustand' |
2 | 3 | import { persist } from 'zustand/middleware' |
3 | | -import { SelectedCard, SelectedTag, Theme, ListingMode } from "../types"; |
| 4 | +import { SelectedCard, SelectedTag, Theme, ListingMode, CardSettingsType } from '../types' |
| 5 | +import { Tag } from 'src/features/remoteConfig' |
| 6 | + |
4 | 7 |
|
5 | 8 | export type UserPreferencesState = { |
6 | | - userSelectedTags: string[] |
7 | | - theme: Theme, |
8 | | - openLinksNewTab: boolean, |
9 | | - listingMode: ListingMode, |
10 | | - searchEngine: string, |
11 | | - cards: SelectedCard[], |
12 | | -}; |
| 9 | + userSelectedTags: Tag[] |
| 10 | + theme: Theme |
| 11 | + openLinksNewTab: boolean |
| 12 | + listingMode: ListingMode |
| 13 | + searchEngine: string |
| 14 | + cards: SelectedCard[] |
| 15 | + cardsSettings: Record<string, CardSettingsType> |
| 16 | +} |
13 | 17 |
|
14 | 18 | type UserPreferencesStoreActions = { |
15 | | - initState: (newState: UserPreferencesState) => void; |
16 | | - setTheme: (theme: Theme) => void; |
17 | | - setSearchEngine: (theme: string) => void; |
18 | | - setOpenLinksNewTab: (openLinksNewTab: boolean) => void; |
19 | | - setListingMode: (listingMode: ListingMode) => void; |
20 | | - setCards: (selectedCards: SelectedCard[]) => void; |
21 | | - setTags: (selectedTags: SelectedTag[]) => void; |
22 | | -}; |
23 | | - |
24 | | -export const useUserPreferences = create(persist<UserPreferencesState & UserPreferencesStoreActions>((set) => ({ |
25 | | - userSelectedTags: [], |
26 | | - theme: "dark", |
27 | | - searchEngine: "google", |
28 | | - listingMode: "normal", |
29 | | - openLinksNewTab: true, |
30 | | - cards: [ |
31 | | - { id: 0, name: 'github' }, |
32 | | - { id: 1, name: 'hackernews' }, |
33 | | - { id: 2, name: 'devto' }, |
34 | | - { id: 3, name: 'producthunt' }, |
35 | | - ], |
36 | | - setSearchEngine: (searchEngine: string) => set({ searchEngine: searchEngine }), |
37 | | - setListingMode: (listingMode: ListingMode) => set({ listingMode: listingMode }), |
38 | | - setTheme: (theme: Theme) => set({ theme: theme }), |
39 | | - setOpenLinksNewTab: (openLinksNewTab: boolean) => set({ openLinksNewTab: openLinksNewTab }), |
40 | | - setCards: (selectedCards: SelectedCard[]) => set({ cards: selectedCards }), |
41 | | - setTags: (selectedTags: SelectedTag[]) => set({ userSelectedTags: selectedTags.map(tag => tag.value) }), |
42 | | - initState: (newState: UserPreferencesState) => set(() => ({ ...newState })) |
| 19 | + initState: (newState: UserPreferencesState) => void |
| 20 | + setTheme: (theme: Theme) => void |
| 21 | + setSearchEngine: (theme: string) => void |
| 22 | + setOpenLinksNewTab: (openLinksNewTab: boolean) => void |
| 23 | + setListingMode: (listingMode: ListingMode) => void |
| 24 | + setCards: (selectedCards: SelectedCard[]) => void |
| 25 | + setTags: (selectedTags: Tag[]) => void |
| 26 | + setCardSettings: (card: string, settings: CardSettingsType) => void |
| 27 | +} |
43 | 28 |
|
44 | | -}), { |
45 | | - name: 'preferences_storage', |
46 | | - onRehydrateStorage(state) { |
47 | | - console.log("state", state) |
48 | | - }, |
49 | | -})); |
| 29 | +export const useUserPreferences = create( |
| 30 | + persist<UserPreferencesState & UserPreferencesStoreActions>( |
| 31 | + (set) => ({ |
| 32 | + userSelectedTags: [], |
| 33 | + cardsSettings: {}, |
| 34 | + theme: 'dark', |
| 35 | + searchEngine: 'google', |
| 36 | + listingMode: 'normal', |
| 37 | + openLinksNewTab: true, |
| 38 | + cards: [ |
| 39 | + { id: 0, name: 'github' }, |
| 40 | + { id: 1, name: 'hackernews' }, |
| 41 | + { id: 2, name: 'devto' }, |
| 42 | + { id: 3, name: 'producthunt' }, |
| 43 | + ], |
| 44 | + setSearchEngine: (searchEngine: string) => set({ searchEngine: searchEngine }), |
| 45 | + setListingMode: (listingMode: ListingMode) => set({ listingMode: listingMode }), |
| 46 | + setTheme: (theme: Theme) => set({ theme: theme }), |
| 47 | + setOpenLinksNewTab: (openLinksNewTab: boolean) => set({ openLinksNewTab: openLinksNewTab }), |
| 48 | + setCards: (selectedCards: SelectedCard[]) => set({ cards: selectedCards }), |
| 49 | + setTags: (selectedTags: Tag[]) => set({ userSelectedTags: selectedTags }), |
| 50 | + initState: (newState: UserPreferencesState) => set(() => { |
| 51 | + return { ...newState } |
| 52 | + }), |
| 53 | + setCardSettings: (card: string, settings: CardSettingsType) => |
| 54 | + set((state) => ({ |
| 55 | + cardsSettings: { |
| 56 | + ...state.cardsSettings, |
| 57 | + [card]: { ...state.cardsSettings[card], ...settings }, |
| 58 | + }, |
| 59 | + })), |
| 60 | + }), |
| 61 | + { |
| 62 | + name: 'preferences_storage', |
| 63 | + onRehydrateStorage(state) { |
| 64 | + console.log('state', state) |
| 65 | + }, |
| 66 | + serialize: ({ state }) => { |
| 67 | + let stateStr = JSON.stringify({ |
| 68 | + ...state, |
| 69 | + userSelectedTags: state.userSelectedTags.map((tag) => tag.value), |
| 70 | + }) |
| 71 | + console.log(666, stateStr, 'serialize') |
| 72 | + return stateStr |
| 73 | + }, |
| 74 | + deserialize: (stateStr) => { |
| 75 | + let state = JSON.parse(stateStr) |
| 76 | + state = { |
| 77 | + ...state, |
| 78 | + userSelectedTags: enhanceTags(state.userSelectedTags), |
| 79 | + } |
| 80 | + console.log(666, state, 'deserialize') |
| 81 | + return state |
| 82 | + }, |
| 83 | + } |
| 84 | + ) |
| 85 | +) |
0 commit comments