PluginProbe
Extendify / 1.6.1
Extendify v1.6.1
3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 0.5.0 0.6.0 0.7.0 All 126 releases
extendify / src / Library / state / User.js

User.js in Extendify 1.6.1, at src/Library/state/User.js

80 lines 2.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { useState, useEffect } from '@wordpress/element'
2 import { create } from 'zustand'
3 import { persist, createJSONStorage } from 'zustand/middleware'
4 import { User } from '@library/api/User'
5
6 const storage = {
7 getItem: async () => await User.getData(),
8 setItem: async (_name, value) => await User.setData(value),
9 removeItem: async () => await User.deleteData(),
10 }
11
12 const isGlobalLibraryEnabled = () =>
13 window.extendifyData.sitesettings === null ||
14 window.extendifyData?.sitesettings?.state?.enabled
15
16 const MAX_IMPORTS = 10
17 export const useUserStore = create(
18 persist(
19 (set, get) => ({
20 firstLoadedOn: new Date().toISOString(),
21 email: '',
22 apiKey: '',
23 uuid: '',
24 sdkPartner: '',
25 noticesDismissedAt: {},
26 modalNoticesDismissedAt: {},
27 imports: 0, // total imports over time
28 runningImports: 0, // timed imports, resets to 0 every month
29 entryPoint: 'not-set',
30 enabled: isGlobalLibraryEnabled(),
31 canInstallPlugins: false,
32 canActivatePlugins: false,
33 openOnNewPage: undefined, // This is only being used on the server
34 setOpenOnNewPage: (value) => set({ openOnNewPage: value }),
35 incrementImports: () => {
36 set((state) => ({
37 imports: Number(state.imports) + 1,
38 runningImports: Number(state.runningImports) + 1,
39 }))
40 },
41 hasAvailableImports: () => {
42 return get().apiKey
43 ? true
44 : Number(get().runningImports) < MAX_IMPORTS
45 },
46 remainingImports: () => {
47 const remaining = MAX_IMPORTS - Number(get().runningImports)
48 return remaining > 0 ? remaining : 0
49 },
50 // Will mark a modal or footer notice
51 markNoticeSeen: (key, type) => {
52 set({
53 [`${type}DismissedAt`]: {
54 ...get()[`${type}DismissedAt`],
55 [key]: new Date().toISOString(),
56 },
57 })
58 },
59 }),
60 {
61 name: 'extendify-user',
62 storage: createJSONStorage(() => storage),
63 },
64 ),
65 )
66
67 /* Hook useful for when you need to wait on the async state to hydrate */
68 export const useUserStoreReady = () => {
69 const [hydrated, setHydrated] = useState(useUserStore.persist.hasHydrated)
70 useEffect(() => {
71 const unsubFinishHydration = useUserStore.persist.onFinishHydration(
72 () => setHydrated(true),
73 )
74 return () => {
75 unsubFinishHydration()
76 }
77 }, [])
78 return hydrated
79 }
80