[MM-56600] Upgrade to "@floating-ui/react" for hooks/useTooltip (#25976)

Этот коммит содержится в:
M-ZubairAhmed
2024-01-24 04:29:32 +00:00
коммит произвёл GitHub
родитель eee5a71e3d
Коммит 028ad7d33f
3 изменённых файлов: 31 добавлений и 21 удалений

Просмотреть файл

@@ -1,16 +1,17 @@
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information. // See LICENSE.txt for license information.
import {useHover, useInteractions, useFloating, arrow, offset, autoPlacement} from '@floating-ui/react-dom-interactions'; import {useHover, useInteractions, useFloating, arrow, offset, autoPlacement} from '@floating-ui/react';
import type {Strategy, Placement} from '@floating-ui/react-dom-interactions'; import type {Strategy, Placement, ReferenceType} from '@floating-ui/react';
import classNames from 'classnames'; import classNames from 'classnames';
import type {ReactNode, HTMLProps} from 'react';
import React, {useState, useRef} from 'react'; import React, {useState, useRef} from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import {Constants} from 'utils/constants'; import {Constants} from 'utils/constants';
interface TooltipOptions { interface TooltipOptions {
message: React.ReactNode | React.ReactNodeArray; message: ReactNode;
strategy?: Strategy; strategy?: Strategy;
placement: Placement; placement: Placement;
allowedPlacements?: Placement[]; allowedPlacements?: Placement[];
@@ -31,7 +32,13 @@ const defaultOptions: Required<Pick<TooltipOptions, 'strategy' | 'hoverDelay' |
const transitionTime = 150; const transitionTime = 150;
export default function useTooltip(options: TooltipOptions) { interface TooltipReturn {
setReference: (node: ReferenceType | null) => void;
getReferenceProps: (userProps?: HTMLProps<Element>) => Record<string, unknown>;
tooltip: ReactNode;
}
export default function useTooltip(options: TooltipOptions): TooltipReturn {
const [open, setOpen] = useState(false); const [open, setOpen] = useState(false);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const transition = useRef<NodeJS.Timeout>(null); const transition = useRef<NodeJS.Timeout>(null);
@@ -42,10 +49,12 @@ export default function useTooltip(options: TooltipOptions) {
const { const {
x, x,
y, y,
reference,
floating,
strategy, strategy,
placement, placement,
refs: {
setReference,
setFloating,
},
middlewareData: { middlewareData: {
arrow: { arrow: {
x: arrowX, x: arrowX,
@@ -96,7 +105,7 @@ export default function useTooltip(options: TooltipOptions) {
const content = ( const content = (
<div <div
{...getFloatingProps({ {...getFloatingProps({
ref: floating, ref: setFloating,
className: classNames( className: classNames(
'floating-ui-tooltip', 'floating-ui-tooltip',
{ {
@@ -120,7 +129,7 @@ export default function useTooltip(options: TooltipOptions) {
</div> </div>
); );
let tooltip: React.ReactNode | React.ReactNodeArray = false; let tooltip: ReactNode = false;
if (open) { if (open) {
if (effectiveStrategy === 'fixed') { if (effectiveStrategy === 'fixed') {
@@ -132,7 +141,7 @@ export default function useTooltip(options: TooltipOptions) {
} }
return { return {
reference, setReference,
getReferenceProps, getReferenceProps,
tooltip, tooltip,
}; };

Просмотреть файл

@@ -23,7 +23,6 @@ import {
fileSizeToString, fileSizeToString,
getFileType, getFileType,
loadImage, loadImage,
localizeMessage,
} from 'utils/utils'; } from 'utils/utils';
import ArchivedTooltip from './archived_tooltip'; import ArchivedTooltip from './archived_tooltip';
@@ -58,14 +57,16 @@ interface Props extends PropsFromRedux {
export default function FileAttachment(props: Props) { export default function FileAttachment(props: Props) {
const mounted = useRef(true); const mounted = useRef(true);
const intl = useIntl();
const {formatMessage} = useIntl();
const [loaded, setLoaded] = useState(getFileType(props.fileInfo.extension) !== FileTypes.IMAGE); const [loaded, setLoaded] = useState(getFileType(props.fileInfo.extension) !== FileTypes.IMAGE);
const [loadFilesCalled, setLoadFilesCalled] = useState(false); const [loadFilesCalled, setLoadFilesCalled] = useState(false);
const [keepOpen, setKeepOpen] = useState(false); const [keepOpen, setKeepOpen] = useState(false);
const [openUp, setOpenUp] = useState(false); const [openUp, setOpenUp] = useState(false);
const { const {
reference, setReference,
getReferenceProps, getReferenceProps,
tooltip: archivedTooltip, tooltip: archivedTooltip,
} = useTooltip({ } = useTooltip({
@@ -190,8 +191,8 @@ export default function FileAttachment(props: Props) {
<Menu.ItemAction <Menu.ItemAction
data-title='Public Image' data-title='Public Image'
onClick={handleGetPublicLink} onClick={handleGetPublicLink}
ariaLabel={localizeMessage('view_image_popover.publicLink', 'Get a public link')} ariaLabel={formatMessage({id: 'view_image_popover.publicLink', defaultMessage: 'Get a public link'})}
text={localizeMessage('view_image_popover.publicLink', 'Get a public link')} text={formatMessage({id: 'view_image_popover.publicLink', defaultMessage: 'Get a public link'})}
/>, />,
); );
} }
@@ -225,7 +226,7 @@ export default function FileAttachment(props: Props) {
const tooltip = ( const tooltip = (
<Tooltip id='file-name__tooltip'> <Tooltip id='file-name__tooltip'>
{localizeMessage('file_search_result_item.more_actions', 'More Actions')} {formatMessage({id: 'file_search_result_item.more_actions', defaultMessage: 'More Actions'})}
</Tooltip> </Tooltip>
); );
@@ -243,7 +244,7 @@ export default function FileAttachment(props: Props) {
<button <button
ref={buttonRef} ref={buttonRef}
id={`file_action_button_${props.fileInfo.id}`} id={`file_action_button_${props.fileInfo.id}`}
aria-label={localizeMessage('file_search_result_item.more_actions', 'More Actions').toLowerCase()} aria-label={formatMessage({id: 'file_search_result_item.more_actions', defaultMessage: 'More Actions'}).toLowerCase()}
className={classNames( className={classNames(
'file-dropdown-icon', 'dots-icon', 'file-dropdown-icon', 'dots-icon',
{'a11y--active': keepOpen}, {'a11y--active': keepOpen},
@@ -272,7 +273,7 @@ export default function FileAttachment(props: Props) {
let fileThumbnail; let fileThumbnail;
let fileDetail; let fileDetail;
let fileActions; let fileActions;
const ariaLabelImage = `${localizeMessage('file_attachment.thumbnail', 'file thumbnail')} ${fileInfo.name}`.toLowerCase(); const ariaLabelImage = `${formatMessage({id: 'file_attachment.thumbnail', defaultMessage: 'file thumbnail'})} ${fileInfo.name}`.toLowerCase();
if (!compactDisplay) { if (!compactDisplay) {
fileThumbnail = ( fileThumbnail = (
@@ -362,7 +363,7 @@ export default function FileAttachment(props: Props) {
{trimmedFilename} {trimmedFilename}
</span> </span>
<span className='post-image__archived-label'> <span className='post-image__archived-label'>
{intl.formatMessage({ {formatMessage({
id: 'workspace_limits.archived_file.archived_compact', id: 'workspace_limits.archived_file.archived_compact',
defaultMessage: '(archived)', defaultMessage: '(archived)',
})} })}
@@ -373,7 +374,7 @@ export default function FileAttachment(props: Props) {
const content = const content =
( (
<div <div
ref={fileInfo.archived ? reference : undefined} ref={fileInfo.archived ? setReference : undefined}
{...(fileInfo.archived ? getReferenceProps() : {})} {...(fileInfo.archived ? getReferenceProps() : {})}
className={ className={
classNames([ classNames([

Просмотреть файл

@@ -44,7 +44,7 @@ function PostPriorityPickerOverlay({
const messagePriority = formatMessage({id: 'shortcuts.msgs.formatting_bar.post_priority', defaultMessage: 'Message priority'}); const messagePriority = formatMessage({id: 'shortcuts.msgs.formatting_bar.post_priority', defaultMessage: 'Message priority'});
const { const {
reference: tooltipRef, setReference: setTooltipRef,
getReferenceProps: getTooltipReferenceProps, getReferenceProps: getTooltipReferenceProps,
tooltip, tooltip,
} = useTooltip({ } = useTooltip({
@@ -92,7 +92,7 @@ function PostPriorityPickerOverlay({
return ( return (
<> <>
<div <div
ref={tooltipRef} ref={setTooltipRef}
{...getTooltipReferenceProps()} {...getTooltipReferenceProps()}
> >
<IconContainer <IconContainer