From 68d927bf7cdd5cee1bff5a0407d2672c7112b32f Mon Sep 17 00:00:00 2001 From: himself65 Date: Wed, 3 May 2023 00:14:15 -0500 Subject: [PATCH] feat: use `React.use` API --- core/use-swr.ts | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/core/use-swr.ts b/core/use-swr.ts index 7b4deae32..d2057efc2 100644 --- a/core/use-swr.ts +++ b/core/use-swr.ts @@ -1,4 +1,10 @@ -import { useCallback, useRef, useDebugValue, useMemo } from 'react' +/// +import ReactExports, { + useCallback, + useRef, + useDebugValue, + useMemo +} from 'react' import { useSyncExternalStore } from 'use-sync-external-store/shim/index.js' import { @@ -36,6 +42,37 @@ import type { GlobalState } from 'swr/_internal' +const use = + ReactExports.use || + (( + promise: Promise & { + status?: 'pending' | 'fulfilled' | 'rejected' + value?: T + reason?: unknown + } + ): T => { + if (promise.status === 'pending') { + throw promise + } else if (promise.status === 'fulfilled') { + return promise.value as T + } else if (promise.status === 'rejected') { + throw promise.reason + } else { + promise.status = 'pending' + promise.then( + v => { + promise.status = 'fulfilled' + promise.value = v + }, + e => { + promise.status = 'rejected' + promise.reason = e + } + ) + throw promise + } + }) + const WITH_DEDUPE = { dedupe: true } type DefinitelyTruthy = false extends T @@ -661,7 +698,11 @@ export const useSWRHandler = ( fetcherRef.current = fetcher configRef.current = config unmountedRef.current = false - throw isUndefined(error) ? revalidate(WITH_DEDUPE) : error + if (isUndefined(error)) { + use(revalidate(WITH_DEDUPE)) + } else { + throw error + } } return {