-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathuseShim.js
50 lines (47 loc) · 1.21 KB
/
useShim.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import * as React from 'react'
/* eslint-disable default-case */
/* eslint-disable consistent-return */
function isStatefulPromise(promise) {
return 'status' in promise
}
function wrapPromiseWithState(promise) {
if (isStatefulPromise(promise)) {
return promise
}
const pendingPromise = promise
pendingPromise.status = 'pending'
pendingPromise.then(
value => {
if (pendingPromise.status === 'pending') {
const fulfilledPromise = pendingPromise
fulfilledPromise.status = 'fulfilled'
fulfilledPromise.value = value
}
},
reason => {
if (pendingPromise.status === 'pending') {
const rejectedPromise = pendingPromise
rejectedPromise.status = 'rejected'
rejectedPromise.reason = reason
}
},
)
return promise
}
/**
* @template T
* @param {Promise<T>} promise
* @returns {T}
*/
function _use(promise) {
const statefulPromise = wrapPromiseWithState(promise)
switch (statefulPromise.status) {
case 'pending':
throw statefulPromise
case 'rejected':
throw statefulPromise.reason
case 'fulfilled':
return statefulPromise.value
}
}
export const __use = /** @type {{use?: typeof _use}} */ (React).use || _use