
* feat: new Menu Component API * allow valid children types * introduce menu group to group items * Add lang footer * use display name * displayName * define types inside * fix default menu * add json export to menu * fix * simplify expression * put open menu into own compo to optimize perf So that we don't rerun `useOutsideClickHook` (and rebind event listeners all the time) * naming tweaks * rename MenuComponents->MenuDefaultItems and export default items from Menu.Items * import Menu.scss in Menu.tsx * move menu scss to excal app * Don't filter children inside menu group * move E+ out of socials * support style prop for MenuItem and MenuGroup * Support header in menu group and add Excalidraw links header for default items in social section * rename header to title * fix padding for lang * render menu in mobile * review fixes * tweaks * Export collaborators and show in mobile menu * revert .env * lint :p * again lint * show correct actions in view mode for mobile * Whitelist Collaborators Comp * mobile styling * padding * don't show nerds when menu open in mobile * lint :( * hide shortcuts * refactor userlist to support mobile and keep a wrapper comp for excal app * use only UserList * render only on mobile for default items * remove unused hooks * Show collab button in menu when onCollabButtonClick present and hide export when UIOptions.canvasActions.export is false * fix tests * lint * inject userlist inside menu on mobile * revert userlist * move menu socials to default menu * fix collab * use meny in library * Make Menu generic and create hamburgemenu for public excal menu and use menu in library as well * use appState.openMenu for mobile * fix tests * styling fixes and support style and class name in menu content * fix test * rename MenuDefaultItems->DefaultItems * move footer css to its own comp * rename HamburgerMenu -> MainMenu * rename menu -> dropdownMenu and update classes, onClick->onToggle * close main menu when dialog closes * by bye filtering * update docs * fix lint * update example, docs for useDevice and footer in mobile, rename menu ->DropDownMenu everywhere * spec * remove isMenuOpenAtom and set openMenu as canvas for main menu, render decreases in specs :) * [temp] remove cyclic depenedency to fix build * hack- update appstate to sync lang change * Add more specs * wip: rewrite MainMenu footer * fix margin * fix snaps * not needed as lang list no more imported * simplify custom footer rendering * Add DropdownMenuItemLink and DropdownMenuItemCustom and update API, docs * fix `MainMenu.ItemCustom` * naming * use onSelect and base class for custom items * fix lint * fix snap * use custom item for lang * update docs * fix * properly use `MainMenu.ItemCustom` for `LanguageList` * add margin top to custom items * flex Co-authored-by: dwelle <luzar.david@gmail.com>
107 lines
3.0 KiB
TypeScript
107 lines
3.0 KiB
TypeScript
import { HamburgerMenuIcon, HelpIcon, palette } from "../components/icons";
|
|
import { ToolButton } from "../components/ToolButton";
|
|
import { t } from "../i18n";
|
|
import { showSelectedShapeActions, getNonDeletedElements } from "../element";
|
|
import { register } from "./register";
|
|
import { allowFullScreen, exitFullScreen, isFullScreen } from "../utils";
|
|
import { KEYS } from "../keys";
|
|
import { HelpButton } from "../components/HelpButton";
|
|
import DropdownMenuItem from "../components/dropdownMenu/DropdownMenuItem";
|
|
|
|
export const actionToggleCanvasMenu = register({
|
|
name: "toggleCanvasMenu",
|
|
trackEvent: { category: "menu" },
|
|
perform: (_, appState) => ({
|
|
appState: {
|
|
...appState,
|
|
openMenu: appState.openMenu === "canvas" ? null : "canvas",
|
|
},
|
|
commitToHistory: false,
|
|
}),
|
|
PanelComponent: ({ appState, updateData }) => (
|
|
<ToolButton
|
|
type="button"
|
|
icon={HamburgerMenuIcon}
|
|
aria-label={t("buttons.menu")}
|
|
onClick={updateData}
|
|
selected={appState.openMenu === "canvas"}
|
|
/>
|
|
),
|
|
});
|
|
|
|
export const actionToggleEditMenu = register({
|
|
name: "toggleEditMenu",
|
|
trackEvent: { category: "menu" },
|
|
perform: (_elements, appState) => ({
|
|
appState: {
|
|
...appState,
|
|
openMenu: appState.openMenu === "shape" ? null : "shape",
|
|
},
|
|
commitToHistory: false,
|
|
}),
|
|
PanelComponent: ({ elements, appState, updateData }) => (
|
|
<ToolButton
|
|
visible={showSelectedShapeActions(
|
|
appState,
|
|
getNonDeletedElements(elements),
|
|
)}
|
|
type="button"
|
|
icon={palette}
|
|
aria-label={t("buttons.edit")}
|
|
onClick={updateData}
|
|
selected={appState.openMenu === "shape"}
|
|
/>
|
|
),
|
|
});
|
|
|
|
export const actionFullScreen = register({
|
|
name: "toggleFullScreen",
|
|
viewMode: true,
|
|
trackEvent: { category: "canvas", predicate: (appState) => !isFullScreen() },
|
|
perform: () => {
|
|
if (!isFullScreen()) {
|
|
allowFullScreen();
|
|
}
|
|
if (isFullScreen()) {
|
|
exitFullScreen();
|
|
}
|
|
return {
|
|
commitToHistory: false,
|
|
};
|
|
},
|
|
keyTest: (event) => event.key === KEYS.F && !event[KEYS.CTRL_OR_CMD],
|
|
});
|
|
|
|
export const actionShortcuts = register({
|
|
name: "toggleShortcuts",
|
|
viewMode: true,
|
|
trackEvent: { category: "menu", action: "toggleHelpDialog" },
|
|
perform: (_elements, appState, _, { focusContainer }) => {
|
|
if (appState.openDialog === "help") {
|
|
focusContainer();
|
|
}
|
|
return {
|
|
appState: {
|
|
...appState,
|
|
openDialog: appState.openDialog === "help" ? null : "help",
|
|
},
|
|
commitToHistory: false,
|
|
};
|
|
},
|
|
PanelComponent: ({ updateData, isInHamburgerMenu }) =>
|
|
isInHamburgerMenu ? (
|
|
<DropdownMenuItem
|
|
dataTestId="help-menu-item"
|
|
icon={HelpIcon}
|
|
onSelect={updateData}
|
|
shortcut="?"
|
|
ariaLabel={t("helpDialog.title")}
|
|
>
|
|
{t("helpDialog.title")}
|
|
</DropdownMenuItem>
|
|
) : (
|
|
<HelpButton title={t("helpDialog.title")} onClick={updateData} />
|
|
),
|
|
keyTest: (event) => event.key === KEYS.QUESTION_MARK,
|
|
});
|