chore: only show links container toggle if container can be truncated (#2326)

This commit is contained in:
Aman Harwara
2023-05-05 22:09:33 +05:30
committed by GitHub
parent 8c1f4bd064
commit 60e51d334c
2 changed files with 129 additions and 92 deletions

View File

@@ -1,4 +1,12 @@
import { FormEventHandler, KeyboardEventHandler, useDeferredValue, useEffect, useRef } from 'react' import {
FormEventHandler,
ForwardedRef,
KeyboardEventHandler,
forwardRef,
useDeferredValue,
useEffect,
useRef,
} from 'react'
import { observer } from 'mobx-react-lite' import { observer } from 'mobx-react-lite'
import { classNames } from '@standardnotes/utils' import { classNames } from '@standardnotes/utils'
import { LinkingController } from '@/Controllers/LinkingController' import { LinkingController } from '@/Controllers/LinkingController'
@@ -13,6 +21,7 @@ import { Slot } from '@radix-ui/react-slot'
import Icon from '../Icon/Icon' import Icon from '../Icon/Icon'
import { PremiumFeatureIconName } from '../Icon/PremiumFeatureIcon' import { PremiumFeatureIconName } from '../Icon/PremiumFeatureIcon'
import { KeyboardKey } from '@standardnotes/ui-services' import { KeyboardKey } from '@standardnotes/ui-services'
import { mergeRefs } from '@/Hooks/mergeRefs'
type Props = { type Props = {
linkingController: LinkingController linkingController: LinkingController
@@ -23,14 +32,11 @@ type Props = {
item: DecryptedItem item: DecryptedItem
} }
const ItemLinkAutocompleteInput = ({ const ItemLinkAutocompleteInput = forwardRef(
linkingController, (
focusPreviousItem, { linkingController, focusPreviousItem, focusedId, setFocusedId, hoverLabel, item }: Props,
focusedId, forwardedRef: ForwardedRef<HTMLInputElement>,
setFocusedId, ) => {
hoverLabel,
item,
}: Props) => {
const application = useApplication() const application = useApplication()
const { getLinkedTagsForItem, linkItems, createAndAddNewTag, isEntitledToNoteLinking } = linkingController const { getLinkedTagsForItem, linkItems, createAndAddNewTag, isEntitledToNoteLinking } = linkingController
@@ -89,7 +95,7 @@ const ItemLinkAutocompleteInput = ({
)} )}
title={hoverLabel} title={hoverLabel}
id={ElementIds.ItemLinkAutocompleteInput} id={ElementIds.ItemLinkAutocompleteInput}
ref={inputRef} ref={mergeRefs([inputRef, forwardedRef])}
onFocus={handleFocus} onFocus={handleFocus}
onKeyDown={onKeyDown} onKeyDown={onKeyDown}
/> />
@@ -135,6 +141,7 @@ const ItemLinkAutocompleteInput = ({
</form> </form>
</div> </div>
) )
} },
)
export default observer(ItemLinkAutocompleteInput) export default observer(ItemLinkAutocompleteInput)

View File

@@ -2,7 +2,7 @@ import { observer } from 'mobx-react-lite'
import ItemLinkAutocompleteInput from './ItemLinkAutocompleteInput' import ItemLinkAutocompleteInput from './ItemLinkAutocompleteInput'
import { LinkingController } from '@/Controllers/LinkingController' import { LinkingController } from '@/Controllers/LinkingController'
import LinkedItemBubble from './LinkedItemBubble' import LinkedItemBubble from './LinkedItemBubble'
import { useCallback, useEffect, useMemo, useState } from 'react' import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { useResponsiveAppPane } from '../Panes/ResponsivePaneProvider' import { useResponsiveAppPane } from '../Panes/ResponsivePaneProvider'
import { ElementIds } from '@/Constants/ElementIDs' import { ElementIds } from '@/Constants/ElementIDs'
import { classNames } from '@standardnotes/utils' import { classNames } from '@standardnotes/utils'
@@ -112,6 +112,34 @@ const LinkedItemBubblesContainer = ({ item, linkingController, hideToggle = fals
const visibleItems = isCollapsed ? itemsToDisplay.slice(0, 5) : itemsToDisplay const visibleItems = isCollapsed ? itemsToDisplay.slice(0, 5) : itemsToDisplay
const nonVisibleItems = itemsToDisplay.length - visibleItems.length const nonVisibleItems = itemsToDisplay.length - visibleItems.length
const [canShowContainerToggle, setCanShowContainerToggle] = useState(false)
const linkInputRef = useRef<HTMLInputElement>(null)
const linkContainerRef = useRef<HTMLDivElement>(null)
useEffect(() => {
const container = linkContainerRef.current
const linkInput = linkInputRef.current
if (!container || !linkInput) {
return
}
const resizeObserver = new ResizeObserver(() => {
if (container.clientHeight > linkInput.clientHeight) {
setCanShowContainerToggle(true)
} else {
setCanShowContainerToggle(false)
}
})
resizeObserver.observe(linkContainerRef.current)
return () => {
resizeObserver.disconnect()
}
}, [])
const shouldHideToggle = hideToggle || (!canShowContainerToggle && !isCollapsed)
return ( return (
<div <div
className={classNames( className={classNames(
@@ -126,6 +154,7 @@ const LinkedItemBubblesContainer = ({ item, linkingController, hideToggle = fals
allItemsLinkedToItem.length || notesLinkingToItem.length ? 'mt-1' : 'mt-0.5', allItemsLinkedToItem.length || notesLinkingToItem.length ? 'mt-1' : 'mt-0.5',
isCollapsed ? 'overflow-hidden' : 'flex-wrap', isCollapsed ? 'overflow-hidden' : 'flex-wrap',
)} )}
ref={linkContainerRef}
> >
{visibleItems.map((link) => ( {visibleItems.map((link) => (
<LinkedItemBubble <LinkedItemBubble
@@ -148,9 +177,10 @@ const LinkedItemBubblesContainer = ({ item, linkingController, hideToggle = fals
setFocusedId={setFocusedId} setFocusedId={setFocusedId}
hoverLabel={`Focus input to add a link (${shortcut})`} hoverLabel={`Focus input to add a link (${shortcut})`}
item={item} item={item}
ref={linkInputRef}
/> />
</div> </div>
{itemsToDisplay.length > 0 && !hideToggle && ( {itemsToDisplay.length > 0 && !shouldHideToggle && (
<RoundIconButton <RoundIconButton
id="toggle-linking-container" id="toggle-linking-container"
label="Toggle linked items container" label="Toggle linked items container"