|
1 | 1 | /* (c) Copyright Frontify Ltd., all rights reserved. */ |
2 | 2 |
|
3 | 3 | import { type FileExtension, FileExtensionSets } from '@frontify/app-bridge'; |
4 | | -import { |
5 | | - ActionMenu, |
6 | | - Flyout, |
7 | | - IconArrowCircleUp20, |
8 | | - IconExclamationMarkTriangle, |
9 | | - IconImageStack20, |
10 | | - MenuItemContentSize, |
11 | | -} from '@frontify/fondue'; |
12 | | -import { LoadingCircle } from '@frontify/fondue/components'; |
13 | | -import { type DragEventHandler, type MouseEventHandler, useRef, useState } from 'react'; |
| 4 | +import { IconExclamationMarkTriangle } from '@frontify/fondue'; |
| 5 | +import { Dropdown, Flyout, LoadingCircle } from '@frontify/fondue/components'; |
| 6 | +import { IconArrowCircleUp, IconImageStack } from '@frontify/fondue/icons'; |
| 7 | +import { type DragEventHandler, type MouseEventHandler, useCallback, useMemo, useRef, useState } from 'react'; |
14 | 8 |
|
15 | 9 | import { joinClassNames } from '../../utilities/react/joinClassNames'; |
16 | 10 |
|
@@ -73,6 +67,29 @@ export const BlockInjectButton = ({ |
73 | 67 | setMenuPosition([XInsideComponent, YInsideComponent]); |
74 | 68 | }; |
75 | 69 |
|
| 70 | + const onItemClick = useCallback((callback: () => unknown) => { |
| 71 | + callback(); |
| 72 | + setMenuPosition(undefined); |
| 73 | + }, []); |
| 74 | + |
| 75 | + const menuItems = useMemo(() => { |
| 76 | + const items = []; |
| 77 | + if (onUploadClick) { |
| 78 | + items.push({ |
| 79 | + onSelect: () => onItemClick(onUploadClick), |
| 80 | + title: 'Upload asset', |
| 81 | + icon: <IconArrowCircleUp size="20" />, |
| 82 | + }); |
| 83 | + } |
| 84 | + if (onAssetChooseClick) { |
| 85 | + items.push({ |
| 86 | + onSelect: () => onItemClick(onAssetChooseClick), |
| 87 | + title: 'Browse asset', |
| 88 | + icon: <IconImageStack size="20" />, |
| 89 | + }); |
| 90 | + } |
| 91 | + return items; |
| 92 | + }, [onAssetChooseClick, onUploadClick, onItemClick]); |
76 | 93 | return ( |
77 | 94 | <button |
78 | 95 | ref={buttonRef} |
@@ -121,7 +138,7 @@ export const BlockInjectButton = ({ |
121 | 138 | } |
122 | 139 | onDrop={onDrop ? handleDrop : undefined} |
123 | 140 | onClick={(event) => { |
124 | | - withMenu && openMenu(event); |
| 141 | + withMenu && !menuPosition && openMenu(event); |
125 | 142 | onClick?.(); |
126 | 143 | }} |
127 | 144 | > |
@@ -151,63 +168,26 @@ export const BlockInjectButton = ({ |
151 | 168 | top: menuPosition[1], |
152 | 169 | }} |
153 | 170 | > |
154 | | - <Flyout |
155 | | - onOpenChange={(isOpen) => !isOpen && setMenuPosition(undefined)} |
156 | | - isOpen={true} |
157 | | - fitContent |
158 | | - hug={false} |
159 | | - legacyFooter={false} |
160 | | - trigger={<div />} |
161 | | - > |
162 | | - <ActionMenu |
163 | | - menuBlocks={[ |
164 | | - { |
165 | | - id: 'menu', |
166 | | - menuItems: [ |
167 | | - ...(onUploadClick |
168 | | - ? [ |
169 | | - { |
170 | | - id: 'upload', |
171 | | - size: MenuItemContentSize.XSmall, |
172 | | - title: 'Upload asset', |
173 | | - onClick: () => { |
174 | | - onUploadClick(); |
175 | | - setMenuPosition(undefined); |
176 | | - }, |
177 | | - |
178 | | - initialValue: true, |
179 | | - decorator: ( |
180 | | - <div className="tw-mr-2"> |
181 | | - <IconArrowCircleUp20 /> |
182 | | - </div> |
183 | | - ), |
184 | | - }, |
185 | | - ] |
186 | | - : []), |
187 | | - ...(onAssetChooseClick |
188 | | - ? [ |
189 | | - { |
190 | | - id: 'asset', |
191 | | - size: MenuItemContentSize.XSmall, |
192 | | - title: 'Browse asset', |
193 | | - onClick: () => { |
194 | | - onAssetChooseClick(); |
195 | | - setMenuPosition(undefined); |
196 | | - }, |
197 | | - initialValue: true, |
198 | | - decorator: ( |
199 | | - <div className="tw-mr-2"> |
200 | | - <IconImageStack20 /> |
201 | | - </div> |
202 | | - ), |
203 | | - }, |
204 | | - ] |
205 | | - : []), |
206 | | - ], |
207 | | - }, |
208 | | - ]} |
209 | | - /> |
210 | | - </Flyout> |
| 171 | + <Flyout.Root open onOpenChange={(isOpen) => !isOpen && setMenuPosition(undefined)}> |
| 172 | + <Flyout.Trigger> |
| 173 | + <div /> |
| 174 | + </Flyout.Trigger> |
| 175 | + <Flyout.Content triggerOffset="compact"> |
| 176 | + <Dropdown.Root open> |
| 177 | + <Dropdown.Trigger> |
| 178 | + <div /> |
| 179 | + </Dropdown.Trigger> |
| 180 | + <Dropdown.Content triggerOffset="compact"> |
| 181 | + {menuItems.map((item) => ( |
| 182 | + <Dropdown.Item key={item.title} onSelect={item.onSelect}> |
| 183 | + {item.icon} |
| 184 | + {item.title} |
| 185 | + </Dropdown.Item> |
| 186 | + ))} |
| 187 | + </Dropdown.Content> |
| 188 | + </Dropdown.Root> |
| 189 | + </Flyout.Content> |
| 190 | + </Flyout.Root> |
211 | 191 | </div> |
212 | 192 | )} |
213 | 193 | </button> |
|
0 commit comments