From c3b32de46e6df5d5746c5197463a2dbfbf403529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Andr=C3=A9s=20V=C3=A9lez=20Vidal?= Date: Mon, 3 Apr 2023 15:32:05 +0200 Subject: [PATCH] MM-48412 - backdrop issue when rhs expanded; ramdom fixes to channels tour (#22700) * MM-48412 - backdrop issue when rhs expanded; ramdom fixes to channels tour * remove no longer needed backdrop removal --- .../components/tours/channels_tour_tip.tsx | 3 +++ .../crt_threads_pane_tutorial_tip.tsx | 7 +++-- .../create_and_join_channels_tour_tip.tsx | 4 +-- .../invite_people_tour_tip.tsx | 2 +- .../boards_tour_tip.tsx | 7 ++--- .../playbooks_tour_tip.tsx | 6 +++-- .../hooks/useFollowElementDimensions.ts | 27 +++++++++++++++++++ webapp/platform/components/src/index.tsx | 1 + .../components/src/tour_tip/tour_tip.scss | 2 +- .../components/src/tour_tip/tour_tip.tsx | 9 ++----- .../src/tour_tip/tour_tip_backdrop.tsx | 1 - 11 files changed, 50 insertions(+), 19 deletions(-) create mode 100644 webapp/platform/components/src/common/hooks/useFollowElementDimensions.ts diff --git a/webapp/channels/src/components/tours/channels_tour_tip.tsx b/webapp/channels/src/components/tours/channels_tour_tip.tsx index 553c1413cf..333b19ea7f 100644 --- a/webapp/channels/src/components/tours/channels_tour_tip.tsx +++ b/webapp/channels/src/components/tours/channels_tour_tip.tsx @@ -33,6 +33,7 @@ export type ChannelsTourTipProps = { hideBackdrop?: boolean; tippyBlueStyle?: boolean; showOptOut?: boolean; + interactivePunchOut?: boolean; } export const ChannelsTourTip = ({ @@ -50,6 +51,7 @@ export const ChannelsTourTip = ({ hideBackdrop = false, tippyBlueStyle = false, showOptOut = true, + interactivePunchOut = false, }: ChannelsTourTipProps) => { const { show, @@ -131,6 +133,7 @@ export const ChannelsTourTip = ({ hideBackdrop={hideBackdrop} tippyBlueStyle={tippyBlueStyle} showOptOut={showOptOut} + interactivePunchOut={interactivePunchOut} /> ); }; diff --git a/webapp/channels/src/components/tours/crt_tour/crt_threads_pane_tutorial_tip.tsx b/webapp/channels/src/components/tours/crt_tour/crt_threads_pane_tutorial_tip.tsx index 4409a68c08..907966e23f 100644 --- a/webapp/channels/src/components/tours/crt_tour/crt_threads_pane_tutorial_tip.tsx +++ b/webapp/channels/src/components/tours/crt_tour/crt_threads_pane_tutorial_tip.tsx @@ -9,7 +9,7 @@ import {Constants, Preferences} from 'utils/constants'; import {getCurrentUserId} from 'mattermost-redux/selectors/entities/common'; import {savePreferences} from 'mattermost-redux/actions/preferences'; -import {TourTip, useMeasurePunchouts} from '@mattermost/components'; +import {TourTip, useFollowElementDimensions, useMeasurePunchouts} from '@mattermost/components'; const translate = {x: 2, y: 25}; @@ -17,6 +17,9 @@ const CRTThreadsPaneTutorialTip = () => { const dispatch = useDispatch(); const {formatMessage} = useIntl(); const currentUserId = useSelector(getCurrentUserId); + + const dimensions = useFollowElementDimensions('sidebar-right'); + const title = ( { dispatch(savePreferences(currentUserId, preferences)); }; - const overlayPunchOut = useMeasurePunchouts(['rhsContainer'], []); + const overlayPunchOut = useMeasurePunchouts(['rhsContainer'], [dimensions?.width]); return ( { const title = ( @@ -26,7 +26,7 @@ export const CreateAndJoinChannelsTour = () => {

); - const overlayPunchOut = useMeasurePunchouts(['showMoreChannels', 'invitePeople'], [], {y: -8, height: 16, x: 0, width: 0}); + const overlayPunchOut = useMeasurePunchouts(['showMoreChannels', 'showNewChannel'], [], {y: -8, height: 16, x: 0, width: 0}); return ( {

); - const overlayPunchOut = useMeasurePunchouts(['showMoreChannels', 'invitePeople'], [], {y: -8, height: 16, x: 0, width: 0}); + const overlayPunchOut = useMeasurePunchouts(['invitePeople'], [], {y: -8, height: 16, x: 0, width: 0}); return ( { const {formatMessage} = useIntl(); - const {playbooksCount, boardsCount, showBoardsTour} = useShowTourTip(); - const overlayPunchOut = useMeasurePunchouts(['sidebar-right'], []); + const dimensions = useFollowElementDimensions('sidebar-right'); + const overlayPunchOut = useMeasurePunchouts(['sidebar-right'], [dimensions?.width]); if (!showBoardsTour) { return null; @@ -60,6 +60,7 @@ export const BoardsTourTip = (): JSX.Element | null => { singleTip={playbooksCount === 0} placement='left-start' showOptOut={false} + interactivePunchOut={true} /> ); }; diff --git a/webapp/channels/src/components/tours/worktemplate_explore_tour/playbooks_tour_tip.tsx b/webapp/channels/src/components/tours/worktemplate_explore_tour/playbooks_tour_tip.tsx index d8dbe14116..0193222be4 100644 --- a/webapp/channels/src/components/tours/worktemplate_explore_tour/playbooks_tour_tip.tsx +++ b/webapp/channels/src/components/tours/worktemplate_explore_tour/playbooks_tour_tip.tsx @@ -4,7 +4,7 @@ import React from 'react'; import {FormattedMessage, useIntl} from 'react-intl'; -import {useMeasurePunchouts} from '@mattermost/components'; +import {useFollowElementDimensions, useMeasurePunchouts} from '@mattermost/components'; import {useShowTourTip} from './useShowTourTip'; import OnboardingWorkTemplateTourTip from './worktemplate_explore_tour_tip'; @@ -12,7 +12,8 @@ import OnboardingWorkTemplateTourTip from './worktemplate_explore_tour_tip'; export const PlaybooksTourTip = (): JSX.Element | null => { const {formatMessage} = useIntl(); const {playbooksCount, boardsCount, showPlaybooksTour} = useShowTourTip(); - const overlayPunchOut = useMeasurePunchouts(['sidebar-right'], []); + const dimensions = useFollowElementDimensions('sidebar-right'); + const overlayPunchOut = useMeasurePunchouts(['sidebar-right'], [dimensions?.width]); if (!showPlaybooksTour) { return null; @@ -59,6 +60,7 @@ export const PlaybooksTourTip = (): JSX.Element | null => { overlayPunchOut={overlayPunchOut} placement='left-start' showOptOut={false} + interactivePunchOut={true} /> ); }; diff --git a/webapp/platform/components/src/common/hooks/useFollowElementDimensions.ts b/webapp/platform/components/src/common/hooks/useFollowElementDimensions.ts new file mode 100644 index 0000000000..beb3306fc9 --- /dev/null +++ b/webapp/platform/components/src/common/hooks/useFollowElementDimensions.ts @@ -0,0 +1,27 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {useEffect, useState} from 'react'; + +export const useFollowElementDimensions = (elementId: string): DOMRectReadOnly => { + const [dimensions, setDimensions] = useState(new DOMRect()); + + useEffect(() => { + const element = document.getElementById(elementId); + if (!element) { + return undefined; + } + const observer = new ResizeObserver((entries) => { + if (entries.length > 0) { + setDimensions(entries[0].contentRect); + } + }); + observer.observe(element); + + return () => { + observer.unobserve(element); + }; + }, [elementId]); + + return dimensions; +}; diff --git a/webapp/platform/components/src/index.tsx b/webapp/platform/components/src/index.tsx index 4ea9461df8..f1615adf19 100644 --- a/webapp/platform/components/src/index.tsx +++ b/webapp/platform/components/src/index.tsx @@ -16,3 +16,4 @@ export {FocusTrap} from './focus_trap'; // hooks export * from './common/hooks/useMeasurePunchouts'; export {useElementAvailable} from './common/hooks/useElementAvailable'; +export {useFollowElementDimensions} from './common/hooks/useFollowElementDimensions'; diff --git a/webapp/platform/components/src/tour_tip/tour_tip.scss b/webapp/platform/components/src/tour_tip/tour_tip.scss index a4fedc2eb1..378ae208df 100644 --- a/webapp/platform/components/src/tour_tip/tour_tip.scss +++ b/webapp/platform/components/src/tour_tip/tour_tip.scss @@ -363,7 +363,7 @@ &__backdrop { position: absolute; - z-index: 999; + z-index: 100; top: 0; left: 0; width: 100%; diff --git a/webapp/platform/components/src/tour_tip/tour_tip.tsx b/webapp/platform/components/src/tour_tip/tour_tip.tsx index 7f2509bb15..90cdac6a8f 100644 --- a/webapp/platform/components/src/tour_tip/tour_tip.tsx +++ b/webapp/platform/components/src/tour_tip/tour_tip.tsx @@ -90,15 +90,10 @@ export const TourTip = ({ }: Props) => { const FIRST_STEP_INDEX = 0; const triggerRef = useRef(null); - const [useBackdrop, setUseBackdrop] = useState(!hideBackdrop); const onJump = (event: React.MouseEvent, jumpToStep: number) => { handleJump?.(event, jumpToStep); }; - useClickOutsideRef(triggerRef, () => { - setUseBackdrop(false); - }); - // This needs to be changed if root-portal node isn't available to maybe body const rootPortal = document.getElementById('root-portal'); @@ -214,7 +209,7 @@ export const TourTip = ({ > - {useBackdrop && } + /> {show && ( ); }; -