PluginProbe
Extendify / 0.9.3
Extendify v0.9.3
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 0.9.3, at src/Library/state/User.js

135 lines 5.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { sample } from 'lodash'
2 import create from 'zustand'
3 import { persist } 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 // Keep track of active tests as some might be active
17 // but never rendered.
18 const activeTests = {
19 ['main-button-text2']: '0007',
20 }
21
22 export const useUserStore = create(
23 persist(
24 (set, get) => ({
25 _hasHydrated: false,
26 firstLoadedOn: new Date().toISOString(),
27 email: '',
28 apiKey: '',
29 uuid: '',
30 sdkPartner: '',
31 noticesDismissedAt: {},
32 modalNoticesDismissedAt: {},
33 imports: 0, // total imports over time
34 runningImports: 0, // timed imports, resets to 0 every month
35 allowedImports: 0, // Max imports the Extendify service allows
36 freebieImports: 0, // Various free imports from actions (rewards)
37 entryPoint: 'not-set',
38 enabled: isGlobalLibraryEnabled(),
39 canInstallPlugins: false,
40 canActivatePlugins: false,
41 participatingTestsGroups: {},
42 incrementImports: () => {
43 // If the user has freebie imports, use those first
44 const freebieImports =
45 Number(get().freebieImports) > 0
46 ? Number(get().freebieImports) - 1
47 : Number(get().freebieImports)
48 // If they don't, then increment the running imports
49 const runningImports =
50 Number(get().runningImports) + +(freebieImports < 1)
51 set({
52 imports: Number(get().imports) + 1,
53 runningImports,
54 freebieImports,
55 })
56 },
57 giveFreebieImports: (amount) => {
58 set({ freebieImports: get().freebieImports + amount })
59 },
60 totalAvailableImports: () => {
61 return (
62 Number(get().allowedImports) + Number(get().freebieImports)
63 )
64 },
65 testGroup(testKey, groupOptions) {
66 if (!Object.keys(activeTests).includes(testKey)) return
67 let groups = get().participatingTestsGroups
68 // If the test is already in the group, don't add it again
69 if (!groups[testKey]) {
70 set({
71 participatingTestsGroups: Object.assign({}, groups, {
72 [testKey]: sample(groupOptions),
73 }),
74 })
75 }
76 groups = get().participatingTestsGroups
77 return groups[testKey]
78 },
79 activeTestGroups() {
80 return Object.entries(get().participatingTestsGroups)
81 .filter(([key]) => Object.keys(activeTests).includes(key))
82 .reduce((obj, [key, value]) => {
83 obj[key] = value
84 return obj
85 }, {})
86 },
87 activeTestGroupsUtmValue() {
88 const active = Object.entries(get().activeTestGroups())
89 .map(([key, value]) => {
90 return `${activeTests[key]}=${value}`
91 }, '')
92 .join(':')
93 return encodeURIComponent(active)
94 },
95 hasAvailableImports: () => {
96 return get().apiKey
97 ? true
98 : Number(get().runningImports) <
99 Number(get().totalAvailableImports())
100 },
101 remainingImports: () => {
102 const remaining =
103 Number(get().totalAvailableImports()) -
104 Number(get().runningImports)
105 // If they have no allowed imports, this might be a first load
106 // where it's just fetching templates (and/or their max allowed)
107 if (!get().allowedImports) {
108 return null
109 }
110 return remaining > 0 ? remaining : 0
111 },
112 // Will mark a modal or footer notice
113 markNoticeSeen: (key, type) => {
114 set({
115 [`${type}DismissedAt`]: {
116 ...get()[`${type}DismissedAt`],
117 [key]: new Date().toISOString(),
118 },
119 })
120 },
121 }),
122 {
123 name: 'extendify-user',
124 getStorage: () => storage,
125 onRehydrateStorage: () => () => {
126 useUserStore.setState({ _hasHydrated: true })
127 },
128 partialize: (state) => {
129 delete state._hasHydrated
130 return state
131 },
132 },
133 ),
134 )
135