1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-06-15 17:03:30 +02:00
market/src/@context/UserPreferences.tsx
mihaisc 6dfeead4fd
Release (#1492)
* update contracts

* add version selector

* show banner on all pages

* show banner on all pages

* Announcement/warning messages cleanup

* new main announcement message
* contextual compute-to-data warnings in publish form & asset action

* copy update

* change hardcoded URLs

* change localStorage key

* to prevent user preferences clashes when switching between v3 & v4

* footer stats note changes

* move copy into content file
* mention external markets

* footer stats note copy changes

* modified pool widget footer

* take out pool reserve display
* style & spacing updates for fees

Co-authored-by: Matthias Kretschmann <m@kretschmann.io>
2022-06-08 11:46:46 +03:00

169 lines
4.2 KiB
TypeScript

import React, {
createContext,
useContext,
ReactElement,
ReactNode,
useState,
useEffect
} from 'react'
import { LoggerInstance, LogLevel } from '@oceanprotocol/lib'
import { isBrowser } from '@utils/index'
import { useMarketMetadata } from './MarketMetadata'
interface UserPreferencesValue {
debug: boolean
setDebug: (value: boolean) => void
currency: string
setCurrency: (value: string) => void
chainIds: number[]
privacyPolicySlug: string
showPPC: boolean
setChainIds: (chainIds: number[]) => void
bookmarks: string[]
addBookmark: (did: string) => void
removeBookmark: (did: string) => void
setPrivacyPolicySlug: (slug: string) => void
setShowPPC: (value: boolean) => void
infiniteApproval: boolean
setInfiniteApproval: (value: boolean) => void
locale: string
}
const UserPreferencesContext = createContext(null)
const localStorageKey = 'ocean-user-preferences-v4'
function getLocalStorage(): UserPreferencesValue {
const storageParsed =
isBrowser && JSON.parse(window.localStorage.getItem(localStorageKey))
return storageParsed
}
function setLocalStorage(values: Partial<UserPreferencesValue>) {
return (
isBrowser &&
window.localStorage.setItem(localStorageKey, JSON.stringify(values))
)
}
function UserPreferencesProvider({
children
}: {
children: ReactNode
}): ReactElement {
const { appConfig } = useMarketMetadata()
const localStorage = getLocalStorage()
// Set default values from localStorage
const [debug, setDebug] = useState<boolean>(localStorage?.debug || false)
const [currency, setCurrency] = useState<string>(
localStorage?.currency || 'EUR'
)
const [locale, setLocale] = useState<string>()
const [bookmarks, setBookmarks] = useState(localStorage?.bookmarks || [])
const [chainIds, setChainIds] = useState(
localStorage?.chainIds || appConfig.chainIds
)
const { defaultPrivacyPolicySlug } = appConfig
const [privacyPolicySlug, setPrivacyPolicySlug] = useState<string>(
localStorage?.privacyPolicySlug || defaultPrivacyPolicySlug
)
const [showPPC, setShowPPC] = useState<boolean>(
localStorage?.showPPC !== false
)
const [infiniteApproval, setInfiniteApproval] = useState(
localStorage?.infiniteApproval || false
)
// Write values to localStorage on change
useEffect(() => {
setLocalStorage({
chainIds,
debug,
currency,
bookmarks,
privacyPolicySlug,
showPPC,
infiniteApproval
})
}, [
chainIds,
debug,
currency,
bookmarks,
privacyPolicySlug,
showPPC,
infiniteApproval
])
// Set ocean.js log levels, default: Error
useEffect(() => {
debug === true
? LoggerInstance.setLevel(LogLevel.Verbose)
: LoggerInstance.setLevel(LogLevel.Error)
}, [debug])
// Get locale always from user's browser
useEffect(() => {
if (!window) return
setLocale(window.navigator.language)
}, [])
function addBookmark(didToAdd: string): void {
const newPinned = [...bookmarks, didToAdd]
setBookmarks(newPinned)
}
function removeBookmark(didToAdd: string): void {
const newPinned = bookmarks.filter((did: string) => did !== didToAdd)
setBookmarks(newPinned)
}
// Bookmarks old data structure migration
useEffect(() => {
if (bookmarks.length !== undefined) return
const newPinned: string[] = []
for (const network in bookmarks) {
;(bookmarks[network] as unknown as string[]).forEach((did: string) => {
did !== null && newPinned.push(did)
})
}
setBookmarks(newPinned)
}, [bookmarks])
return (
<UserPreferencesContext.Provider
value={
{
debug,
currency,
locale,
chainIds,
bookmarks,
privacyPolicySlug,
showPPC,
infiniteApproval,
setInfiniteApproval,
setChainIds,
setDebug,
setCurrency,
addBookmark,
removeBookmark,
setPrivacyPolicySlug,
setShowPPC
} as UserPreferencesValue
}
>
{children}
</UserPreferencesContext.Provider>
)
}
// Helper hook to access the provider values
const useUserPreferences = (): UserPreferencesValue =>
useContext(UserPreferencesContext)
export { UserPreferencesProvider, useUserPreferences }