Skip to content

Commit d972937

Browse files
committed
feat: Method onToggleFocusMode for the left drawer
1 parent a59c74f commit d972937

File tree

5 files changed

+42
-1
lines changed

5 files changed

+42
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,4 +139,8 @@ registerLeftDrawer({
139139
onHeaderActionClick: ({ detail }) => {
140140
console.log('onHeaderActionClick: ', detail);
141141
},
142+
143+
onToggleFocusMode: ({ detail }) => {
144+
console.log('onToggleFocusMode: ', detail);
145+
},
142146
});

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,31 @@ describeEachAppLayout({ themes: ['refresh-toolbar'] }, ({ size }) => {
249249
}
250250
);
251251

252+
test(`calls onToggleFocusMode handler by entering / exiting focus mode in left runtime drawer)`, () => {
253+
const drawerId = 'global-drawer';
254+
const onToggleFocusMode = jest.fn();
255+
awsuiWidgetPlugins.registerLeftDrawer({
256+
...drawerDefaults,
257+
id: drawerId,
258+
isExpandable: true,
259+
onToggleFocusMode: event => onToggleFocusMode(event.detail),
260+
});
261+
const renderProps = renderComponent(<AppLayout />);
262+
const { globalDrawersWrapper } = renderProps;
263+
264+
globalDrawersWrapper.findAiDrawerTrigger()!.click();
265+
if (size === 'mobile') {
266+
expect(globalDrawersWrapper.findExpandedModeButtonByActiveDrawerId(drawerId)).toBeFalsy();
267+
} else {
268+
createWrapper().findButtonGroup()!.findButtonById('expand')!.click();
269+
expect(globalDrawersWrapper.findDrawerById(drawerId)!.isDrawerInExpandedMode()).toBe(true);
270+
expect(onToggleFocusMode).toHaveBeenCalledWith({ isExpanded: true });
271+
createWrapper().findButtonGroup()!.findButtonById('expand')!.click();
272+
expect(globalDrawersWrapper.isLayoutInDrawerExpandedMode()).toBe(false);
273+
expect(onToggleFocusMode).toHaveBeenCalledWith({ isExpanded: false });
274+
}
275+
});
276+
252277
describe('metrics', () => {
253278
let sendPanoramaMetricSpy: jest.SpyInstance;
254279
beforeEach(() => {

src/app-layout/visual-refresh-toolbar/interfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export type InternalDrawer = AppLayoutProps.Drawer & {
2727
headerActions?: ReadonlyArray<ButtonGroupProps.Item>;
2828
onHeaderActionClick?: NonCancelableEventHandler<ButtonGroupProps.ItemClickDetails>;
2929
position?: 'side' | 'bottom';
30+
onToggleFocusMode?: NonCancelableEventHandler<{ isExpanded: boolean }>;
3031
};
3132

3233
// Widgetization notice: structures in this file are shared multiple app layout instances, possibly different minor versions.

src/app-layout/visual-refresh-toolbar/state/use-ai-drawer.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3-
import { useRef, useState } from 'react';
3+
import { useEffect, useRef, useState } from 'react';
44

55
import { fireNonCancelableEvent } from '../../../internal/events';
6+
import { usePrevious } from '../../../internal/hooks/use-previous';
67
import { DrawerPayload as RuntimeAiDrawerConfig, WidgetMessage } from '../../../internal/plugins/widget/interfaces';
78
import { getLimitedValue } from '../../../split-panel/utils/size-utils';
89
import { mapRuntimeConfigToAiDrawer } from '../../runtime-drawer';
@@ -33,6 +34,15 @@ export function useAiDrawer({
3334
const [size, setSize] = useState<number | null>(null);
3435
const aiDrawerWasOpenRef = useRef(false);
3536
aiDrawerWasOpenRef.current = aiDrawerWasOpenRef.current || !!activeAiDrawerId;
37+
const prevExpandedDrawerId = usePrevious(expandedDrawerId);
38+
39+
useEffect(() => {
40+
if (prevExpandedDrawerId !== expandedDrawerId) {
41+
fireNonCancelableEvent(runtimeDrawer?.onToggleFocusMode, {
42+
isExpanded: !!expandedDrawerId,
43+
});
44+
}
45+
}, [runtimeDrawer?.onToggleFocusMode, expandedDrawerId, prevExpandedDrawerId]);
3646

3747
function onActiveAiDrawerResize(size: number) {
3848
const limitedSize = getLimitedValue(minAiDrawerSize, size, getMaxAiDrawerSize());

src/internal/plugins/widget/interfaces.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export interface DrawerPayload {
5050
unmountHeader?: (container: HTMLElement) => void;
5151
headerActions?: ReadonlyArray<ButtonGroupProps.Item>;
5252
onHeaderActionClick?: NonCancelableEventHandler<ButtonGroupProps.ItemClickDetails>;
53+
onToggleFocusMode?: NonCancelableEventHandler<{ isExpanded: boolean }>;
5354
position?: 'side' | 'bottom';
5455
}
5556

0 commit comments

Comments
 (0)