Skip to content

Commit 0b70cd1

Browse files
committed
add the new user preferences store
1 parent f213520 commit 0b70cd1

5 files changed

Lines changed: 102 additions & 18 deletions

File tree

src/components/CardComponent.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import React, { useContext } from 'react'
1+
import React from 'react'
22
import { BsBoxArrowInUpRight } from 'react-icons/bs'
33
import { APP } from '../Constants'
4-
import PreferencesContext from '../preferences/PreferencesContext'
4+
import { useUserPreferences } from 'src/stores/preferences'
55

66
function CardComponent({ icon, title, children, fullBlock, link }) {
7-
const { openLinksNewTab } = useContext(PreferencesContext)
7+
const { openLinksNewTab } = useUserPreferences()
88

99
const handleHeaderLinkClick = (e) => {
1010
e.preventDefault()

src/components/ClickableItem.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { trackLinkOpen } from 'src/lib/analytics'
2-
import React, { useContext } from 'react'
2+
import React from 'react'
33
import { APP } from '../Constants'
4-
import PreferencesContext from '../preferences/PreferencesContext'
4+
5+
import { useUserPreferences } from 'src/stores/preferences'
56

67
const ClickableItem = ({ link, className, children, analyticsAttributes, appendRef = true }) => {
7-
const { openLinksNewTab } = useContext(PreferencesContext)
8+
const { openLinksNewTab } = useUserPreferences()
89

910
const handleClick = (e) => {
1011
e.preventDefault()

src/features/settings/components/SettingsModal.tsx

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import React, { useContext, useState } from 'react'
1+
import React, { useState } from 'react'
22
import ReactModal from 'react-modal'
33
import 'react-toggle/style.css'
44
import { VscClose } from 'react-icons/vsc'
55
import Select, { ActionMeta, MultiValue, SingleValue } from 'react-select'
66
import { SearchEngineType } from 'src/types'
77
import Toggle from 'react-toggle'
88
import './settings.css'
9-
import PreferencesContext from 'src/preferences/PreferencesContext'
9+
import { useUserPreferences } from 'src/stores/preferences'
1010
import { SUPPORTED_CARDS, SUPPORTED_SEARCH_ENGINES, APP } from 'src/Constants'
1111
import {
1212
trackLanguageAdd,
@@ -34,9 +34,20 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
3434
remoteConfig: { supportedTags },
3535
} = useRemoteConfigStore()
3636

37-
const preferences = useContext(PreferencesContext)
38-
const { dispatcher, cards, userSelectedTags, openLinksNewTab, listingMode, theme, searchEngine } =
39-
preferences
37+
const {
38+
cards,
39+
userSelectedTags,
40+
openLinksNewTab,
41+
listingMode,
42+
theme,
43+
searchEngine,
44+
setTheme,
45+
setListingMode,
46+
setSearchEngine,
47+
setOpenLinksNewTab,
48+
setCards,
49+
setTags,
50+
} = useUserPreferences()
4051
const [selectedCards, setSelectedCards] = useState(cards)
4152

4253
const handleCloseModal = () => {
@@ -58,13 +69,21 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
5869
break
5970
}
6071

61-
dispatcher({ type: 'setUserSelectedTags', value: tags })
72+
console.log(tags)
73+
setTags(
74+
tags.map((tag) => {
75+
return {
76+
label: tag.label,
77+
value: tag.value,
78+
}
79+
})
80+
)
6281
}
6382

6483
const onlistingModeChange = (e: React.ChangeEvent<HTMLInputElement>) => {
6584
const value = e.target.checked ? 'compact' : 'normal'
6685
trackListingModeSelect(value)
67-
dispatcher({ type: 'changelistingMode', value })
86+
setListingMode(value)
6887
}
6988

7089
const onCardSelectChange = (cards: MultiValue<OptionType>, metas: ActionMeta<OptionType>) => {
@@ -85,7 +104,7 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
85104
return { id: index, name: c.value }
86105
})
87106
setSelectedCards(newCards)
88-
dispatcher({ type: 'setCards', value: newCards })
107+
setCards(newCards)
89108
}
90109

91110
const onSearchEngineSelectChange = (value: SingleValue<SearchEngineType>) => {
@@ -94,17 +113,21 @@ export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalPr
94113
}
95114

96115
trackSearchEngineSelect(value.label)
97-
dispatcher({ type: 'setSearchEngine', value })
116+
setSearchEngine(value.label)
98117
}
99118

100119
const onOpenLinksNewTabChange = (e: React.ChangeEvent<HTMLInputElement>) => {
101120
const checked = e.target.checked
102121
trackTabTarget(checked)
103-
dispatcher({ type: 'setOpenLinksNewTab', value: checked })
122+
setOpenLinksNewTab(checked)
104123
}
105124

106125
const onDarkModeChange = () => {
107-
dispatcher({ type: 'toggleTheme' })
126+
if (theme === 'dark') {
127+
setTheme('light')
128+
} else {
129+
setTheme('dark')
130+
}
108131
}
109132

110133
return (

src/stores/preferences.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import create from 'zustand';
2+
import { persist } from 'zustand/middleware'
3+
import { SelectedCard, SelectedTag, Theme, ListingMode } from "../types";
4+
5+
type UserPreferencesStore = {
6+
userSelectedTags: SelectedTag[]
7+
userBookmarks: any[]
8+
theme: Theme,
9+
openLinksNewTab: boolean,
10+
listingMode: ListingMode,
11+
searchEngine: string,
12+
cards: SelectedCard[],
13+
setTheme: (theme: Theme) => void;
14+
setSearchEngine: (theme: string) => void;
15+
setOpenLinksNewTab: (openLinksNewTab: boolean) => void;
16+
setListingMode: (listingMode: ListingMode) => void;
17+
setCards: (selectedCards: SelectedCard[]) => void;
18+
setTags: (selectedTags: SelectedTag[]) => void;
19+
};
20+
21+
export const useUserPreferences = create(persist<UserPreferencesStore>((set) => ({
22+
userSelectedTags: [],
23+
userBookmarks: [],
24+
theme: "dark",
25+
searchEngine: "google",
26+
listingMode: "normal",
27+
openLinksNewTab: true,
28+
cards: [],
29+
setSearchEngine: (searchEngine: string) => set({ searchEngine: searchEngine }),
30+
setListingMode: (listingMode: ListingMode) => set({ listingMode: listingMode }),
31+
setTheme: (theme: Theme) => set({ theme: theme }),
32+
setOpenLinksNewTab: (openLinksNewTab: boolean) => set({ openLinksNewTab: openLinksNewTab }),
33+
setCards: (selectedCards: SelectedCard[]) => set({ cards: selectedCards }),
34+
setTags: (selectedTags: SelectedTag[]) => set({ userSelectedTags: selectedTags }),
35+
}), {
36+
name: 'preferences_storage',
37+
}));

src/types/index.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,27 @@
11
export type SearchEngineType = {
22
url: string
33
label: string
4-
}
4+
}
5+
6+
export type SelectedCard = {
7+
id: number,
8+
name: string
9+
}
10+
11+
export type SelectedTag = {
12+
label: string,
13+
value: string
14+
}
15+
16+
export type UserPreferences = {
17+
userSelectedTags: string[]
18+
userBookmarks: any[]
19+
theme: "light" | "dark",
20+
openLinksNewTab: boolean,
21+
listingMode: "normal" | "compact",
22+
searchEngine: string,
23+
cards: SelectedCard[]
24+
}
25+
26+
export type Theme = "dark" | "light";
27+
export type ListingMode = "normal" | "compact";

0 commit comments

Comments
 (0)