chore: only show links container toggle if container can be truncated (#2326)
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
Reference in New Issue
Block a user