forked from microsoft/BotFramework-WebChat
-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy patherrorBoxPolymiddleware.tsx
More file actions
80 lines (68 loc) · 2.99 KB
/
Copy patherrorBoxPolymiddleware.tsx
File metadata and controls
80 lines (68 loc) · 2.99 KB
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import { validateProps } from '@msinternal/botframework-webchat-react-valibot';
import React, { memo, useCallback, useMemo } from 'react';
import { object, pipe, readonly, string, unknown, type InferInput } from 'valibot';
import templatePolymiddleware, {
type InferHandler,
type InferHandlerResult,
type InferMiddleware,
type InferProps,
type InferProviderProps,
type InferRenderer,
type InferRequest
} from './private/templatePolymiddleware';
const {
createMiddleware: createErrorBoxPolymiddleware,
extractEnhancer: extractErrorBoxEnhancer,
Provider: ErrorBoxPolymiddlewareProvider,
Proxy,
reactComponent: errorBoxComponent,
useBuildRenderCallback
} = templatePolymiddleware<{ readonly error: unknown; readonly where: string }, { readonly children?: never }>(
'ErrorBox'
);
type ErrorBoxPolymiddleware = InferMiddleware<typeof ErrorBoxPolymiddlewareProvider>;
type ErrorBoxPolymiddlewareHandler = InferHandler<typeof ErrorBoxPolymiddlewareProvider>;
type ErrorBoxPolymiddlewareHandlerResult = InferHandlerResult<typeof ErrorBoxPolymiddlewareProvider>;
type ErrorBoxPolymiddlewareProps = InferProps<typeof ErrorBoxPolymiddlewareProvider>;
type ErrorBoxPolymiddlewareRenderer = InferRenderer<typeof ErrorBoxPolymiddlewareProvider>;
type ErrorBoxPolymiddlewareRequest = InferRequest<typeof ErrorBoxPolymiddlewareProvider>;
type ErrorBoxPolymiddlewareProviderProps = InferProviderProps<typeof ErrorBoxPolymiddlewareProvider>;
const ErrorBoxPolymiddlewareProxyPropsSchema = pipe(
object({
error: unknown(),
where: string()
}),
readonly()
);
type ErrorBoxPolymiddlewareProxyProps = Readonly<InferInput<typeof ErrorBoxPolymiddlewareProxyPropsSchema>>;
// If no error box is defined, do not fallthrough into RCoR and it would error out. Render nothing instead.
const NullComponent = () => null;
// A friendlier version than the organic <Proxy>.
const ErrorBoxPolymiddlewareProxy = memo(function ErrorBoxPolymiddlewareProxy(props: ErrorBoxPolymiddlewareProxyProps) {
const { error, where } = validateProps(ErrorBoxPolymiddlewareProxyPropsSchema, props);
const request = useMemo(() => ({ error, where }), [error, where]);
return <Proxy fallbackComponent={NullComponent} request={request} />;
});
const useBuildRenderErrorBoxCallback: typeof useBuildRenderCallback = () => {
const buildRenderCallback = useBuildRenderCallback();
return useCallback(
(request, options) => buildRenderCallback(request, Object.freeze({ fallbackComponent: NullComponent, ...options })),
[buildRenderCallback]
);
};
export {
createErrorBoxPolymiddleware,
errorBoxComponent,
ErrorBoxPolymiddlewareProvider,
ErrorBoxPolymiddlewareProxy,
extractErrorBoxEnhancer,
useBuildRenderErrorBoxCallback,
type ErrorBoxPolymiddleware,
type ErrorBoxPolymiddlewareHandler,
type ErrorBoxPolymiddlewareHandlerResult,
type ErrorBoxPolymiddlewareProps,
type ErrorBoxPolymiddlewareProviderProps,
type ErrorBoxPolymiddlewareProxyProps,
type ErrorBoxPolymiddlewareRenderer,
type ErrorBoxPolymiddlewareRequest
};