Skip to content

Commit 494b95b

Browse files
committed
Clean up
1 parent 4add090 commit 494b95b

4 files changed

Lines changed: 43 additions & 44 deletions

File tree

packages/api-middleware/src/avatarPolymiddleware.tsx

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { validateProps } from '@msinternal/botframework-webchat-react-valibot';
22
import { type WebChatActivity } from 'botframework-webchat-core';
33
import React, { memo, useMemo } from 'react';
4-
import { any, boolean, custom, object, pipe, readonly, safeParse, type InferInput } from 'valibot';
4+
import { any, custom, object, pipe, readonly, safeParse, type InferInput } from 'valibot';
55

66
import templatePolymiddleware, {
77
type InferHandler,
@@ -28,7 +28,6 @@ const {
2828
{
2929
readonly [__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: any;
3030
readonly activity: WebChatActivity;
31-
readonly fromUser: boolean;
3231
},
3332
{ readonly children?: never }
3433
>('avatar');
@@ -44,8 +43,7 @@ type AvatarPolymiddlewareProviderProps = InferProviderProps<typeof AvatarPolymid
4443
const avatarPolymiddlewareProxyPropsSchema = pipe(
4544
object({
4645
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: any(),
47-
activity: custom<Readonly<WebChatActivity>>(value => safeParse(object({}), value).success),
48-
fromUser: boolean()
46+
activity: custom<Readonly<WebChatActivity>>(value => safeParse(object({}), value).success)
4947
}),
5048
readonly()
5149
);
@@ -54,20 +52,16 @@ type AvatarPolymiddlewareProxyProps = Readonly<InferInput<typeof avatarPolymiddl
5452

5553
// A friendlier version than the organic <Proxy>.
5654
const AvatarPolymiddlewareProxy = memo(function AvatarPolymiddlewareProxy(props: AvatarPolymiddlewareProxyProps) {
57-
const {
58-
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions,
59-
activity,
60-
fromUser
61-
} = validateProps(avatarPolymiddlewareProxyPropsSchema, props);
55+
const { [__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions, activity } =
56+
validateProps(avatarPolymiddlewareProxyPropsSchema, props);
6257

6358
const request = useMemo(
6459
() =>
6560
Object.freeze({
6661
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions,
67-
activity,
68-
fromUser
62+
activity
6963
}),
70-
[activity, fromUser, styleOptions]
64+
[activity, styleOptions]
7165
);
7266

7367
return <Proxy request={request} />;

packages/api/src/hooks/useCreateAvatarRenderer.ts

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,38 @@ import {
33
useBuildRenderAvatarCallback
44
} from '@msinternal/botframework-webchat-api-middleware';
55
import type { WebChatActivity } from 'botframework-webchat-core';
6-
import { useMemo, type ReactNode } from 'react';
6+
import { useCallback, type ReactNode } from 'react';
7+
import { useRefFrom } from 'use-ref-from';
78
import useStyleOptions from './useStyleOptions';
89

9-
/**
10-
* @deprecated Use `<AvatarPolymiddlewareProxy>` or `useBuildRenderAvatarCallback` instead. This hook will be removed on or after 2028-03-16.
11-
*/
12-
export default function useCreateAvatarRenderer(): ({
10+
type CreateAvatarRendererCallback = ({
1311
activity
1412
}: {
1513
activity: WebChatActivity;
16-
}) => false | (() => Exclude<ReactNode, boolean | null | undefined>) {
14+
}) => false | (() => Exclude<ReactNode, boolean | null | undefined>);
15+
16+
/**
17+
* @deprecated Use `<AvatarPolymiddlewareProxy>` or `useBuildRenderAvatarCallback` instead. This hook will be removed on or after 2028-03-16.
18+
*/
19+
export default function useCreateAvatarRenderer(): CreateAvatarRendererCallback {
1720
const [styleOptions] = useStyleOptions();
21+
const styleOptionsRef = useRefFrom(styleOptions);
1822
const buildRenderAvatar = useBuildRenderAvatarCallback();
1923

20-
return useMemo(
21-
() =>
22-
({ activity }) => {
23-
const { from: { role } = {} }: { from?: { role?: string } } = activity;
24-
25-
const renderer = buildRenderAvatar(
26-
Object.freeze({
27-
activity,
28-
fromUser: role === 'user',
29-
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions
30-
})
31-
);
24+
// TODO: [P1] We should move this function into `api-middleware`.
25+
// However, it use `useStyleOptions` which is from `api` package.
26+
// In order to do that, we need to build a new `api-style-options` package first.
27+
return useCallback<CreateAvatarRendererCallback>(
28+
({ activity }) => {
29+
const renderer = buildRenderAvatar(
30+
Object.freeze({
31+
activity,
32+
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptionsRef.current
33+
})
34+
);
3235

33-
return renderer ? (): ReactNode => renderer({}) : false;
34-
},
35-
[buildRenderAvatar, styleOptions]
36+
return renderer ? (): ReactNode => renderer({}) : false;
37+
},
38+
[buildRenderAvatar, styleOptionsRef]
3639
);
3740
}

packages/api/src/legacy/createAvatarPolymiddlewareFromLegacy.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ function createAvatarPolymiddlewareFromLegacy(...middlewares: readonly LegacyAva
5151
({ [__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol]: originalRequest }) => {
5252
if (!originalRequest) {
5353
// TODO: Add a test
54-
throw new Error('botframework-webchat: `avatarMiddleware` must not modify the request object');
54+
throw new Error(
55+
'botframework-webchat: `avatarMiddleware` must pass the whole request object to downstreamers'
56+
);
5557
}
5658

5759
// Pass styleOptions through the polymiddleware chain via the internal runtime extension
@@ -63,16 +65,13 @@ function createAvatarPolymiddlewareFromLegacy(...middlewares: readonly LegacyAva
6365
);
6466

6567
return request => {
66-
const {
67-
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions,
68-
activity,
69-
fromUser
70-
} = request;
68+
const { [__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: styleOptions, activity } =
69+
request;
7170

7271
const legacyResult = legacyHandler(
7372
Object.freeze({
7473
activity,
75-
fromUser,
74+
fromUser: activity.from?.role === 'user',
7675
styleOptions,
7776
[__INTERNAL_DO_NOT_USE__legacyAvatarMiddlewareOriginalRequestSymbol]: request
7877
})

packages/component/src/Middleware/Avatar/defaultAvatarPolymiddleware.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@ import DefaultAvatar from './DefaultAvatar';
55
const defaultAvatarMiddleware = createAvatarPolymiddleware(
66
_next =>
77
({
8-
fromUser,
8+
activity,
99
[__INTERNAL_DO_NOT_USE__avatarPolymiddlewareRequestStyleOptionsSymbol]: {
1010
botAvatarImage,
1111
botAvatarInitials,
1212
userAvatarImage,
1313
userAvatarInitials
1414
}
15-
}) =>
16-
(fromUser ? userAvatarImage || userAvatarInitials : botAvatarImage || botAvatarInitials)
15+
}) => {
16+
const fromUser = activity.from?.role === 'user';
17+
18+
return (fromUser ? userAvatarImage || userAvatarInitials : botAvatarImage || botAvatarInitials)
1719
? avatarComponent(DefaultAvatar, Object.freeze({ fromUser }))
18-
: undefined
20+
: undefined;
21+
}
1922
);
2023

2124
export default defaultAvatarMiddleware;

0 commit comments

Comments
 (0)