PluginProbe
Extendify / 1.1.0
Extendify v1.1.0
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.1.0, at src/Library/state/User.js

97 lines 3.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import create from 'zustand'
2 import { persist } from 'zustand/middleware'
3 import { User } from '@library/api/User'
4
5 const storage = {
6 getItem: async () => await User.getData(),
7 setItem: async (_name, value) => await User.setData(value),
8 removeItem: async () => await User.deleteData(),
9 }
10
11 const isGlobalLibraryEnabled = () =>
12 window.extendifyData.sitesettings === null ||
13 window.extendifyData?.sitesettings?.state?.enabled
14
15 export const useUserStore = create(
16 persist(
17 (set, get) => ({
18 _hasHydrated: false,
19 firstLoadedOn: new Date().toISOString(),
20 email: '',
21 apiKey: '',
22 uuid: '',
23 sdkPartner: '',
24 noticesDismissedAt: {},
25 modalNoticesDismissedAt: {},
26 imports: 0, // total imports over time
27 runningImports: 0, // timed imports, resets to 0 every month
28 allowedImports: 0, // Max imports the Extendify service allows
29 freebieImports: 0, // Various free imports from actions (rewards)
30 entryPoint: 'not-set',
31 enabled: isGlobalLibraryEnabled(),
32 canInstallPlugins: false,
33 canActivatePlugins: false,
34 incrementImports: () => {
35 // If the user has freebie imports, use those first
36 const freebieImports =
37 Number(get().freebieImports) > 0
38 ? Number(get().freebieImports) - 1
39 : Number(get().freebieImports)
40 // If they don't, then increment the running imports
41 const runningImports =
42 Number(get().runningImports) + +(freebieImports < 1)
43 set({
44 imports: Number(get().imports) + 1,
45 runningImports,
46 freebieImports,
47 })
48 },
49 giveFreebieImports: (amount) => {
50 set({ freebieImports: get().freebieImports + amount })
51 },
52 totalAvailableImports: () => {
53 return (
54 Number(get().allowedImports) + Number(get().freebieImports)
55 )
56 },
57 hasAvailableImports: () => {
58 return get().apiKey
59 ? true
60 : Number(get().runningImports) <
61 Number(get().totalAvailableImports())
62 },
63 remainingImports: () => {
64 const remaining =
65 Number(get().totalAvailableImports()) -
66 Number(get().runningImports)
67 // If they have no allowed imports, this might be a first load
68 // where it's just fetching templates (and/or their max allowed)
69 if (!get().allowedImports) {
70 return null
71 }
72 return remaining > 0 ? remaining : 0
73 },
74 // Will mark a modal or footer notice
75 markNoticeSeen: (key, type) => {
76 set({
77 [`${type}DismissedAt`]: {
78 ...get()[`${type}DismissedAt`],
79 [key]: new Date().toISOString(),
80 },
81 })
82 },
83 }),
84 {
85 name: 'extendify-user',
86 getStorage: () => storage,
87 onRehydrateStorage: () => () => {
88 useUserStore.setState({ _hasHydrated: true })
89 },
90 partialize: (state) => {
91 delete state._hasHydrated
92 return state
93 },
94 },
95 ),
96 )
97