1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-06-28 00:27:49 +02:00
market/src/providers/CookieConsent.tsx

139 lines
3.7 KiB
TypeScript
Raw Normal View History

GDPR Compliance (#796) * add cookie utils * add gdpr metadata for ppc * add graphql typeDefs for GDPR metadata * add ppc variable to app config * add ppc user preference * add switch component * add ppc components * add cookie consent provider * add consent provider to wrapRootElement * add ppc to app component * add cookie button to footer component * add ppc to site metadata query * add styles for buttons in footer * add switch component unit tests * renewed siteMetadata json for testing * add gdpr metadata for testing * add cookie module unit test * add cookie module tests * add customizable format to time component * add english privacy policy * add privacy policy slugs to user preferences and appConfig * add privacy policy components * add autolink for policy md navigation * only show language select for multiple policies * add gatsby policy page creation * use new privacy slug user preference * add to top button styling for markdown pages * add policies for de, es & fr * add pointer events to toTop buttons css * add privacy policy basic unit test * outsource scroll button component * import cleanup * add customizable delay for debounce * add scroll button unit tests * add disclaimer component * add disclaimer fields as optional fields in PublishJsonData * add acces type disclaimer * adjusted help for desc and author fields * add disclaimer unit tests * minor adjustment to test * add print button to history page * naming changes for better readability * add cookies hash to policies * ppc disabled per default * fix react unknown prop for disclaimer * minor adjustments to cookie utils * add gdpr example file * change exposed gdpr metadata scope by useConsent * update README * readme fixes * emoji fix * added imprint * adjustments to gdpr.json structure and related graphql type * add default values for ppc * Update app.config.js Fixed typo. * change variable name for consistency, remove console logs * readability * adjust css selector order to be consistent * Update fr.md updated policy * Update es.md updated policy * Update en.md updated policy * Update de.md * fix type issue * replace language select input with links * remove scroll button from codebase * change privacy policy route to /privacy * remove Do Not Track detection * add size to checkbox / radio inputs * replace switch component with checkbox inputs * fix plain text links * remove console log * refactor privacy policy pages to use PageMarkdown template * setup useUserPreferences mock for unit tests * unit tests forprivacy policy components * setup discalimer to use alert component * Apply .env suggestions from code review Co-authored-by: Jamie Hewitt <jamie.hewitt15@gmail.com> * move gdpr example to gdpr.json * adjustments to address .env approach for appConfig.privacyPreferenceCenter * update readme * add small styling option to ppc * update README * add ppc unit tests * update comments * Update README.md Co-authored-by: Jamie Hewitt <jamie.hewitt15@gmail.com> * Merge print into profile history * add inifiniteApproval to UserPreference fixture * changed default styling of PPC to small Co-authored-by: Frederic Schwill <41265505+fr-3deric@users.noreply.github.com> Co-authored-by: MeikeMolitor <88214332+MeikeMolitor@users.noreply.github.com> Co-authored-by: Jamie Hewitt <jamie.hewitt15@gmail.com>
2021-10-12 10:00:57 +02:00
import React, {
useContext,
useState,
createContext,
useEffect,
ReactNode,
ReactElement
} from 'react'
import { deleteCookie, getCookieValue, setCookie } from '../utils/cookies'
import { UseGdprMetadata, useGdprMetadata } from '../hooks/useGdprMetadata'
import { useSiteMetadata } from '../hooks/useSiteMetadata'
export enum CookieConsentStatus {
NOT_AVAILABLE = -1,
APPROVED = 0,
REJECTED = 1
}
export interface ConsentStatus {
[name: string]: CookieConsentStatus
}
interface ConsentProviderValue {
cookies: UseGdprMetadata['optionalCookies']
cookieConsentStatus: ConsentStatus
setConsentStatus: (cookieName: string, status: CookieConsentStatus) => void
resetConsentStatus: (status?: CookieConsentStatus) => void
}
const ConsentContext = createContext({} as ConsentProviderValue)
function ConsentProvider({ children }: { children: ReactNode }): ReactElement {
const cookies = useGdprMetadata()
const { privacyPreferenceCenter } = useSiteMetadata().appConfig
const [consentStatus, setConsentStatus] = useState({} as ConsentStatus)
function resetConsentStatus(status = CookieConsentStatus.NOT_AVAILABLE) {
const resetCookieConsent = {} as ConsentStatus
cookies.optionalCookies?.map((cookie) => {
deleteCookie(cookie.cookieName)
resetCookieConsent[cookie.cookieName] = status
})
setConsentStatus(resetCookieConsent)
}
function setCookieConsentStatus(
cookieName: string,
status: CookieConsentStatus
) {
setConsentStatus({ ...consentStatus, [cookieName]: status })
}
function handleAccept(cookieName: string) {
setCookie(cookieName, true)
switch (cookieName) {
case 'AnalyticsCookieConsent':
break
default:
break
// Add your specific logic here
// e.g.
/* function handleAnalytics() {
ReactGA.initialize(analyticsId)
ReactGA.pageview(window.location.pathname + window.location.search)
} */
}
}
function handleReject(cookieName: string) {
setCookie(cookieName, false)
switch (cookieName) {
case 'AnalyticsCookieConsent':
break
default:
break
// Add your specific logic here
}
}
useEffect(() => {
if (privacyPreferenceCenter !== 'true') return
const initialValues = {} as ConsentStatus
cookies.optionalCookies?.map((cookie) => {
const cookieValue = getCookieValue(cookie.cookieName)
switch (cookieValue) {
case 'true':
initialValues[cookie.cookieName] = CookieConsentStatus.APPROVED
break
case 'false':
initialValues[cookie.cookieName] = CookieConsentStatus.REJECTED
break
default:
initialValues[cookie.cookieName] = CookieConsentStatus.NOT_AVAILABLE
break
}
})
setConsentStatus(initialValues)
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
useEffect(() => {
Object.keys(consentStatus).map((cookieName) => {
switch (consentStatus[cookieName]) {
case CookieConsentStatus.APPROVED:
handleAccept(cookieName)
break
case CookieConsentStatus.REJECTED:
handleReject(cookieName)
break
}
})
}, [consentStatus])
return (
<ConsentContext.Provider
value={
{
cookies: cookies.optionalCookies || [],
cookieConsentStatus: consentStatus,
setConsentStatus: setCookieConsentStatus,
resetConsentStatus
} as ConsentProviderValue
}
>
{children}
</ConsentContext.Provider>
)
}
const useConsent = (): ConsentProviderValue => useContext(ConsentContext)
export { ConsentProvider, useConsent, ConsentProviderValue, ConsentContext }
export default ConsentProvider