Skip to content

Commit e26d37b

Browse files
committed
user prefercenes serialization
1 parent b739530 commit e26d37b

6 files changed

Lines changed: 111 additions & 69 deletions

File tree

src/components/UserTags.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import React from 'react'
22
import { TiPlus } from 'react-icons/ti';
33
import { useUserPreferences } from 'src/stores/preferences'
4-
import { enhanceTags } from 'src/utils/DataEnhancement'
54

65
function UserTags({ onAddClicked }) {
76
const { userSelectedTags } = useUserPreferences()
87

98
return (
109
<nav className="tags">
11-
{enhanceTags(userSelectedTags).map((tag, index) => (
10+
{userSelectedTags.map((tag, index) => (
1211
<span key={index} className="tag">
1312
{tag.value}
1413
</span>

src/features/settings/components/SettingsModal.tsx

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ import {
1818
trackTabTarget,
1919
} from 'src/lib/analytics'
2020
import { useRemoteConfigStore } from 'src/features/remoteConfig'
21-
import { enhanceTags } from 'src/utils/DataEnhancement'
21+
import { Tag } from 'src/features/remoteConfig'
22+
2223

2324
type SettingsModalProps = {
2425
showSettings: boolean
@@ -55,7 +56,7 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
5556
setShowSettings(false)
5657
}
5758

58-
const onTagsSelectChange = (tags: MultiValue<OptionType>, metas: ActionMeta<OptionType>) => {
59+
const onTagsSelectChange = (tags: MultiValue<Tag>, metas: ActionMeta<OptionType>) => {
5960
switch (metas.action) {
6061
case 'select-option':
6162
if (metas.option?.label) {
@@ -71,14 +72,7 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
7172
}
7273

7374
console.log(tags)
74-
setTags(
75-
tags.map((tag) => {
76-
return {
77-
label: tag.label,
78-
value: tag.value,
79-
}
80-
})
81-
)
75+
setTags(tags as Tag[])
8276
}
8377

8478
const onlistingModeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
@@ -155,7 +149,7 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
155149
<div className="settingContent">
156150
<Select
157151
options={supportedTags}
158-
defaultValue={enhanceTags(userSelectedTags)}
152+
defaultValue={userSelectedTags}
159153
isMulti={true}
160154
isClearable={false}
161155
isSearchable={false}

src/stores/preferences.ts

Lines changed: 79 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,85 @@
1-
import create from 'zustand';
1+
import { enhanceTags } from 'src/utils/DataEnhancement'
2+
import create from 'zustand'
23
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+
47

58
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+
}
1317

1418
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+
}
4328

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+
)

src/types/index.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Tag } from "src/features/remoteConfig"
2+
13
export type SearchEngineType = {
24
url: string
35
label: string
@@ -14,7 +16,7 @@ export type SelectedTag = {
1416
}
1517

1618
export type UserPreferences = {
17-
userSelectedTags: string[]
19+
userSelectedTags: Tag[]
1820
theme: "light" | "dark",
1921
openLinksNewTab: boolean,
2022
listingMode: "normal" | "compact",
@@ -59,5 +61,11 @@ export type CardPropsType = {
5961
export type ArticleItemPropsType = {
6062
index: number
6163
item: ArticleType
62-
listingMode?: ListingMode
64+
listingMode?: ListingMode,
65+
selectedTag?: SelectedTag
66+
}
67+
68+
export type CardSettingsType = {
69+
language: string
70+
dateRange?: string
6371
}

src/utils/DataEnhancement.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ export const enhanceTags = (tags: string[]): Tag[] => {
99
}
1010

1111

12-
export const getCardTagsValue = (tags: string[], valuesField: TagValuesFieldType): string[] => {
13-
return enhanceTags(tags).reduce((acc: string[], curr) => {
12+
export const getCardTagsValue = (tags: Tag[], valuesField: TagValuesFieldType): string[] => {
13+
return tags.reduce((acc: string[], curr) => {
1414
if (!curr[valuesField] || curr[valuesField].length === 0) return acc
1515
acc = [...acc, ...curr[valuesField]]
1616
return acc

src/utils/StorageMigration.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
import AppStorage from 'src/services/localStorage'
2-
import { useUserPreferences } from "src/stores/preferences";
3-
import { useBookmarks } from "src/stores/bookmarks";
2+
import { useUserPreferences } from 'src/stores/preferences'
3+
import { useBookmarks } from 'src/stores/bookmarks'
4+
import { enhanceTags } from './DataEnhancement'
45

56
export const migrateToNewStorage = () => {
6-
let preferences = AppStorage.getItem("hackerTabPrefs")
7-
console.error("Here");
7+
let preferences = AppStorage.getItem('hackerTabPrefs')
8+
console.error('Here')
89
//userSelectedTags: supportedTags.filter((t) => t.value === 'javascript'),
910

10-
console.log("preferences", preferences)
11+
console.log('preferences', preferences)
1112
if (!preferences) {
12-
return;
13+
return
1314
}
1415

15-
const { userBookmarks, changelogMeta, ...parsedPreferences } = JSON.parse(preferences)
16+
let { userBookmarks, changelogMeta, ...parsedPreferences } = JSON.parse(preferences)
1617

1718
// Migrate Bookmarkds
1819
if (userBookmarks && !!userBookmarks.length) {
@@ -21,9 +22,13 @@ export const migrateToNewStorage = () => {
2122

2223
// Migrate preferences
2324
if (parsedPreferences) {
25+
parsedPreferences = {
26+
...parsedPreferences,
27+
userSelectedTags: enhanceTags(parsedPreferences.userSelectedTags),
28+
}
2429
useUserPreferences.getState().initState(parsedPreferences)
2530
}
2631

2732
// Remove old LocalStorage item
28-
AppStorage.removeItem("hackerTabPrefs");
29-
}
33+
AppStorage.removeItem('hackerTabPrefs')
34+
}

0 commit comments

Comments
 (0)