@kaspernj/api-maker 1.0.330 → 1.0.332

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  ]
17
17
  },
18
18
  "name": "@kaspernj/api-maker",
19
- "version": "1.0.330",
19
+ "version": "1.0.332",
20
20
  "type": "module",
21
21
  "description": "",
22
22
  "main": "index.js",
package/src/devise.mjs CHANGED
@@ -104,7 +104,19 @@ export default class ApiMakerDevise {
104
104
  return this.currents[scope]
105
105
  }
106
106
 
107
+ hasCurrentScope(scope) {
108
+ if (globalThis.apiMakerDeviseCurrent && scope in globalThis.apiMakerDeviseCurrent) {
109
+ return true
110
+ }
111
+
112
+ return false
113
+ }
114
+
107
115
  loadCurrentScope (scope) {
116
+ if (!this.hasCurrentScope(scope)) {
117
+ return null
118
+ }
119
+
108
120
  const scopeData = globalThis.apiMakerDeviseCurrent[scope]
109
121
 
110
122
  if (!scopeData) return null
@@ -1,10 +1,61 @@
1
- import {useCallback, useEffect, useState} from "react"
1
+ import {useCallback, useEffect, useMemo} from "react"
2
+ import {camelize} from "inflection"
2
3
  import Devise from "./devise.mjs"
4
+ import Services from "./services.mjs"
5
+ import useShape from "set-state-compare/src/use-shape.js"
6
+
7
+ const currentUserData = {}
8
+
9
+ const useCurrentUser = (args) => {
10
+ const s = useShape()
11
+ const scope = args?.scope || "user"
12
+ const scopeName = useMemo(() => `current${camelize(scope)}`, [scope])
13
+
14
+ s.meta.scope = scope
15
+ s.meta.scopeName = scopeName
16
+
17
+ const loadCurrentUserFromRequest = useCallback(async () => {
18
+ const {scope, scopeName} = s.m
19
+ const result = await Services.current().sendRequest("Devise::Current", {scope})
20
+ const current = digg(result, "current")
21
+
22
+ currentUserData[scope] = current
23
+
24
+ if (!(scopeName in s.setStates)) throw new Error(`'${scopeName}' not found in setStates`)
25
+
26
+ s.setStates[scopeName](current)
27
+ }, [])
28
+
29
+ const defaultCurrentUser = useCallback(() => {
30
+ const {scope, scopeName} = s.m
31
+
32
+ if (scope in currentUserData) {
33
+ return currentUserData[scope]
34
+ } else if (Devise.current().hasCurrentScope(scope)) {
35
+ currentUserData[scope] = Devise[scopeName]()
36
+
37
+ return currentUserData[scope]
38
+ }
39
+ }, [])
40
+
41
+ const useStatesArgument = {}
42
+
43
+ useStatesArgument[scopeName] = defaultCurrentUser()
44
+
45
+ s.useStates(useStatesArgument)
3
46
 
4
- const useCurrentUser = () => {
5
- const [currentUser, setCurrentUser] = useState(Devise.currentUser())
6
47
  const updateCurrentUser = useCallback(() => {
7
- setCurrentUser(Devise.currentUser())
48
+ const setStatesArgument = {}
49
+
50
+ setStatesArgument[s.m.scopeName] = Devise[s.m.scopeName]()
51
+
52
+ s.set(setStatesArgument)
53
+ }, [])
54
+
55
+ useEffect(() => {
56
+ if (!(s.m.scope in currentUserData)) {
57
+ loadCurrentUserFromRequest()
58
+ }
8
59
  }, [])
9
60
 
10
61
  useEffect(() => {
@@ -13,7 +64,7 @@ const useCurrentUser = () => {
13
64
  return () => {
14
65
  Devise.events().removeListener("onDeviseSignIn", updateCurrentUser)
15
66
  }
16
- })
67
+ }, [])
17
68
 
18
69
  useEffect(() => {
19
70
  Devise.events().addListener("onDeviseSignOut", updateCurrentUser)
@@ -21,9 +72,9 @@ const useCurrentUser = () => {
21
72
  return () => {
22
73
  Devise.events().removeListener("onDeviseSignOut", updateCurrentUser)
23
74
  }
24
- })
75
+ }, [])
25
76
 
26
- return currentUser
77
+ return s.s[scopeName]
27
78
  }
28
79
 
29
80
  export default useCurrentUser