From f7f65de322c86918314ef1e9a1bc535205f7db41 Mon Sep 17 00:00:00 2001 From: Josh Perez <60019601+josh-signal@users.noreply.github.com> Date: Fri, 19 Aug 2022 14:36:47 -0400 Subject: [PATCH] Improvements to the MyStories row --- stylesheets/components/MyStories.scss | 4 + stylesheets/components/StoryListItem.scss | 9 -- ts/components/ContextMenu.tsx | 47 +++++-- ts/components/MyStoriesButton.stories.tsx | 3 +- ts/components/MyStoriesButton.tsx | 159 +++++++++++++--------- ts/components/StoriesAddStoryButton.tsx | 90 ++++++++++++ ts/components/StoriesPane.tsx | 60 +------- ts/util/lint/exceptions.json | 21 ++- 8 files changed, 244 insertions(+), 149 deletions(-) create mode 100644 ts/components/StoriesAddStoryButton.tsx diff --git a/stylesheets/components/MyStories.scss b/stylesheets/components/MyStories.scss index c006e8137c..fec508d577 100644 --- a/stylesheets/components/MyStories.scss +++ b/stylesheets/components/MyStories.scss @@ -129,3 +129,7 @@ } } } + +.StoryListItem__button:hover .MyStories__avatar__add-story { + border-color: $color-gray-65; +} diff --git a/stylesheets/components/StoryListItem.scss b/stylesheets/components/StoryListItem.scss index 2282d86bf0..3e35463449 100644 --- a/stylesheets/components/StoryListItem.scss +++ b/stylesheets/components/StoryListItem.scss @@ -83,15 +83,6 @@ position: relative; width: 46px; - &--add { - &::after { - content: ''; - @include color-svg('../images/icons/v2/plus-20.svg', $color-gray-15); - height: 18px; - width: 18px; - } - } - &--image { @include button-reset; diff --git a/ts/components/ContextMenu.tsx b/ts/components/ContextMenu.tsx index 98e50c4e0e..2729435509 100644 --- a/ts/components/ContextMenu.tsx +++ b/ts/components/ContextMenu.tsx @@ -2,9 +2,9 @@ // SPDX-License-Identifier: AGPL-3.0-only import type { KeyboardEvent, ReactNode } from 'react'; -import type { Options } from '@popperjs/core'; +import type { Options, VirtualElement } from '@popperjs/core'; import FocusTrap from 'focus-trap-react'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect, useRef, useState } from 'react'; import classNames from 'classnames'; import { usePopper } from 'react-popper'; import { noop } from 'lodash'; @@ -23,6 +23,7 @@ export type ContextMenuOptionType = { }; export type PropsType = { + readonly ariaLabel?: string; readonly children?: ReactNode; readonly i18n: LocalizerType; readonly menuOptions: ReadonlyArray>; @@ -37,7 +38,27 @@ export type PropsType = { let closeCurrentOpenContextMenu: undefined | (() => unknown); +// https://popper.js.org/docs/v2/virtual-elements/ +// Generating a virtual element here so that we can make the menu pop up +// right under the mouse cursor. +function generateVirtualElement(x: number, y: number): VirtualElement { + return { + getBoundingClientRect: () => ({ + bottom: y, + height: 0, + left: x, + right: x, + toJSON: () => ({ x, y }), + top: y, + width: 0, + x, + y, + }), + }; +} + export function ContextMenu({ + ariaLabel, children, i18n, menuOptions, @@ -56,14 +77,21 @@ export function ContextMenu({ const [popperElement, setPopperElement] = useState( null ); + + const virtualElement = useRef(generateVirtualElement(0, 0)); + const [referenceElement, setReferenceElement] = useState(null); - const { styles, attributes } = usePopper(referenceElement, popperElement, { - placement: 'top-start', - strategy: 'fixed', - ...popperOptions, - }); + const { styles, attributes } = usePopper( + virtualElement.current, + popperElement, + { + placement: 'top-start', + strategy: 'fixed', + ...popperOptions, + } + ); useEffect(() => { if (onMenuShowingChanged) { @@ -129,9 +157,10 @@ export function ContextMenu({ } }; - const handleClick = (ev: KeyboardEvent | React.MouseEvent) => { + const handleClick = (ev: React.MouseEvent) => { closeCurrentOpenContextMenu?.(); closeCurrentOpenContextMenu = () => setIsMenuShowing(false); + virtualElement.current = generateVirtualElement(ev.clientX, ev.clientY); setIsMenuShowing(true); ev.stopPropagation(); ev.preventDefault(); @@ -147,7 +176,7 @@ export function ContextMenu({ )} >