mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-05-03 10:00:07 -04:00
* 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>
121 lines
3.2 KiB
TypeScript
121 lines
3.2 KiB
TypeScript
import { actionLoadScene, actionShortcuts } from "../actions";
|
|
import { ActionManager } from "../actions/manager";
|
|
import { getShortcutFromShortcutName } from "../actions/shortcuts";
|
|
import { isExcalidrawPlusSignedUser } from "../constants";
|
|
import { t } from "../i18n";
|
|
import { AppState } from "../types";
|
|
import { ExcalLogo, HelpIcon, LoadIcon, PlusPromoIcon } from "./icons";
|
|
import "./WelcomeScreen.scss";
|
|
|
|
const WelcomeScreenItem = ({
|
|
label,
|
|
shortcut,
|
|
onClick,
|
|
icon,
|
|
link,
|
|
}: {
|
|
label: string;
|
|
shortcut: string | null;
|
|
onClick?: () => void;
|
|
icon: JSX.Element;
|
|
link?: string;
|
|
}) => {
|
|
if (link) {
|
|
return (
|
|
<a
|
|
className="WelcomeScreen-item"
|
|
href={link}
|
|
target="_blank"
|
|
rel="noreferrer"
|
|
>
|
|
<div className="WelcomeScreen-item__label">
|
|
{icon}
|
|
{label}
|
|
</div>
|
|
</a>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<button className="WelcomeScreen-item" type="button" onClick={onClick}>
|
|
<div className="WelcomeScreen-item__label">
|
|
{icon}
|
|
{label}
|
|
</div>
|
|
{shortcut && (
|
|
<div className="WelcomeScreen-item__shortcut">{shortcut}</div>
|
|
)}
|
|
</button>
|
|
);
|
|
};
|
|
|
|
const WelcomeScreen = ({
|
|
appState,
|
|
actionManager,
|
|
}: {
|
|
appState: AppState;
|
|
actionManager: ActionManager;
|
|
}) => {
|
|
let subheadingJSX;
|
|
|
|
if (isExcalidrawPlusSignedUser) {
|
|
subheadingJSX = t("welcomeScreen.switchToPlusApp")
|
|
.split(/(Excalidraw\+)/)
|
|
.map((bit, idx) => {
|
|
if (bit === "Excalidraw+") {
|
|
return (
|
|
<a
|
|
style={{ pointerEvents: "all" }}
|
|
href={`${process.env.REACT_APP_PLUS_APP}?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenSignedInUser`}
|
|
key={idx}
|
|
>
|
|
Excalidraw+
|
|
</a>
|
|
);
|
|
}
|
|
return bit;
|
|
});
|
|
} else {
|
|
subheadingJSX = t("welcomeScreen.data");
|
|
}
|
|
|
|
return (
|
|
<div className="WelcomeScreen-container">
|
|
<div className="WelcomeScreen-logo virgil WelcomeScreen-decor">
|
|
{ExcalLogo} Excalidraw
|
|
</div>
|
|
<div className="virgil WelcomeScreen-decor WelcomeScreen-decor--subheading">
|
|
{subheadingJSX}
|
|
</div>
|
|
<div className="WelcomeScreen-items">
|
|
{!appState.viewModeEnabled && (
|
|
<WelcomeScreenItem
|
|
// TODO barnabasmolnar/editor-redesign
|
|
// do we want the internationalized labels here that are currently
|
|
// in use elsewhere or new ones?
|
|
label={t("buttons.load")}
|
|
onClick={() => actionManager.executeAction(actionLoadScene)}
|
|
shortcut={getShortcutFromShortcutName("loadScene")}
|
|
icon={LoadIcon}
|
|
/>
|
|
)}
|
|
<WelcomeScreenItem
|
|
onClick={() => actionManager.executeAction(actionShortcuts)}
|
|
label={t("helpDialog.title")}
|
|
shortcut="?"
|
|
icon={HelpIcon}
|
|
/>
|
|
{!isExcalidrawPlusSignedUser && (
|
|
<WelcomeScreenItem
|
|
link="https://plus.excalidraw.com/plus?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenGuest"
|
|
label="Try Excalidraw Plus!"
|
|
shortcut={null}
|
|
icon={PlusPromoIcon}
|
|
/>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default WelcomeScreen;
|