miolo-react 3.0.0-beta.23 → 3.0.0-beta.230
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 +16 -23
- package/src/AppBrowser.jsx +3 -8
- package/src/AppServer.jsx +3 -13
- package/src/context/MioloContext.mjs +2 -2
- package/src/context/MioloContextProvider.jsx +80 -46
- package/src/context/useMioloContext.jsx +2 -2
- package/src/context/withMioloContext.jsx +4 -9
- package/src/index.mjs +5 -6
- package/src/ssr/getSsrDataFromContext.mjs +14 -15
- package/src/ssr/patchHistory.mjs +25 -0
- package/src/ssr/useIndexedDb.mjs +58 -0
- package/src/ssr/useOnWindowFocus.mjs +33 -0
- package/src/ssr/usePropsCheck.mjs +69 -0
- package/src/ssr/useSsrDataOrReload.mjs +388 -31
- package/dist/miolo-react.mjs +0 -265
- package/dist/miolo-react.mjs.map +0 -1
- package/dist/miolo-react.umd.js +0 -378
- package/dist/miolo-react.umd.js.map +0 -1
|
@@ -1,43 +1,400 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import getSsrDataFromContext from
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react"
|
|
2
|
+
import getSsrDataFromContext from "./getSsrDataFromContext.mjs"
|
|
3
|
+
import patchHistory from "./patchHistory.mjs"
|
|
4
|
+
import useIndexedDb from "./useIndexedDb.mjs"
|
|
5
|
+
import useOnWindowFocus from "./useOnWindowFocus.mjs"
|
|
6
|
+
import usePropsCheck from "./usePropsCheck.mjs"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {import('miolo-model').MioloModel} MioloModel
|
|
10
|
+
* @typedef {import('miolo-model').MioloArray} MioloArray
|
|
11
|
+
*
|
|
12
|
+
*
|
|
13
|
+
*
|
|
14
|
+
* @typedef {Object} MioloSSRDataOptions
|
|
15
|
+
* @property {any} [defval] - The default value for the data.
|
|
16
|
+
* @property {Function} [loader] - A function that loads the data remotely. You need either {@link loader} or {@link url}.
|
|
17
|
+
* @property {string} [url] - The URL to load the data from. You need either {@link loader} or {@link url}.
|
|
18
|
+
* @property {Object} [params] - The parameters to pass to the {@link loader}.
|
|
19
|
+
* @property {new (...args: any[]) => MioloModel} [model] - A MioloModel class for the data.
|
|
20
|
+
* @property {Function} [modifier] - A function that modifies the data (after ssr'ed or loaded, and after instantiated {@link model} if any).
|
|
21
|
+
* @property {Function|boolean} [effect] - A function that is called when the data is loaded. The {@link effect} function should return true if the data needs to be reloaded.
|
|
22
|
+
* @property {boolean} [cache] - Whether to cache the data.
|
|
23
|
+
* @property {number} [ttl] - The time to live for the cached data in seconds.
|
|
24
|
+
* @property {boolean} [autoRefresh] - Whether to automatically refresh the data on cache expiration.
|
|
25
|
+
*
|
|
26
|
+
*
|
|
27
|
+
* @typedef {Object} MioloSSRData
|
|
28
|
+
* @property {MioloModel | MioloArray | any} data - The data state. Generaly defined by {@link model} and/or {@link modifier} options.
|
|
29
|
+
* @property {Function} setData - Set the data state directly.
|
|
30
|
+
* @property {Function} refresh - If needed, remotely reload data (by calling {@link loader} or {@link url}).
|
|
31
|
+
* @property {Function} invalidate - Invalidate the data cache (requires {@link cache} to be true).
|
|
32
|
+
* @property {string|undefined} error - The error message if any.
|
|
33
|
+
*
|
|
34
|
+
* @property {boolean} ok - Status of SSR data, true if everything was ssr'ed or remotely loaded ok.
|
|
35
|
+
* @property {boolean} ready - true when {@link data} is loaded (either ssr'ed or remotely).
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
const globalSocketState = {
|
|
39
|
+
rooms: new Map(),
|
|
40
|
+
unsubscribeTimers: new Map(),
|
|
41
|
+
lastSubscribeEmitted: new Map(),
|
|
42
|
+
versionsRequestedAt: 0
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Hook to get some ssr data or reload it if needed.
|
|
47
|
+
*
|
|
48
|
+
* @param {Object} context - The miolo context's state object.
|
|
49
|
+
* @param {Object} miolo - The miolo client object, that is:
|
|
50
|
+
* - @prop {Object} fetcher - The fetcher object.
|
|
51
|
+
* - @prop {Object} socket - The socket object.
|
|
52
|
+
* - @prop {Object} logger - The logger object.
|
|
53
|
+
* @param {string} name - The name of the data.
|
|
54
|
+
* @param {MioloSSRDataOptions} options - The options object:
|
|
55
|
+
* @returns {MioloSSRData}
|
|
56
|
+
*/
|
|
57
|
+
const useSsrDataOrReload = (context, miolo, name, options) => {
|
|
58
|
+
const { fetcher, socket, logger } = miolo
|
|
59
|
+
const {
|
|
60
|
+
defval = [],
|
|
61
|
+
loader = undefined,
|
|
62
|
+
url = undefined,
|
|
63
|
+
params = undefined,
|
|
64
|
+
modifier = undefined,
|
|
65
|
+
effect = undefined,
|
|
66
|
+
model = undefined,
|
|
67
|
+
cache = false,
|
|
68
|
+
autoRefresh = true,
|
|
69
|
+
ttl = undefined
|
|
70
|
+
} = options
|
|
71
|
+
|
|
72
|
+
usePropsCheck(loader, effect, modifier, name)
|
|
73
|
+
|
|
74
|
+
const parseData = useCallback(
|
|
75
|
+
(value) => {
|
|
76
|
+
let parsed = value
|
|
77
|
+
if (model !== undefined) {
|
|
78
|
+
parsed = new model(parsed)
|
|
79
|
+
}
|
|
80
|
+
if (modifier !== undefined) {
|
|
81
|
+
parsed = modifier(parsed)
|
|
82
|
+
}
|
|
83
|
+
return parsed
|
|
84
|
+
},
|
|
85
|
+
[modifier, model]
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
const ssrDataFromContext = useMemo(() => {
|
|
89
|
+
return getSsrDataFromContext(context, name)
|
|
90
|
+
}, [context, name])
|
|
91
|
+
|
|
92
|
+
const [ssrData, setSsrData] = useState(
|
|
93
|
+
parseData(ssrDataFromContext !== undefined ? ssrDataFromContext : defval)
|
|
94
|
+
)
|
|
95
|
+
const [status, setStatus] = useState(ssrDataFromContext !== undefined ? "loaded" : "idle")
|
|
96
|
+
const [error, setError] = useState(undefined)
|
|
97
|
+
const pendingLazyRefreshRef = useRef(false)
|
|
98
|
+
|
|
99
|
+
const { cacheInvalidate, cacheSet, cacheGet } = useIndexedDb(name, logger, cache, ttl)
|
|
100
|
+
|
|
101
|
+
const updateSsrData = useCallback(
|
|
102
|
+
(data) => {
|
|
103
|
+
pendingLazyRefreshRef.current = false
|
|
104
|
+
setStatus("loading")
|
|
105
|
+
setSsrData(parseData(data))
|
|
106
|
+
setError(undefined)
|
|
107
|
+
setStatus("loaded")
|
|
108
|
+
/*await*/ cacheSet(data)
|
|
109
|
+
},
|
|
110
|
+
[parseData, cacheSet]
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
const refreshSsrData = useCallback(async () => {
|
|
114
|
+
if (status === "loading") {
|
|
18
115
|
return
|
|
19
116
|
}
|
|
20
117
|
|
|
21
|
-
|
|
118
|
+
pendingLazyRefreshRef.current = false
|
|
119
|
+
setStatus("loading")
|
|
120
|
+
setError(undefined)
|
|
121
|
+
|
|
122
|
+
logger.verbose(`[miolo-react][ssr][${name}] refreshing ssr data`)
|
|
123
|
+
|
|
124
|
+
let newData
|
|
125
|
+
|
|
126
|
+
if (loader !== undefined) {
|
|
127
|
+
newData = await loader(context, fetcher)
|
|
128
|
+
} else {
|
|
129
|
+
if (!url) {
|
|
130
|
+
setError(`No url provided for ${name}`)
|
|
131
|
+
} else {
|
|
132
|
+
const resp = await fetcher.get(url, params)
|
|
133
|
+
if (resp.ok) {
|
|
134
|
+
newData = resp?.data
|
|
135
|
+
} else {
|
|
136
|
+
setError(resp?.error || "Unknown error")
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (newData !== undefined) {
|
|
142
|
+
setSsrData(parseData(newData))
|
|
143
|
+
/*await*/ cacheSet(newData)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
setStatus("loaded")
|
|
147
|
+
}, [status, context, fetcher, loader, url, params, parseData, name, cacheSet, logger])
|
|
22
148
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
149
|
+
const cacheVersionsCheck = useCallback(
|
|
150
|
+
async (versions) => {
|
|
151
|
+
logger.verbose(
|
|
152
|
+
`[miolo-react][ssr][${name}] Backend versions received: ${JSON.stringify(versions)}`
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
const ssrVersions = versions || {}
|
|
156
|
+
if (ssrVersions[name]) {
|
|
157
|
+
const backendVersion = ssrVersions[name]
|
|
158
|
+
logger.verbose(
|
|
159
|
+
`[miolo-react][ssr][${name}] Backend version for ${name} is ${backendVersion}`
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
const [cached, expired, ts] = await cacheGet()
|
|
163
|
+
if (cached) {
|
|
164
|
+
if (expired || ts < backendVersion) {
|
|
165
|
+
logger.info(
|
|
166
|
+
`[miolo-react][ssr][${name}] ssr-versions mismatch for ${name}, invalidating`
|
|
167
|
+
)
|
|
168
|
+
await cacheInvalidate()
|
|
169
|
+
if (autoRefresh === true) {
|
|
170
|
+
await refreshSsrData()
|
|
171
|
+
}
|
|
172
|
+
} else {
|
|
173
|
+
logger.verbose(`[miolo-react][ssr][${name}] ssr-versions match for ${name}`)
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
logger.warn(`[miolo-react][ssr][${name}] No cached data found for ${name}`)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
[name, logger, cacheGet, cacheInvalidate, refreshSsrData, autoRefresh]
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
useEffect(() => {
|
|
184
|
+
let mounted = true
|
|
185
|
+
|
|
186
|
+
const loadData = async () => {
|
|
187
|
+
if (!mounted) return
|
|
188
|
+
|
|
189
|
+
try {
|
|
190
|
+
if (status === "idle") {
|
|
191
|
+
logger.verbose(`[miolo-react][ssr][${name}] getting data for ${name}...`)
|
|
192
|
+
|
|
193
|
+
const changed =
|
|
194
|
+
effect === undefined ||
|
|
195
|
+
(typeof effect === "function" && effect() === true) ||
|
|
196
|
+
effect === true
|
|
197
|
+
|
|
198
|
+
if (changed === true) {
|
|
199
|
+
const [cached, expired, _ts] = await cacheGet()
|
|
200
|
+
|
|
201
|
+
if (cached) {
|
|
202
|
+
logger.verbose(`[miolo-react][ssr][${name}] read data for ${name} from cache`)
|
|
203
|
+
setSsrData(parseData(cached))
|
|
204
|
+
|
|
205
|
+
if (expired) {
|
|
206
|
+
logger.verbose(`[miolo-react][ssr][${name}] expired cache for ${name}, refreshing`)
|
|
207
|
+
await refreshSsrData()
|
|
208
|
+
} else {
|
|
209
|
+
setStatus("loaded")
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
logger.verbose(`[miolo-react][ssr][${name}] no cached data for ${name}, refreshing`)
|
|
213
|
+
await refreshSsrData()
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
} catch (_) {}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
loadData()
|
|
221
|
+
|
|
222
|
+
return () => {
|
|
223
|
+
mounted = false
|
|
224
|
+
}
|
|
225
|
+
}, [status, refreshSsrData, effect, name, parseData, cacheGet, logger])
|
|
226
|
+
|
|
227
|
+
useEffect(() => {
|
|
228
|
+
if (ssrDataFromContext !== undefined) {
|
|
229
|
+
/*await*/ cacheSet(ssrDataFromContext)
|
|
230
|
+
}
|
|
231
|
+
}, [ssrDataFromContext, cacheSet])
|
|
232
|
+
|
|
233
|
+
const handlersRef = useRef(/** @type {any} */ ({}))
|
|
234
|
+
|
|
235
|
+
useEffect(() => {
|
|
236
|
+
handlersRef.current = {
|
|
237
|
+
cacheVersionsCheck,
|
|
238
|
+
cacheInvalidate,
|
|
239
|
+
refreshSsrData,
|
|
240
|
+
refreshSsrDataLazy: () => {
|
|
241
|
+
pendingLazyRefreshRef.current = true
|
|
242
|
+
}
|
|
26
243
|
}
|
|
244
|
+
})
|
|
27
245
|
|
|
28
|
-
fetchData()
|
|
29
|
-
}, [context, miolo, loader, _maybeModify])
|
|
30
|
-
|
|
31
246
|
useEffect(() => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
247
|
+
if (cache === true) {
|
|
248
|
+
patchHistory()
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const onNav = () => {
|
|
252
|
+
if (pendingLazyRefreshRef.current) {
|
|
253
|
+
logger.verbose(
|
|
254
|
+
`[miolo-react][ssr][${name}] navigation detected, doing pending lazy refresh`
|
|
255
|
+
)
|
|
256
|
+
pendingLazyRefreshRef.current = false
|
|
35
257
|
refreshSsrData()
|
|
36
258
|
}
|
|
37
|
-
}
|
|
38
|
-
|
|
259
|
+
}
|
|
260
|
+
window.addEventListener("miolo-navigation", onNav)
|
|
261
|
+
return () => {
|
|
262
|
+
window.removeEventListener("miolo-navigation", onNav)
|
|
263
|
+
}
|
|
264
|
+
}, [cache, name, logger, refreshSsrData])
|
|
265
|
+
|
|
266
|
+
useEffect(() => {
|
|
267
|
+
if (!socket || cache !== true) {
|
|
268
|
+
return
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const currentCount = globalSocketState.rooms.get(name) || 0
|
|
272
|
+
globalSocketState.rooms.set(name, currentCount + 1)
|
|
273
|
+
|
|
274
|
+
const pendingTimer = globalSocketState.unsubscribeTimers.get(name)
|
|
275
|
+
if (pendingTimer) {
|
|
276
|
+
clearTimeout(pendingTimer)
|
|
277
|
+
globalSocketState.unsubscribeTimers.delete(name)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const requestSubscribeAndVersions = () => {
|
|
281
|
+
const now = Date.now()
|
|
282
|
+
const lastSub = globalSocketState.lastSubscribeEmitted.get(name) || 0
|
|
283
|
+
|
|
284
|
+
if (now - lastSub > 100) {
|
|
285
|
+
globalSocketState.lastSubscribeEmitted.set(name, now)
|
|
286
|
+
logger.verbose(`[miolo-react][ssr][${name}] Socket connected, subscribing`)
|
|
287
|
+
socket.emit("ssr-subscribe", name)
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (now - globalSocketState.versionsRequestedAt > 500) {
|
|
291
|
+
globalSocketState.versionsRequestedAt = now
|
|
292
|
+
logger.verbose(`[miolo-react][ssr][${name}] Asking for ssr-versions`)
|
|
293
|
+
socket.emit("ssr-versions")
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const onRefresh = async (data) => {
|
|
298
|
+
if (data.name !== name) return
|
|
299
|
+
|
|
300
|
+
logger.verbose(
|
|
301
|
+
`[miolo-react][ssr][${name}] ssr-refresh ${JSON.stringify(data)} - my socket id: ${socket.id}`
|
|
302
|
+
)
|
|
303
|
+
if (data.exclude_socket_id && data.exclude_socket_id === socket.id) {
|
|
304
|
+
logger.verbose(
|
|
305
|
+
`[miolo-react][ssr][${name}] ssr-refresh ${data.name} ignored for socketid ${socket.id}`
|
|
306
|
+
)
|
|
307
|
+
return
|
|
308
|
+
}
|
|
309
|
+
if (data.only_socket_id && data.only_socket_id !== socket.id) {
|
|
310
|
+
logger.verbose(
|
|
311
|
+
`[miolo-react][ssr][${name}] ssr-refresh ${data.name} ignored for socketid ${socket.id} (only_socket_id mismatch)`
|
|
312
|
+
)
|
|
313
|
+
return
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
logger.info(
|
|
317
|
+
`[miolo-react][ssr][${name}] ssr-refresh ${data.name}${data.lazy ? " (lazy)" : ""}`
|
|
318
|
+
)
|
|
319
|
+
await handlersRef.current.cacheInvalidate()
|
|
320
|
+
|
|
321
|
+
if (!data.lazy) {
|
|
322
|
+
await handlersRef.current.refreshSsrData()
|
|
323
|
+
} else {
|
|
324
|
+
if (handlersRef.current.refreshSsrDataLazy) {
|
|
325
|
+
handlersRef.current.refreshSsrDataLazy()
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
const onVersions = (versions) => {
|
|
331
|
+
if (handlersRef.current.cacheVersionsCheck) {
|
|
332
|
+
handlersRef.current.cacheVersionsCheck(versions)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
logger.verbose(`[miolo-react][ssr][${name}] Attaching ssr/cache socket handlers`)
|
|
337
|
+
|
|
338
|
+
if (socket.connected) {
|
|
339
|
+
requestSubscribeAndVersions()
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
socket.on("connect", requestSubscribeAndVersions)
|
|
343
|
+
socket.on("ssr-versions", onVersions)
|
|
344
|
+
socket.on("ssr-refresh", onRefresh)
|
|
345
|
+
|
|
346
|
+
return () => {
|
|
347
|
+
logger.verbose(`[miolo-react][ssr][${name}] Detaching ssr/cache socket handlers`)
|
|
348
|
+
|
|
349
|
+
const count = globalSocketState.rooms.get(name) || 0
|
|
350
|
+
if (count > 0) {
|
|
351
|
+
globalSocketState.rooms.set(name, count - 1)
|
|
352
|
+
if (count - 1 === 0) {
|
|
353
|
+
const timer = setTimeout(() => {
|
|
354
|
+
if ((globalSocketState.rooms.get(name) || 0) === 0) {
|
|
355
|
+
socket.emit("ssr-unsubscribe", name)
|
|
356
|
+
globalSocketState.lastSubscribeEmitted.set(name, 0)
|
|
357
|
+
}
|
|
358
|
+
globalSocketState.unsubscribeTimers.delete(name)
|
|
359
|
+
}, 100)
|
|
360
|
+
globalSocketState.unsubscribeTimers.set(name, timer)
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
socket.off("connect", requestSubscribeAndVersions)
|
|
365
|
+
socket.off("ssr-versions", onVersions)
|
|
366
|
+
socket.off("ssr-refresh", onRefresh)
|
|
367
|
+
}
|
|
368
|
+
}, [name, cache, socket, logger])
|
|
369
|
+
|
|
370
|
+
useOnWindowFocus(
|
|
371
|
+
useCallback(() => {
|
|
372
|
+
if (cache !== true) {
|
|
373
|
+
return
|
|
374
|
+
}
|
|
375
|
+
if (socket === undefined) {
|
|
376
|
+
return
|
|
377
|
+
}
|
|
378
|
+
logger.verbose(
|
|
379
|
+
`[miolo-react][ssr][${name}] Window focused, checking versions (socket id is ${socket.id})`
|
|
380
|
+
)
|
|
381
|
+
const now = Date.now()
|
|
382
|
+
if (now - globalSocketState.versionsRequestedAt > 500) {
|
|
383
|
+
globalSocketState.versionsRequestedAt = now
|
|
384
|
+
socket.emit("ssr-versions")
|
|
385
|
+
}
|
|
386
|
+
}, [name, cache, logger, socket])
|
|
387
|
+
)
|
|
39
388
|
|
|
40
|
-
return
|
|
389
|
+
return {
|
|
390
|
+
data: ssrData,
|
|
391
|
+
setData: updateSsrData,
|
|
392
|
+
refresh: refreshSsrData,
|
|
393
|
+
invalidate: cacheInvalidate,
|
|
394
|
+
error,
|
|
395
|
+
ok: error === undefined,
|
|
396
|
+
ready: status === "loaded"
|
|
397
|
+
}
|
|
41
398
|
}
|
|
42
399
|
|
|
43
|
-
export {useSsrDataOrReload}
|
|
400
|
+
export { useSsrDataOrReload }
|
package/dist/miolo-react.mjs
DELETED
|
@@ -1,265 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* miolo-react v3.0.0-beta.23
|
|
3
|
-
*
|
|
4
|
-
* https://www.afialapis.com/os/miolo
|
|
5
|
-
*
|
|
6
|
-
* Copyright (c) Donato Lorenzo <donato@afialapis.com>
|
|
7
|
-
*
|
|
8
|
-
* This source code is licensed under the MIT license found in the
|
|
9
|
-
* LICENSE.md file in the root directory of this source tree.
|
|
10
|
-
*
|
|
11
|
-
* @license MIT
|
|
12
|
-
*/
|
|
13
|
-
/* eslint-disable */
|
|
14
|
-
import React, { useContext, useCallback, useState, useEffect } from 'react';
|
|
15
|
-
import { miolo_client } from 'miolo-cli';
|
|
16
|
-
|
|
17
|
-
var MioloContext = /*#__PURE__*/React.createContext();
|
|
18
|
-
|
|
19
|
-
/* eslint react/display-name:0 */
|
|
20
|
-
var withMioloContext = BaseComponent => props => {
|
|
21
|
-
var context = useContext(MioloContext);
|
|
22
|
-
return /*#__PURE__*/React.createElement(BaseComponent, Object.assign({}, props, context));
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
var useMioloContext = () => useContext(MioloContext);
|
|
26
|
-
|
|
27
|
-
function asyncGeneratorStep(n, t, e, r, o, a, c) {
|
|
28
|
-
try {
|
|
29
|
-
var i = n[a](c),
|
|
30
|
-
u = i.value;
|
|
31
|
-
} catch (n) {
|
|
32
|
-
return void e(n);
|
|
33
|
-
}
|
|
34
|
-
i.done ? t(u) : Promise.resolve(u).then(r, o);
|
|
35
|
-
}
|
|
36
|
-
function _asyncToGenerator(n) {
|
|
37
|
-
return function () {
|
|
38
|
-
var t = this,
|
|
39
|
-
e = arguments;
|
|
40
|
-
return new Promise(function (r, o) {
|
|
41
|
-
var a = n.apply(t, e);
|
|
42
|
-
function _next(n) {
|
|
43
|
-
asyncGeneratorStep(a, r, o, _next, _throw, "next", n);
|
|
44
|
-
}
|
|
45
|
-
function _throw(n) {
|
|
46
|
-
asyncGeneratorStep(a, r, o, _next, _throw, "throw", n);
|
|
47
|
-
}
|
|
48
|
-
_next(void 0);
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
function _defineProperty(e, r, t) {
|
|
53
|
-
return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
54
|
-
value: t,
|
|
55
|
-
enumerable: true,
|
|
56
|
-
configurable: true,
|
|
57
|
-
writable: true
|
|
58
|
-
}) : e[r] = t, e;
|
|
59
|
-
}
|
|
60
|
-
function ownKeys(e, r) {
|
|
61
|
-
var t = Object.keys(e);
|
|
62
|
-
if (Object.getOwnPropertySymbols) {
|
|
63
|
-
var o = Object.getOwnPropertySymbols(e);
|
|
64
|
-
r && (o = o.filter(function (r) {
|
|
65
|
-
return Object.getOwnPropertyDescriptor(e, r).enumerable;
|
|
66
|
-
})), t.push.apply(t, o);
|
|
67
|
-
}
|
|
68
|
-
return t;
|
|
69
|
-
}
|
|
70
|
-
function _objectSpread2(e) {
|
|
71
|
-
for (var r = 1; r < arguments.length; r++) {
|
|
72
|
-
var t = null != arguments[r] ? arguments[r] : {};
|
|
73
|
-
r % 2 ? ownKeys(Object(t), true).forEach(function (r) {
|
|
74
|
-
_defineProperty(e, r, t[r]);
|
|
75
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
|
|
76
|
-
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
return e;
|
|
80
|
-
}
|
|
81
|
-
function _toPrimitive(t, r) {
|
|
82
|
-
if ("object" != typeof t || !t) return t;
|
|
83
|
-
var e = t[Symbol.toPrimitive];
|
|
84
|
-
if (void 0 !== e) {
|
|
85
|
-
var i = e.call(t, r);
|
|
86
|
-
if ("object" != typeof i) return i;
|
|
87
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
88
|
-
}
|
|
89
|
-
return ("string" === r ? String : Number)(t);
|
|
90
|
-
}
|
|
91
|
-
function _toPropertyKey(t) {
|
|
92
|
-
var i = _toPrimitive(t, "string");
|
|
93
|
-
return "symbol" == typeof i ? i : i + "";
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
var _getDataFromWindow = name => {
|
|
97
|
-
try {
|
|
98
|
-
if (window != undefined) {
|
|
99
|
-
var ssr_data = window.__CONTEXT.ssr_data;
|
|
100
|
-
if (ssr_data != undefined) {
|
|
101
|
-
if (ssr_data[name] != undefined) {
|
|
102
|
-
return ssr_data[name];
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
} catch (e) {}
|
|
107
|
-
return undefined;
|
|
108
|
-
};
|
|
109
|
-
var getSsrDataFromContext = (context, name) => {
|
|
110
|
-
var data = undefined;
|
|
111
|
-
if ((context === null || context === void 0 ? void 0 : context.ssr_data) != undefined && (context === null || context === void 0 ? void 0 : context.ssr_data[name]) != undefined) {
|
|
112
|
-
data = context.ssr_data[name];
|
|
113
|
-
} else {
|
|
114
|
-
var wdata = _getDataFromWindow(name);
|
|
115
|
-
if (wdata != undefined) {
|
|
116
|
-
data = wdata;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return data;
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
var useSsrDataOrReload = (context, miolo, name, defval, loader, modifier) => {
|
|
123
|
-
var _maybeModify = useCallback(value => {
|
|
124
|
-
return modifier == undefined ? value : modifier(value);
|
|
125
|
-
}, [modifier]);
|
|
126
|
-
var ssrDataFromContext = getSsrDataFromContext(context, name);
|
|
127
|
-
var [ssrData, setSsrData] = useState(_maybeModify(ssrDataFromContext != undefined ? ssrDataFromContext : defval));
|
|
128
|
-
var [needToRefresh, setNeedToRefresh] = useState(ssrDataFromContext == undefined);
|
|
129
|
-
var refreshSsrData = useCallback(() => {
|
|
130
|
-
if (loader == undefined) {
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
var {
|
|
134
|
-
fetcher
|
|
135
|
-
} = miolo;
|
|
136
|
-
function fetchData() {
|
|
137
|
-
return _fetchData.apply(this, arguments);
|
|
138
|
-
}
|
|
139
|
-
function _fetchData() {
|
|
140
|
-
_fetchData = _asyncToGenerator(function* () {
|
|
141
|
-
var nSsrData = yield loader(context, fetcher);
|
|
142
|
-
setSsrData(_maybeModify(nSsrData));
|
|
143
|
-
});
|
|
144
|
-
return _fetchData.apply(this, arguments);
|
|
145
|
-
}
|
|
146
|
-
fetchData();
|
|
147
|
-
}, [context, miolo, loader, _maybeModify]);
|
|
148
|
-
useEffect(() => {
|
|
149
|
-
try {
|
|
150
|
-
if (needToRefresh) {
|
|
151
|
-
setNeedToRefresh(false);
|
|
152
|
-
refreshSsrData();
|
|
153
|
-
}
|
|
154
|
-
} catch (e) {}
|
|
155
|
-
}, [needToRefresh, refreshSsrData]);
|
|
156
|
-
return [ssrData, data => setSsrData(_maybeModify(data)), refreshSsrData];
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
var MioloContextProvider = _ref => {
|
|
160
|
-
var {
|
|
161
|
-
context,
|
|
162
|
-
children
|
|
163
|
-
} = _ref;
|
|
164
|
-
var [innerContext, setInnerContext] = useState(context);
|
|
165
|
-
var [mioloObj, setMioloObj] = useState(miolo_client(context));
|
|
166
|
-
useEffect(() => {
|
|
167
|
-
setInnerContext(context);
|
|
168
|
-
setMioloObj(miolo_client(context));
|
|
169
|
-
}, [context]);
|
|
170
|
-
var login = useCallback(/*#__PURE__*/function () {
|
|
171
|
-
var _ref2 = _asyncToGenerator(function* (credentials) {
|
|
172
|
-
var {
|
|
173
|
-
fetcher
|
|
174
|
-
} = mioloObj;
|
|
175
|
-
var {
|
|
176
|
-
config
|
|
177
|
-
} = innerContext;
|
|
178
|
-
var url = config.login_url || '/login';
|
|
179
|
-
var resp = yield fetcher.login(url, credentials);
|
|
180
|
-
if (resp !== null && resp !== void 0 && resp.data) {
|
|
181
|
-
var _resp$data;
|
|
182
|
-
if (resp !== null && resp !== void 0 && (_resp$data = resp.data) !== null && _resp$data !== void 0 && _resp$data.authenticated) {
|
|
183
|
-
setInnerContext(current => {
|
|
184
|
-
return _objectSpread2(_objectSpread2({}, current), resp === null || resp === void 0 ? void 0 : resp.data);
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
return resp === null || resp === void 0 ? void 0 : resp.data;
|
|
188
|
-
}
|
|
189
|
-
return {};
|
|
190
|
-
});
|
|
191
|
-
return function (_x) {
|
|
192
|
-
return _ref2.apply(this, arguments);
|
|
193
|
-
};
|
|
194
|
-
}(), [innerContext, mioloObj]);
|
|
195
|
-
var logout = useCallback(/*#__PURE__*/_asyncToGenerator(function* () {
|
|
196
|
-
var {
|
|
197
|
-
fetcher
|
|
198
|
-
} = mioloObj;
|
|
199
|
-
var {
|
|
200
|
-
config
|
|
201
|
-
} = innerContext;
|
|
202
|
-
var url = config.logout_url || '/logout';
|
|
203
|
-
yield fetcher.logout(url);
|
|
204
|
-
// resp.redirected= true
|
|
205
|
-
|
|
206
|
-
setInnerContext(current => {
|
|
207
|
-
return _objectSpread2(_objectSpread2({}, current), {}, {
|
|
208
|
-
user: undefined,
|
|
209
|
-
authenticated: false
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
return {
|
|
213
|
-
user: undefined,
|
|
214
|
-
authenticated: false
|
|
215
|
-
};
|
|
216
|
-
}), [innerContext, mioloObj]);
|
|
217
|
-
var updateUser = useCallback(user => {
|
|
218
|
-
setInnerContext(current => {
|
|
219
|
-
return _objectSpread2(_objectSpread2({}, current), {}, {
|
|
220
|
-
user
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
}, []);
|
|
224
|
-
var useSsrData = (name, defval, loader, modifier) => {
|
|
225
|
-
return useSsrDataOrReload(innerContext, mioloObj, name, defval, loader, modifier);
|
|
226
|
-
};
|
|
227
|
-
return /*#__PURE__*/React.createElement(MioloContext.Provider, {
|
|
228
|
-
value: {
|
|
229
|
-
//context: innerContext,
|
|
230
|
-
//setContext: setInnerContext,
|
|
231
|
-
//miolo: mioloObj,
|
|
232
|
-
user: innerContext.user,
|
|
233
|
-
updateUser,
|
|
234
|
-
authenticated: innerContext.authenticated,
|
|
235
|
-
fetcher: mioloObj.fetcher,
|
|
236
|
-
//socket: mioloObj.socket,
|
|
237
|
-
login,
|
|
238
|
-
logout,
|
|
239
|
-
useSsrData
|
|
240
|
-
}
|
|
241
|
-
}, children);
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
var AppBrowser = _ref => {
|
|
245
|
-
var {
|
|
246
|
-
children
|
|
247
|
-
} = _ref;
|
|
248
|
-
var context = typeof window !== 'undefined' && window.__CONTEXT ? window.__CONTEXT : {};
|
|
249
|
-
return /*#__PURE__*/React.createElement(MioloContextProvider, {
|
|
250
|
-
context: context
|
|
251
|
-
}, children);
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
var AppServer = _ref => {
|
|
255
|
-
var {
|
|
256
|
-
context,
|
|
257
|
-
children
|
|
258
|
-
} = _ref;
|
|
259
|
-
return /*#__PURE__*/React.createElement(MioloContextProvider, {
|
|
260
|
-
context: context || {}
|
|
261
|
-
}, children);
|
|
262
|
-
};
|
|
263
|
-
|
|
264
|
-
export { AppBrowser, AppServer, useMioloContext, withMioloContext };
|
|
265
|
-
//# sourceMappingURL=miolo-react.mjs.map
|