Files
outline/app/editor/components/SuggestionsMenuItem.tsx
Tom Moor 4182cbd5d0 chore: Refactoring some editor controls (#5023)
* Refactor EmojiMenu

* Refactor CommandMenu to functional component

* Remove more direct props, refactor to useEditor

* Remove hardcoded IDs

* Refactor SelectionToolbar to functional component

* fix: Positioning of suggestion menu on long paragraphs
2023-03-13 18:05:06 -07:00

64 lines
1.5 KiB
TypeScript

import * as React from "react";
import scrollIntoView from "smooth-scroll-into-view-if-needed";
import styled from "styled-components";
import MenuItem from "~/components/ContextMenu/MenuItem";
import { usePortalContext } from "~/components/Portal";
export type Props = {
selected: boolean;
disabled?: boolean;
onClick: () => void;
icon?: React.ReactElement;
title: React.ReactNode;
shortcut?: string;
};
function SuggestionsMenuItem({
selected,
disabled,
onClick,
title,
shortcut,
icon,
}: Props) {
const portal = usePortalContext();
const ref = React.useCallback(
(node) => {
if (selected && node) {
scrollIntoView(node, {
scrollMode: "if-needed",
block: "nearest",
boundary: (parent) => {
// All the parent elements of your target are checked until they
// reach the portal context. Prevents body and other parent
// elements from being scrolled
return parent !== portal;
},
});
}
},
[selected, portal]
);
return (
<MenuItem
ref={ref}
active={selected}
onClick={disabled ? undefined : onClick}
icon={icon}
>
{title}
{shortcut && <Shortcut $active={selected}>{shortcut}</Shortcut>}
</MenuItem>
);
}
const Shortcut = styled.span<{ $active?: boolean }>`
color: ${(props) =>
props.$active ? props.theme.white50 : props.theme.textTertiary};
flex-grow: 1;
text-align: right;
`;
export default SuggestionsMenuItem;