fix: show extra tools dropdown in mobile

This commit is contained in:
Aakansha Doshi 2023-09-05 10:28:30 +05:30
parent 0d49eb3e05
commit beb2ceaa72
3 changed files with 51 additions and 117 deletions

View File

@ -231,7 +231,6 @@ export const ShapesSwitcher = ({
appState: UIAppState; appState: UIAppState;
}) => { }) => {
const [isExtraToolsMenuOpen, setIsExtraToolsMenuOpen] = useState(false); const [isExtraToolsMenuOpen, setIsExtraToolsMenuOpen] = useState(false);
const device = useDevice();
return ( return (
<> <>
{SHAPES.map(({ value, icon, key, numericKey, fillable }, index) => { {SHAPES.map(({ value, icon, key, numericKey, fillable }, index) => {
@ -288,31 +287,22 @@ export const ShapesSwitcher = ({
})} })}
<div className="App-toolbar__divider" /> <div className="App-toolbar__divider" />
{/* TEMP HACK because dropdown doesn't work well inside mobile toolbar */} {/* TEMP HACK because dropdown doesn't work well inside mobile toolbar */}
{device.isMobile ? (
<> <DropdownMenu open={isExtraToolsMenuOpen}>
<ToolButton <DropdownMenu.Trigger
className={clsx("Shape", { fillable: false })} className="App-toolbar__extra-tools-trigger"
type="radio" onToggle={() => setIsExtraToolsMenuOpen(!isExtraToolsMenuOpen)}
icon={frameToolIcon} title={t("toolBar.extraTools")}
checked={activeTool.type === "frame"} >
name="editor-current-shape" {extraToolsIcon}
title={`${capitalizeString( </DropdownMenu.Trigger>
t("toolBar.frame"), <DropdownMenu.Content
)} ${KEYS.F.toLocaleUpperCase()}`} onClickOutside={() => setIsExtraToolsMenuOpen(false)}
keyBindingLabel={KEYS.F.toLocaleUpperCase()} onSelect={() => setIsExtraToolsMenuOpen(false)}
aria-label={capitalizeString(t("toolBar.frame"))} className="App-toolbar__extra-tools-dropdown"
aria-keyshortcuts={KEYS.F.toLocaleUpperCase()} >
data-testid={`toolbar-frame`} <DropdownMenu.Item
onPointerDown={({ pointerType }) => { onSelect={() => {
if (!appState.penDetected && pointerType === "pen") {
setAppState({
penDetected: true,
penMode: true,
});
}
}}
onChange={({ pointerType }) => {
trackEvent("toolbar", "frame", "ui");
const nextActiveTool = updateActiveTool(appState, { const nextActiveTool = updateActiveTool(appState, {
type: "frame", type: "frame",
}); });
@ -320,29 +310,16 @@ export const ShapesSwitcher = ({
activeTool: nextActiveTool, activeTool: nextActiveTool,
multiElement: null, multiElement: null,
selectedElementIds: {}, selectedElementIds: {},
activeEmbeddable: null,
}); });
}} }}
/> icon={frameToolIcon}
<ToolButton shortcut={KEYS.F.toLocaleUpperCase()}
className={clsx("Shape", { fillable: false })} data-testid="toolbar-frame"
type="radio" >
icon={EmbedIcon} {t("toolBar.frame")}
checked={activeTool.type === "embeddable"} </DropdownMenu.Item>
name="editor-current-shape" <DropdownMenu.Item
title={capitalizeString(t("toolBar.embeddable"))} onSelect={() => {
aria-label={capitalizeString(t("toolBar.embeddable"))}
data-testid={`toolbar-embeddable`}
onPointerDown={({ pointerType }) => {
if (!appState.penDetected && pointerType === "pen") {
setAppState({
penDetected: true,
penMode: true,
});
}
}}
onChange={({ pointerType }) => {
trackEvent("toolbar", "embeddable", "ui");
const nextActiveTool = updateActiveTool(appState, { const nextActiveTool = updateActiveTool(appState, {
type: "embeddable", type: "embeddable",
}); });
@ -350,77 +327,31 @@ export const ShapesSwitcher = ({
activeTool: nextActiveTool, activeTool: nextActiveTool,
multiElement: null, multiElement: null,
selectedElementIds: {}, selectedElementIds: {},
activeEmbeddable: null,
}); });
}} }}
/> icon={EmbedIcon}
</> data-testid="toolbar-embeddable"
) : (
<DropdownMenu open={isExtraToolsMenuOpen}>
<DropdownMenu.Trigger
className="App-toolbar__extra-tools-trigger"
onToggle={() => setIsExtraToolsMenuOpen(!isExtraToolsMenuOpen)}
title={t("toolBar.extraTools")}
> >
{extraToolsIcon} {t("toolBar.embeddable")}
</DropdownMenu.Trigger> </DropdownMenu.Item>
<DropdownMenu.Content <DropdownMenu.Item
onClickOutside={() => setIsExtraToolsMenuOpen(false)} onSelect={() => {
onSelect={() => setIsExtraToolsMenuOpen(false)} const nextActiveTool = updateActiveTool(appState, {
className="App-toolbar__extra-tools-dropdown" type: "mermaid",
});
setAppState({
activeTool: nextActiveTool,
multiElement: null,
selectedElementIds: {},
});
}}
icon={mermaidLogoIcon}
data-testid="toolbar-embeddable"
> >
<DropdownMenu.Item {t("toolBar.mermaidToExcalidraw")}
onSelect={() => { </DropdownMenu.Item>
const nextActiveTool = updateActiveTool(appState, { </DropdownMenu.Content>
type: "frame", </DropdownMenu>
});
setAppState({
activeTool: nextActiveTool,
multiElement: null,
selectedElementIds: {},
});
}}
icon={frameToolIcon}
shortcut={KEYS.F.toLocaleUpperCase()}
data-testid="toolbar-frame"
>
{t("toolBar.frame")}
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
const nextActiveTool = updateActiveTool(appState, {
type: "embeddable",
});
setAppState({
activeTool: nextActiveTool,
multiElement: null,
selectedElementIds: {},
});
}}
icon={EmbedIcon}
data-testid="toolbar-embeddable"
>
{t("toolBar.embeddable")}
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
const nextActiveTool = updateActiveTool(appState, {
type: "mermaid",
});
setAppState({
activeTool: nextActiveTool,
multiElement: null,
selectedElementIds: {},
});
}}
icon={mermaidLogoIcon}
data-testid="toolbar-embeddable"
>
{t("toolBar.mermaidToExcalidraw")}
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu>
)}
</> </>
); );
}; };

View File

@ -7,8 +7,6 @@
margin-top: 0.25rem; margin-top: 0.25rem;
&--mobile { &--mobile {
bottom: 55px;
top: auto;
left: 0; left: 0;
width: 100%; width: 100%;
row-gap: 0.75rem; row-gap: 0.75rem;

View File

@ -278,6 +278,11 @@
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
padding: 8px; padding: 8px;
.dropdown-menu--mobile {
bottom: 55px;
top: auto;
}
} }
.App-mobile-menu { .App-mobile-menu {
@ -609,7 +614,7 @@
} }
.App-toolbar--mobile { .App-toolbar--mobile {
overflow-x: auto; overflow: visible;
max-width: 90vw; max-width: 90vw;
.ToolIcon__keybinding { .ToolIcon__keybinding {