Skip to content

Commit d024ba3

Browse files
authored
feat: Add enter and exit focus mode methods to the plugin API (#3916)
1 parent 9d9f437 commit d024ba3

File tree

4 files changed

+57
-6
lines changed

4 files changed

+57
-6
lines changed

pages/app-layout/utils/external-global-left-panel-widget.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import React from 'react';
44
import ReactDOM, { unmountComponentAtNode } from 'react-dom';
55

6-
import { Box } from '~components';
7-
import { registerLeftDrawer } from '~components/internal/plugins/widget';
6+
import { Box, Button } from '~components';
7+
import { registerLeftDrawer, updateDrawer } from '~components/internal/plugins/widget';
88

99
import styles from '../styles.scss';
1010

@@ -14,6 +14,20 @@ const AIDrawer = () => {
1414
<Box variant="h2" padding={{ bottom: 'm' }}>
1515
Chat demo
1616
</Box>
17+
<Button
18+
onClick={() => {
19+
updateDrawer({ type: 'expandDrawer', payload: { id: 'amazon-q' } });
20+
}}
21+
>
22+
expand programmatically
23+
</Button>
24+
<Button
25+
onClick={() => {
26+
updateDrawer({ type: 'exitExpandedMode' });
27+
}}
28+
>
29+
exit expanded mode
30+
</Button>
1731
{new Array(100).fill(null).map((_, index) => (
1832
<div key={index}>Tela content</div>
1933
))}

src/app-layout/__tests__/runtime-drawers-widgetized.test.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,23 @@ describeEachAppLayout({ themes: ['refresh-toolbar'] }, ({ size }) => {
151151
expect(globalDrawersWrapper.findDrawerById(drawerDefaults.id)!.isActive()).toBe(true);
152152
});
153153

154+
test('should enter and exit focus mode in global ai drawer via API', () => {
155+
awsuiWidgetPlugins.registerLeftDrawer({ ...drawerDefaults, isExpandable: true, defaultActive: true });
156+
157+
const { globalDrawersWrapper } = renderComponent(<AppLayout />);
158+
expect(globalDrawersWrapper.findDrawerById(drawerDefaults.id)).toBeTruthy();
159+
160+
act(() => awsuiWidgetPlugins.updateDrawer({ type: 'expandDrawer', payload: { id: drawerDefaults.id } }));
161+
162+
expect(globalDrawersWrapper.findDrawerById(drawerDefaults.id)!.isDrawerInExpandedMode()).toBe(true);
163+
expect(globalDrawersWrapper.isLayoutInDrawerExpandedMode()).toBe(true);
164+
165+
act(() => awsuiWidgetPlugins.updateDrawer({ type: 'exitExpandedMode' }));
166+
167+
expect(globalDrawersWrapper.findDrawerById(drawerDefaults.id)!.isDrawerInExpandedMode()).toBe(false);
168+
expect(globalDrawersWrapper.isLayoutInDrawerExpandedMode()).toBe(false);
169+
});
170+
154171
test('onResize functionality', () => {
155172
const onResize = jest.fn();
156173
awsuiWidgetPlugins.registerLeftDrawer({

src/app-layout/utils/use-ai-drawer.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ function useRuntimeAiDrawer(
2121
isEnabled: boolean,
2222
activeAiDrawerId: string | null,
2323
onActiveAiDrawerChange: (newDrawerId: string | null, { initiatedByUserAction }: OnChangeParams) => void,
24-
onActiveAiDrawerResize: (size: number) => void
24+
onActiveAiDrawerResize: (size: number) => void,
25+
setExpandedDrawerId: (value: string | null) => void
2526
) {
2627
const [aiDrawer, setAiDrawer] = useState<RuntimeAiDrawerConfig | null>(null);
2728
const appLayoutMessageHandler = useStableCallback((event: AppLayoutMessage) => {
@@ -32,7 +33,7 @@ function useRuntimeAiDrawer(
3233
}
3334
return;
3435
}
35-
if (aiDrawer && aiDrawer.id !== event.payload.id) {
36+
if (aiDrawer && 'payload' in event && aiDrawer.id !== event.payload.id) {
3637
metrics.sendOpsMetricObject('awsui-widget-drawer-incorrect-id', { oldId: aiDrawer?.id, newId: event.payload.id });
3738
return;
3839
}
@@ -49,6 +50,12 @@ function useRuntimeAiDrawer(
4950
case 'resizeDrawer':
5051
onActiveAiDrawerResizeStable(event.payload.size);
5152
break;
53+
case 'expandDrawer':
54+
setExpandedDrawerIdStable(event.payload.id);
55+
break;
56+
case 'exitExpandedMode':
57+
setExpandedDrawerIdStable(null);
58+
break;
5259
/* istanbul ignore next: this code is not intended to be visited */
5360
default:
5461
assertNever(event);
@@ -57,6 +64,7 @@ function useRuntimeAiDrawer(
5764
const onAiDrawersChangeStable = useStableCallback(onActiveAiDrawerChange);
5865
const onActiveAiDrawerResizeStable = useStableCallback(onActiveAiDrawerResize);
5966
const onActiveAiDrawerChangeStable = useStableCallback(onActiveAiDrawerChange);
67+
const setExpandedDrawerIdStable = useStableCallback(setExpandedDrawerId);
6068
const aiDrawerWasOpenRef = useRef(false);
6169
aiDrawerWasOpenRef.current = aiDrawerWasOpenRef.current || !!activeAiDrawerId;
6270

@@ -122,7 +130,13 @@ export function useAiDrawer({ isEnabled, onAiDrawerFocus, expandedDrawerId, setE
122130
onAiDrawerFocus?.();
123131
}
124132

125-
const aiDrawer = useRuntimeAiDrawer(isEnabled, activeAiDrawerId, onActiveAiDrawerChange, onActiveAiDrawerResize);
133+
const aiDrawer = useRuntimeAiDrawer(
134+
isEnabled,
135+
activeAiDrawerId,
136+
onActiveAiDrawerChange,
137+
onActiveAiDrawerResize,
138+
setExpandedDrawerId
139+
);
126140
const activeAiDrawer = activeAiDrawerId && activeAiDrawerId === aiDrawer?.id ? aiDrawer : null;
127141
const activeAiDrawerSize = activeAiDrawerId ? (size ?? activeAiDrawer?.defaultSize ?? MIN_DRAWER_SIZE) : 0;
128142
const minAiDrawerSize = Math.min(activeAiDrawer?.defaultSize ?? MIN_DRAWER_SIZE, MIN_DRAWER_SIZE);

src/internal/plugins/widget/interfaces.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,17 @@ export type UpdateDrawerConfigMessage = Message<
5757
export type OpenDrawerMessage = Message<'openDrawer', { id: string }>;
5858
export type CloseDrawerMessage = Message<'closeDrawer', { id: string }>;
5959
export type ResizeDrawerMessage = Message<'resizeDrawer', { id: string; size: number }>;
60+
export type ExpandDrawerMessage = Message<'expandDrawer', { id: string }>;
61+
export interface ExitExpandedModeMessage {
62+
type: 'exitExpandedMode';
63+
}
6064

6165
export type AppLayoutUpdateMessage =
6266
| UpdateDrawerConfigMessage
6367
| OpenDrawerMessage
6468
| CloseDrawerMessage
65-
| ResizeDrawerMessage;
69+
| ResizeDrawerMessage
70+
| ExpandDrawerMessage
71+
| ExitExpandedModeMessage;
6672

6773
export type AppLayoutMessage = RegisterDrawerMessage | AppLayoutUpdateMessage;

0 commit comments

Comments
 (0)