/* eslint react/prop-types: "off" */
/* eslint react/require-default-props: "off" */
import type { WebChatActivity } from 'botframework-webchat-core';
import React, { memo, useMemo, type ReactNode } from 'react';
import useGetKeyByActivity from '../hooks/useGetKeyByActivity';
import useSendStatusByActivityKey from '../hooks/useSendStatusByActivityKey';
import type { RenderActivityStatus } from '../types/ActivityStatusMiddleware';
import type { SendStatus } from '../types/SendStatus';
import useWebChatAPIContext from './internal/useWebChatAPIContext';
type ActivityStatusContainerCoreProps = Readonly<{
activity: WebChatActivity;
hideTimestamp: boolean;
nextVisibleActivity: WebChatActivity;
sendStatus: SendStatus;
}>;
const ActivityStatusContainerCore = memo(
({ activity, hideTimestamp, nextVisibleActivity, sendStatus }: ActivityStatusContainerCoreProps) => {
const { activityStatusRenderer: createActivityStatusRenderer }: { activityStatusRenderer: RenderActivityStatus } =
useWebChatAPIContext();
return createActivityStatusRenderer({
activity,
hideTimestamp,
nextVisibleActivity, // "nextVisibleActivity" is for backward compatibility, please remove this line on or after 2022-07-22.
sameTimestampGroup: hideTimestamp, // "sameTimestampGroup" is for backward compatibility, please remove this line on or after 2022-07-22.
sendState: sendStatus === 'send failed' || sendStatus === 'sent' ? sendStatus : 'sending'
});
}
);
type ActivityStatusContainerProps = Readonly<{
activity: WebChatActivity;
hideTimestamp: boolean;
nextVisibleActivity: WebChatActivity;
}>;
const ActivityStatusContainer = memo(
({ activity, hideTimestamp, nextVisibleActivity }: ActivityStatusContainerProps) => {
const [sendStatusByActivityKey] = useSendStatusByActivityKey();
const getKeyByActivity = useGetKeyByActivity();
const key = getKeyByActivity(activity);
const sendStatus = (typeof key === 'string' && sendStatusByActivityKey.get(key)) || 'sent';
return (
);
}
);
export type ActivityStatusRenderer = (renderOptions: {
activity: WebChatActivity;
nextVisibleActivity: WebChatActivity;
}) => (props?: { hideTimestamp?: boolean }) => ReactNode;
export default function useCreateActivityStatusRenderer(): ActivityStatusRenderer {
return useMemo(
() =>
({ activity, nextVisibleActivity }) =>
({ hideTimestamp } = {}) => (
),
[]
);
}