8420aecb34
* 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>
53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import "./UserList.scss";
|
|
|
|
import React from "react";
|
|
import clsx from "clsx";
|
|
import { AppState, Collaborator } from "../types";
|
|
import { Tooltip } from "./Tooltip";
|
|
import { useExcalidrawActionManager } from "./App";
|
|
|
|
export const UserList: React.FC<{
|
|
className?: string;
|
|
mobile?: boolean;
|
|
collaborators: AppState["collaborators"];
|
|
}> = ({ className, mobile, collaborators }) => {
|
|
const actionManager = useExcalidrawActionManager();
|
|
|
|
const uniqueCollaborators = new Map<string, Collaborator>();
|
|
collaborators.forEach((collaborator, socketId) => {
|
|
uniqueCollaborators.set(
|
|
// filter on user id, else fall back on unique socketId
|
|
collaborator.id || socketId,
|
|
collaborator,
|
|
);
|
|
});
|
|
|
|
const avatars =
|
|
uniqueCollaborators.size > 0 &&
|
|
Array.from(uniqueCollaborators)
|
|
.filter(([_, client]) => Object.keys(client).length !== 0)
|
|
.map(([clientId, collaborator]) => {
|
|
const avatarJSX = actionManager.renderAction("goToCollaborator", [
|
|
clientId,
|
|
collaborator,
|
|
]);
|
|
|
|
return mobile ? (
|
|
<Tooltip
|
|
label={collaborator.username || "Unknown user"}
|
|
key={clientId}
|
|
>
|
|
{avatarJSX}
|
|
</Tooltip>
|
|
) : (
|
|
<React.Fragment key={clientId}>{avatarJSX}</React.Fragment>
|
|
);
|
|
});
|
|
|
|
return (
|
|
<div className={clsx("UserList", className, { UserList_mobile: mobile })}>
|
|
{avatars}
|
|
</div>
|
|
);
|
|
};
|