import { horFlexClasses } from '@freesewing/utils'
import { roles } from '@freesewing/config'
//Hooks
import React, { useEffect, useState } from 'react'
import { useAccount } from '@freesewing/react/hooks/useAccount'
import { useBackend } from '@freesewing/react/hooks/useBackend'
// Components
import { Link as DefaultLink } from '@freesewing/react/components/Link'
import { LockIcon, PlusIcon } from '@freesewing/react/components/Icon'
import { Spinner } from '@freesewing/react/components/Spinner'
import { H1, H2, H3 } from '@freesewing/react/components/Heading'
//import { ConsentForm, ns as gdprNs } from 'shared/components/gdpr/form.mjs'
const ConsentForm = () => null
const Wrap = ({ children }) => (
{children}
)
const ContactSupport = ({ Link = false }) => {
if (!Link) Link = DefaultLink
return (
Contact Support
)
}
const AuthRequired = ({ Link, banner }) => {
if (!Link) Link = DefaultLink
return (
{banner}
Authentication Required
This functionality requires a FreeSewing account
)
}
const AccountInactive = ({ Link, banner }) => {
if (!Link) Link = DefaultLink
return (
{banner}
Account Inactive
You must activate your account via the signup link we sent you.
If you cannot find the link, you can receive a new one by signing up again.
Sign Up
)
}
const AccountDisabled = ({ banner }) => (
{banner}
Acccount Disabled
You cannot re-enable a disabled account. You need to contact support to resolve this
situation.
)
const AccountProhibited = ({ banner }) => (
{banner}
Your account has been disabled
Your account has been administratively disabled.
)
const AccountStatusUnknown = ({ banner }) => (
{banner}
Account status warning
Your account status prohibits us from processing your data. Please contact support.
)
const RoleLacking = ({ t, requiredRole, role, banner }) => (
{banner}
You lack the required role to access this content
This content requires the {requiredRole} role. Your role is {role} which does
not grant you access to this content.
)
const ConsentLacking = ({ banner, refresh }) => {
const { setAccount, setToken, setSeenUser } = useAccount()
const backend = useBackend()
const updateConsent = async ({ consent1, consent2 }) => {
let consent = 0
if (consent1) consent = 1
if (consent1 && consent2) consent = 2
if (consent > 0) {
const result = await backend.updateConsent(consent)
if (result.success) {
setToken(result.data.token)
setAccount({ ...result.data.account, bestBefore: Date.now() + 3600000 })
setSeenUser(result.data.account.username)
refresh()
} else {
console.log('something went wrong', result)
refresh()
}
}
}
return (
{banner}
)
}
export const RoleBlock = ({ children, user = false, Link = false }) => {
if (!Link) Link = DefaultLink
let requiredRole = 'admin'
if (user) requiredRole = user
const { account, setAccount, token, admin, stopImpersonating, signOut } = useAccount()
const backend = useBackend()
const [ready, setReady] = useState(false)
const [impersonating, setImpersonating] = useState(false)
const [error, setError] = useState(false)
const [refreshCount, setRefreshCount] = useState(0)
/*
* Avoid hydration errors
*/
useEffect(() => {
if (admin?.account?.username && account?.username)
setImpersonating({
admin: admin.account.username,
user: account.username,
})
const verifyUser = async () => {
const [status, data] = await backend.ping()
if (status === 200 && data.result === 'success') {
// Refresh account in local storage
setAccount({
...account,
...data.account,
bestBefore: Date.now() + 3600000,
})
} else {
if (data?.error?.error) setError(data.error.error)
else {
signOut()
}
}
setReady(true)
}
if (token) {
// Don't hammer the backend. Check once per hour.
if (!account.bestBefore || account.bestBefore < Date.now()) verifyUser()
}
setReady(true)
}, [admin, refreshCount, signOut])
const refresh = () => {
setRefreshCount(refreshCount + 1)
setError(false)
}
if (!ready) return
const banner = impersonating ? (
Hi {impersonating.admin}, you are currently impersonating {impersonating.user}
) : null
const childProps = { banner }
if (!token || !account.username) return
if (error) {
if (error === 'accountInactive') return
if (error === 'accountDisabled') return
if (error === 'accountBlocked') return
if (error === 'consentLacking') return
return
}
if (!roles.levels[account.role] || roles.levels[account.role] < roles.levels[requiredRole]) {
return
}
return children
}
export const UserVisitorContent = ({ userContent = null, visitorContent = null }) => {
const { account, setAccount, token } = useAccount()
const backend = useBackend()
const [ready, setReady] = useState(false)
const [error, setError] = useState(false)
const [refreshCount, setRefreshCount] = useState(0)
/*
* Avoid hydration errors
*/
useEffect(() => {
const verifyUser = async () => {
const [status, data] = await backend.ping()
if (status === 200 && data.result === 'success') {
// Refresh account in local storage
setAccount({
...account,
...data.account,
bestBefore: Date.now() + 3600000,
})
} else {
if (data?.error?.error) setError(data.error.error)
}
setReady(true)
}
if (token) {
// Don't hammer the backend. Check once per hour.
if (!account.bestBefore || account.bestBefore < Date.now()) verifyUser()
}
setReady(true)
}, [refreshCount])
const refresh = () => {
setRefreshCount(refreshCount + 1)
setError(false)
}
if (!ready) return
return token && account.username ? userContent : visitorContent
}