/home/smartbloks/.trash/extendify/src/Library/state/User.js
import { useState, useEffect } from '@wordpress/element'
import { create } from 'zustand'
import { persist, createJSONStorage } from 'zustand/middleware'
import { User } from '@library/api/User'
const storage = {
getItem: async () => await User.getData(),
setItem: async (_name, value) => await User.setData(value),
removeItem: async () => await User.deleteData(),
}
const isGlobalLibraryEnabled = () =>
window.extendifyData.sitesettings === null ||
window.extendifyData?.sitesettings?.state?.enabled
const MAX_IMPORTS = 10
export const useUserStore = create(
persist(
(set, get) => ({
firstLoadedOn: new Date().toISOString(),
email: '',
apiKey: '',
uuid: '',
sdkPartner: '',
noticesDismissedAt: {},
modalNoticesDismissedAt: {},
imports: 0, // total imports over time
runningImports: 0, // timed imports, resets to 0 every month
entryPoint: 'not-set',
enabled: isGlobalLibraryEnabled(),
canInstallPlugins: false,
canActivatePlugins: false,
openOnNewPage: undefined, // This is only being used on the server
setOpenOnNewPage: (value) => set({ openOnNewPage: value }),
incrementImports: () => {
set((state) => ({
imports: Number(state.imports) + 1,
runningImports: Number(state.runningImports) + 1,
}))
},
hasAvailableImports: () => {
return get().apiKey
? true
: Number(get().runningImports) < MAX_IMPORTS
},
remainingImports: () => {
const remaining = MAX_IMPORTS - Number(get().runningImports)
return remaining > 0 ? remaining : 0
},
// Will mark a modal or footer notice
markNoticeSeen: (key, type) => {
set({
[`${type}DismissedAt`]: {
...get()[`${type}DismissedAt`],
[key]: new Date().toISOString(),
},
})
},
}),
{
name: 'extendify-user',
storage: createJSONStorage(() => storage),
},
),
)
/* Hook useful for when you need to wait on the async state to hydrate */
export const useUserStoreReady = () => {
const [hydrated, setHydrated] = useState(useUserStore.persist.hasHydrated)
useEffect(() => {
const unsubFinishHydration = useUserStore.persist.onFinishHydration(
() => setHydrated(true),
)
return () => {
unsubFinishHydration()
}
}, [])
return hydrated
}