%PDF- %PDF-
| Direktori : /var/www/projetos/takthua.com.br/wp-content/plugins/ml-slider/extendify-sdk/src/state/ |
| Current File : //var/www/projetos/takthua.com.br/wp-content/plugins/ml-slider/extendify-sdk/src/state/User.js |
import { sample } from 'lodash'
import create from 'zustand'
import { persist } from 'zustand/middleware'
import { User } from '@extendify/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
// Keep track of active tests as some might be active
// but never rendered.
const activeTests = {
['notice-position']: '0001',
['main-button-text']: '0002',
['default-or-alt-sitetype']: '0004',
['import-counter-type']: '0005',
['sitetype-open-closed']: '0006',
}
export const useUserStore = create(
persist(
(set, get) => ({
_hasHydrated: false,
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
allowedImports: 0, // Max imports the Extendify service allows
freebieImports: 0, // Various free imports from actions (rewards)
entryPoint: 'not-set',
enabled: isGlobalLibraryEnabled(),
canInstallPlugins: false,
canActivatePlugins: false,
participatingTestsGroups: {},
preferredOptions: {
taxonomies: {},
type: '',
search: '',
},
incrementImports: () => {
// If the user has freebie imports, use those first
const freebieImports =
Number(get().freebieImports) > 0
? Number(get().freebieImports) - 1
: Number(get().freebieImports)
// If they don't, then increment the running imports
const runningImports =
Number(get().runningImports) + +(freebieImports < 1)
set({
imports: Number(get().imports) + 1,
runningImports,
freebieImports,
})
},
giveFreebieImports: (amount) => {
set({ freebieImports: get().freebieImports + amount })
},
totalAvailableImports: () => {
return (
Number(get().allowedImports) + Number(get().freebieImports)
)
},
testGroup(testKey, groupOptions) {
if (!Object.keys(activeTests).includes(testKey)) return
let groups = get().participatingTestsGroups
// If the test is already in the group, don't add it again
if (!groups[testKey]) {
set({
participatingTestsGroups: Object.assign({}, groups, {
[testKey]: sample(groupOptions),
}),
})
}
groups = get().participatingTestsGroups
return groups[testKey]
},
activeTestGroups() {
return Object.entries(get().participatingTestsGroups)
.filter(([key]) => Object.keys(activeTests).includes(key))
.reduce((obj, [key, value]) => {
obj[key] = value
return obj
}, {})
},
activeTestGroupsUtmValue() {
const active = Object.entries(get().activeTestGroups())
.map(([key, value]) => {
return `${activeTests[key]}=${value}`
}, '')
.join(':')
return encodeURIComponent(active)
},
hasAvailableImports: () => {
return get().apiKey
? true
: Number(get().runningImports) <
Number(get().totalAvailableImports())
},
remainingImports: () => {
const remaining =
Number(get().totalAvailableImports()) -
Number(get().runningImports)
// If they have no allowed imports, this might be a first load
// where it's just fetching templates (and/or their max alllowed)
if (!get().allowedImports) {
return null
}
return remaining > 0 ? remaining : 0
},
updatePreferredSiteType: (value) => {
get().updatePreferredOption('siteType', value)
},
updatePreferredOption: (option, value) => {
// If the option doesn't exist, assume it's a taxonomy
if (
!Object.prototype.hasOwnProperty.call(
get().preferredOptions,
option,
)
) {
value = Object.assign(
{},
get().preferredOptions?.taxonomies ?? {},
{ [option]: value },
)
option = 'taxonomies'
}
set({
preferredOptions: {
...Object.assign({}, get().preferredOptions, {
[option]: value,
}),
},
})
},
// Will mark a modal or footer notice
markNoticeSeen: (key, type) => {
set({
[`${type}DismissedAt`]: {
...get()[`${type}DismissedAt`],
[key]: new Date().toISOString(),
},
})
},
}),
{
name: 'extendify-user',
getStorage: () => storage,
onRehydrateStorage: () => () => {
useUserStore.setState({ _hasHydrated: true })
},
partialize: (state) => {
delete state._hasHydrated
return state
},
},
),
)