Skip to content

Commit d691ced

Browse files
committed
migrate configuration context to zustand
1 parent b302c87 commit d691ced

8 files changed

Lines changed: 58 additions & 32 deletions

File tree

src/App.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import React, { useState, useEffect, useContext } from 'react'
22
import './App.css'
3-
import ConfigurationContext from './configuration/ConfigurationContext'
43
import Footer from './components/Footer'
54
import Header from './components/Header'
65
import BookmarksSidebar from './bookmark/BookmarksSidebar'
@@ -10,12 +9,15 @@ import AppContentLayout from './components/AppContentLayout'
109
import 'react-contexify/dist/ReactContexify.css'
1110
import PreferencesContext from './preferences/PreferencesContext'
1211
import { setupAnalytics, trackPageView, setupIdentification } from 'src/lib/analytics'
12+
import { useRemoteConfigStore } from 'src/features/remoteConfig'
1313

1414
function App() {
15-
const { marketingBannerConfig = {} } = useContext(ConfigurationContext)
1615
const [showSideBar, setShowSideBar] = useState(false)
1716
const [showSettings, setShowSettings] = useState(false)
1817
const { dispatcher, ...state } = useContext(PreferencesContext)
18+
const {
19+
remoteConfig: { marketingBannerConfig },
20+
} = useRemoteConfigStore()
1921

2022
useEffect(() => {
2123
setupAnalytics()

src/configuration/AppWrapper.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1-
import React, { useReducer, useContext } from 'react'
1+
import React, { useReducer } from 'react'
22
import { LS_PREFERENCES_KEY } from 'src/Constants'
33
import AppStorage from '../services/localStorage'
44
import { PreferencesProvider } from '../preferences/PreferencesContext'
55
import { getOSMode } from '../services/os'
66
import AppReducer from '../preferences/AppReducer'
7-
import ConfigurationContext from './ConfigurationContext'
7+
import { useRemoteConfigStore } from 'src/features/remoteConfig'
88

99
export default function AppWrapper({ children }) {
10-
const configuration = useContext(ConfigurationContext)
10+
const {
11+
remoteConfig: { supportedTags },
12+
} = useRemoteConfigStore()
1113

1214
const [state, dispatcher] = useReducer(
1315
AppReducer,
1416
{
15-
userSelectedTags: configuration.supportedTags.filter((t) => t.value === 'javascript'),
17+
userSelectedTags: supportedTags.filter((t) => t.value === 'javascript'),
1618
userBookmarks: [],
1719
theme: getOSMode(),
1820
openLinksNewTab: true,
@@ -31,10 +33,10 @@ export default function AppWrapper({ children }) {
3133
preferences = JSON.parse(preferences)
3234
preferences = {
3335
...preferences,
34-
userSelectedTags: configuration.supportedTags.filter((tag) =>
36+
userSelectedTags: supportedTags.filter((tag) =>
3537
preferences.userSelectedTags.includes(tag.value)
3638
),
37-
cards: preferences.cards.filter((card) => card.name != 'stackoverflow'),
39+
cards: preferences.cards.filter((card) => card.name !== 'stackoverflow'),
3840
}
3941
return {
4042
...initialState,

src/configuration/ConfigurationContext.js

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/features/remoteConfig/api/getRemoteConfig.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query';
22
import { ExtractFnReturnType, QueryConfig } from 'src/lib/react-query';
33
import { RemoteConfig } from "../types";
44
import { axios } from 'src/lib/axios';
5+
import { useRemoteConfigStore } from "../stores/remoteConfig";
56

67
const getAd = async (): Promise<RemoteConfig> => {
78
return axios.get('/data/remoteConfiguration.json');
@@ -14,6 +15,9 @@ type UseGetAdOptions = {
1415
};
1516
export const useGetRemoteConfig = ({ config }: UseGetAdOptions = {}) => {
1617
return useQuery<ExtractFnReturnType<QueryFnType>>({
18+
onSuccess(remoteConfig) {
19+
useRemoteConfigStore.getState().setRemoteConfig(remoteConfig);
20+
},
1721
...config,
1822
queryKey: ['remote-config'],
1923
queryFn: () => getAd(),

src/features/remoteConfig/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './providers/ConfigurationWrapper';
2-
export * from './types';
2+
export * from './types';
3+
export * from './stores/remoteConfig';
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import create from 'zustand';
2+
import { persist } from 'zustand/middleware'
3+
import { RemoteConfig } from "../types";
4+
5+
type ChangelogVersionStore = {
6+
remoteConfig: RemoteConfig;
7+
setRemoteConfig: (remoteConfig: RemoteConfig) => void;
8+
};
9+
10+
export const useRemoteConfigStore = create(persist<ChangelogVersionStore>((set) => ({
11+
remoteConfig: {
12+
marketingBannerConfig: undefined,
13+
supportedTags: [
14+
{
15+
value: 'javascript',
16+
label: 'Javascript',
17+
githubValues: ['javascript'],
18+
confsValues: ['javascript'],
19+
devtoValues: ['javascript'],
20+
hashnodeValues: ['javascript'],
21+
mediumValues: ['javascript'],
22+
redditValues: ['javascript'],
23+
freecodecampValues: ['javascript']
24+
},
25+
],
26+
},
27+
setRemoteConfig: (remoteConfig: RemoteConfig) =>
28+
set(() => ({
29+
remoteConfig: remoteConfig,
30+
}))
31+
}), {
32+
name: 'remote_config_storage',
33+
}));

src/features/remoteConfig/types/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ export type Tag = {
33
devtoValues: string[],
44
hashnodeValues: string[],
55
redditValues: string[],
6+
githubValues: string[],
67
freecodecampValues: string[],
78
mediumValues: string[],
89
label: string,
@@ -17,5 +18,5 @@ export type MarketingBannerConfig = {
1718

1819
export type RemoteConfig = {
1920
supportedTags: Tag[],
20-
marketingBannerConfig: MarketingBannerConfig
21+
marketingBannerConfig?: MarketingBannerConfig
2122
}

src/features/settings/components/SettingsModal.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { SearchEngineType } from 'src/types'
77
import Toggle from 'react-toggle'
88
import './settings.css'
99
import PreferencesContext from 'src/preferences/PreferencesContext'
10-
import ConfigurationContext from 'src/configuration/ConfigurationContext'
1110
import { SUPPORTED_CARDS, SUPPORTED_SEARCH_ENGINES, APP } from 'src/Constants'
1211
import {
1312
trackLanguageAdd,
@@ -18,6 +17,7 @@ import {
1817
trackListingModeSelect,
1918
trackTabTarget,
2019
} from 'src/lib/analytics'
20+
import { useRemoteConfigStore } from 'src/features/remoteConfig'
2121

2222
type SettingsModalProps = {
2323
showSettings: boolean
@@ -30,7 +30,10 @@ type OptionType = {
3030
}
3131

3232
export const SettingsModal = ({ showSettings, setShowSettings }: SettingsModalProps) => {
33-
const { supportedTags } = useContext(ConfigurationContext)
33+
const {
34+
remoteConfig: { supportedTags },
35+
} = useRemoteConfigStore()
36+
3437
const preferences = useContext(PreferencesContext)
3538
const { dispatcher, cards, userSelectedTags, openLinksNewTab, listingMode, theme, searchEngine } =
3639
preferences

0 commit comments

Comments
 (0)