diff --git a/package.json b/package.json index 8a5b7b29..9fbfec1c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "react-dom": "^17.0.2", "react-hot-loader": "^4.13.0", "react-modal": "3.15.1", - "react-tooltip": "^4.2.21", "strip-indent": "^4.0.0" }, "devDependencies": { diff --git a/src/pages/ContentScripts/components/NativePopover.tsx b/src/pages/ContentScripts/components/NativePopover.tsx new file mode 100644 index 00000000..1898090c --- /dev/null +++ b/src/pages/ContentScripts/components/NativePopover.tsx @@ -0,0 +1,90 @@ +import React, { PropsWithChildren, useEffect } from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import elementReady from 'element-ready'; +import $ from 'jquery'; + +interface NativePopoverProps extends PropsWithChildren { + anchor: JQuery; + width: number; + // for now, only support top-middle + arrowPosition: + | 'top-left' + | 'top-middle' + | 'top-right' + | 'bottom-left' + | 'bottom-middle' + | 'bottom-right'; +} + +export const NativePopover = ({ + anchor, + width, + arrowPosition, + children, +}: NativePopoverProps): JSX.Element => { + useEffect(() => { + (async () => { + await elementReady('div.Popover'); + await elementReady('div.Popover-message'); + const $popoverContainer = $('div.Popover'); + const $popoverContent = $('div.Popover-message'); + let popoverTimer: NodeJS.Timeout | null = null; + let leaveTimer: NodeJS.Timeout | null = null; + + const showPopover = () => { + popoverTimer = setTimeout(() => { + const anchorOffset = anchor.offset(); + const anchorWidth = anchor.outerWidth(); + const anchorHeight = anchor.outerHeight(); + if (!anchorOffset || !anchorHeight || !anchorWidth) { + return; + } + const { top, left } = anchorOffset; + + $popoverContent.css('padding', '10px 5px'); + $popoverContent.css('width', width); + $popoverContainer.css('top', `${top + anchorHeight + 10}px`); + $popoverContainer.css( + 'left', + `${left - (width - anchorWidth) / 2}px` + ); + $popoverContent.attr( + 'class', + `Popover-message Box color-shadow-large Popover-message--${arrowPosition}` + ); + render(children, $popoverContent[0]); + $popoverContainer.css('display', 'block'); + }, 1000); + }; + + const hidePopover = () => { + popoverTimer && clearTimeout(popoverTimer); + $popoverContent.addClass('Popover-message--large'); + if ($popoverContent.children().length > 0) { + unmountComponentAtNode($popoverContent[0]); + } + $popoverContainer.css('display', 'none'); + }; + + anchor[0].addEventListener('mouseenter', () => { + popoverTimer = null; + leaveTimer && clearTimeout(leaveTimer); + showPopover(); + }); + + anchor[0].addEventListener('mouseleave', () => { + leaveTimer = setTimeout(hidePopover, 200); + }); + + $popoverContainer[0].addEventListener('mouseenter', () => { + leaveTimer && clearTimeout(leaveTimer); + }); + + $popoverContainer[0].addEventListener('mouseleave', () => { + leaveTimer = setTimeout(hidePopover, 200); + }); + })(); + }, []); + + return <>; +}; diff --git a/src/pages/ContentScripts/features/repo-fork-tooltip/index.tsx b/src/pages/ContentScripts/features/repo-fork-tooltip/index.tsx index 4d6ee9d1..517a9fc5 100644 --- a/src/pages/ContentScripts/features/repo-fork-tooltip/index.tsx +++ b/src/pages/ContentScripts/features/repo-fork-tooltip/index.tsx @@ -1,10 +1,7 @@ -import React from 'react'; -import { render, Container } from 'react-dom'; -import elementReady from 'element-ready'; -import $ from 'jquery'; - import features from '../../../../feature-manager'; -import getGithubTheme from '../../../../helpers/get-github-theme'; +import View from './view'; +import { NativePopover } from '../../components/NativePopover'; +import elementReady from 'element-ready'; import { getRepoName, hasRepoContainerHeader, @@ -12,9 +9,11 @@ import { } from '../../../../helpers/get-repo-info'; import { getForks } from '../../../../api/repo'; import { RepoMeta, metaStore } from '../../../../api/common'; -import View from './view'; -const githubTheme = getGithubTheme(); +import React from 'react'; +import { render } from 'react-dom'; +import $ from 'jquery'; + const featureId = features.getFeatureID(import.meta.url); let repoName: string; let forks: any; @@ -25,46 +24,25 @@ const getData = async () => { meta = (await metaStore.get(repoName)) as RepoMeta; }; -const renderTo = (container: Container) => { - render(, container); -}; - const init = async (): Promise => { repoName = getRepoName(); await getData(); - const selector = '#fork-button'; - await elementReady(selector); - $(selector).attr({ - 'data-tip': '', - 'data-for': 'fork-tooltip', - 'data-class': `floating-window ${githubTheme}`, - 'data-place': 'left', - 'data-effect': 'solid', - 'data-delay-hide': 500, - 'data-delay-show': 1000, - style: { color: githubTheme === 'light' ? '#24292f' : '#c9d1d9' }, - 'data-text-color': githubTheme === 'light' ? '#24292F' : '#C9D1D9', - 'data-background-color': githubTheme === 'light' ? 'white' : '#161B22', - }); - const container = document.createElement('div'); - container.id = featureId; - renderTo(container); - (await elementReady('#repository-container-header'))?.append(container); + const forkButtonSelector = '#fork-button'; + await elementReady(forkButtonSelector); + const $forkButton = $(forkButtonSelector); + const placeholderElement = $('
').appendTo( + 'body' + )[0]; + render( + + + , + placeholderElement + ); }; -const restore = async () => { - // Clicking another repo link in one repo will trigger a turbo:visit, - // so in a restoration visit we should be careful of the current repo. - if (repoName !== getRepoName()) { - repoName = getRepoName(); - await getData(); - } - // Ideally, we should do nothing if the container already exists. But after a tubor - // restoration visit, tooltip cannot be triggered though it exists in DOM tree. One - // way to solve this is to rerender the view to the container. At least this way works. - renderTo($(`#${featureId}`)[0]); -}; +const restore = async () => {}; features.add(featureId, { asLongAs: [isPublicRepoWithMeta, hasRepoContainerHeader], diff --git a/src/pages/ContentScripts/features/repo-fork-tooltip/view.tsx b/src/pages/ContentScripts/features/repo-fork-tooltip/view.tsx index 81f57b84..8f3b72a4 100644 --- a/src/pages/ContentScripts/features/repo-fork-tooltip/view.tsx +++ b/src/pages/ContentScripts/features/repo-fork-tooltip/view.tsx @@ -7,7 +7,6 @@ import optionsStorage, { defaults, } from '../../../../options-storage'; import generateDataByMonth from '../../../../helpers/generate-data-by-month'; -import ReactTooltip from 'react-tooltip'; import ForkChart from './ForkChart'; import { RepoMeta } from '../../../../api/common'; @@ -30,7 +29,7 @@ const View = ({ forks, meta }: Props): JSX.Element | null => { if (!forks) return null; return ( - + <>
{getMessageByLocale('fork_popup_title', options.locale)}
@@ -40,7 +39,7 @@ const View = ({ forks, meta }: Props): JSX.Element | null => { height={130} data={generateDataByMonth(forks, meta.updatedAt)} /> -
+ ); }; diff --git a/src/pages/ContentScripts/features/repo-header-labels/index.tsx b/src/pages/ContentScripts/features/repo-header-labels/index.tsx index c44ddb2e..e53f0660 100644 --- a/src/pages/ContentScripts/features/repo-header-labels/index.tsx +++ b/src/pages/ContentScripts/features/repo-header-labels/index.tsx @@ -1,9 +1,6 @@ -import React from 'react'; -import { render, Container } from 'react-dom'; -import elementReady from 'element-ready'; -import $ from 'jquery'; - import features from '../../../../feature-manager'; +import View from './view'; +import elementReady from 'element-ready'; import { getRepoName, hasRepoContainerHeader, @@ -16,7 +13,10 @@ import { getContributor, } from '../../../../api/repo'; import { RepoMeta, metaStore } from '../../../../api/common'; -import View from './view'; + +import React from 'react'; +import { render, Container } from 'react-dom'; +import $ from 'jquery'; const featureId = features.getFeatureID(import.meta.url); let repoName: string; diff --git a/src/pages/ContentScripts/features/repo-header-labels/view.tsx b/src/pages/ContentScripts/features/repo-header-labels/view.tsx index 21dce2e9..4ca2eeb3 100644 --- a/src/pages/ContentScripts/features/repo-header-labels/view.tsx +++ b/src/pages/ContentScripts/features/repo-header-labels/view.tsx @@ -1,15 +1,13 @@ -import React, { useState, useEffect } from 'react'; - import getGithubTheme from '../../../../helpers/get-github-theme'; import getMessageByLocale from '../../../../helpers/get-message-by-locale'; import { isNull } from '../../../../helpers/is-null'; import { numberWithCommas } from '../../../../helpers/formatter'; +import { NativePopover } from '../../components/NativePopover'; import optionsStorage, { HypercrxOptions, defaults, } from '../../../../options-storage'; import { rocketLight, rocketDark } from './base64'; -import ReactTooltip from 'react-tooltip'; import generateDataByMonth from '../../../../helpers/generate-data-by-month'; import ActivityChart from './ActivityChart'; import OpenRankChart from './OpenRankChart'; @@ -17,6 +15,10 @@ import ParticipantChart from './ParticipantChart'; import ContributorChart from './ContributorChart'; import { RepoMeta } from '../../../../api/common'; +import React, { useState, useEffect } from 'react'; +import { render } from 'react-dom'; +import $ from 'jquery'; + const githubTheme = getGithubTheme(); interface Props { @@ -36,16 +38,77 @@ const View = ({ }: Props): JSX.Element | null => { const [options, setOptions] = useState(defaults); - useEffect(() => { - ReactTooltip.rebuild(); - }, []); - useEffect(() => { (async function () { setOptions(await optionsStorage.getAll()); })(); }, []); + useEffect(() => { + const placeholderElement = $('
').appendTo( + 'body' + )[0]; + render( + <> + +
+ {getMessageByLocale('header_label_activity', options.locale)} +
+ +
+ +
+ {getMessageByLocale('header_label_OpenRank', options.locale)} +
+ +
+ +
+ {getMessageByLocale('header_label_contributor', options.locale)} +
+ +
+ {getMessageByLocale('header_label_participant', options.locale)} +
+ +
+ , + placeholderElement + ); + }, []); + if ( isNull(activity) || isNull(openrank) || @@ -147,52 +210,6 @@ const View = ({ {numberWithCommas(contributorData[contributorData.length - 1][1])}/ {numberWithCommas(participantData[participantData.length - 1][1])} - -
- {getMessageByLocale('header_label_activity', options.locale)} -
- -
- -
- {getMessageByLocale('header_label_OpenRank', options.locale)} -
- -
- -
- {getMessageByLocale('header_label_contributor', options.locale)} -
- -
- {getMessageByLocale('header_label_participant', options.locale)} -
- -
); }; diff --git a/src/pages/ContentScripts/features/repo-issue-tooltip/index.tsx b/src/pages/ContentScripts/features/repo-issue-tooltip/index.tsx index ee2e6996..40ad3d5d 100644 --- a/src/pages/ContentScripts/features/repo-issue-tooltip/index.tsx +++ b/src/pages/ContentScripts/features/repo-issue-tooltip/index.tsx @@ -1,10 +1,7 @@ -import React from 'react'; -import { render, Container } from 'react-dom'; -import elementReady from 'element-ready'; -import $ from 'jquery'; - import features from '../../../../feature-manager'; -import getGithubTheme from '../../../../helpers/get-github-theme'; +import View, { IssueDetail } from './view'; +import { NativePopover } from '../../components/NativePopover'; +import elementReady from 'element-ready'; import { getRepoName, isPublicRepoWithMeta, @@ -14,10 +11,13 @@ import { getIssuesClosed, getIssueComments, } from '../../../../api/repo'; -import View, { IssueDetail } from './view'; + import { RepoMeta, metaStore } from '../../../../api/common'; -const githubTheme = getGithubTheme(); +import React from 'react'; +import { render } from 'react-dom'; +import $ from 'jquery'; + const featureId = features.getFeatureID(import.meta.url); let repoName: string; let issueDetail: IssueDetail = { @@ -34,48 +34,24 @@ const getData = async () => { meta = (await metaStore.get(repoName)) as RepoMeta; }; -const renderTo = (container: Container) => { - render( - , - container - ); -}; - const init = async (): Promise => { repoName = getRepoName(); await getData(); await elementReady('#issues-tab'); - $('#issues-tab').attr({ - 'data-tip': '', - 'data-for': 'issue-tooltip', - 'data-class': `floating-window ${githubTheme}`, - 'data-place': 'bottom', - 'data-effect': 'solid', - 'data-delay-hide': 500, - 'data-delay-show': 1000, - style: { color: githubTheme === 'light' ? '#24292f' : '#c9d1d9' }, - 'data-text-color': githubTheme === 'light' ? '#24292F' : '#C9D1D9', - 'data-background-color': githubTheme === 'light' ? 'white' : '#161B22', - }); - const container = document.createElement('div'); - container.id = featureId; - renderTo(container); - (await elementReady('nav.js-repo-nav'))?.append(container); + const $issueTab = $('#issues-tab'); + const placeholderElement = $('
').appendTo( + 'body' + )[0]; + render( + + + , + placeholderElement + ); }; -const restore = async () => { - // Clicking another repo link in one repo will trigger a turbo:visit, - // so in a restoration visit we should be careful of the current repo. - if (repoName !== getRepoName()) { - repoName = getRepoName(); - await getData(); - } - // Ideally, we should do nothing if the container already exists. But after a tubor - // restoration visit, tooltip cannot be triggered though it exists in DOM tree. One - // way to solve this is to rerender the view to the container. At least this way works. - renderTo($(`#${featureId}`)[0]); -}; +const restore = async () => {}; features.add(featureId, { asLongAs: [isPublicRepoWithMeta], diff --git a/src/pages/ContentScripts/features/repo-issue-tooltip/view.tsx b/src/pages/ContentScripts/features/repo-issue-tooltip/view.tsx index e8ac54e8..76af4454 100644 --- a/src/pages/ContentScripts/features/repo-issue-tooltip/view.tsx +++ b/src/pages/ContentScripts/features/repo-issue-tooltip/view.tsx @@ -8,7 +8,6 @@ import optionsStorage, { defaults, } from '../../../../options-storage'; import generateDataByMonth from '../../../../helpers/generate-data-by-month'; -import ReactTooltip from 'react-tooltip'; import IssueChart from './IssueChart'; import { RepoMeta } from '../../../../api/common'; @@ -69,7 +68,7 @@ const View = ({ }; return ( - + <>
{getMessageByLocale('issue_popup_title', options.locale)}
@@ -80,7 +79,7 @@ const View = ({ data={generateData(issueDetail, meta.updatedAt)} onClick={onClick} /> -
+ ); }; diff --git a/src/pages/ContentScripts/features/repo-pr-tooltip/index.tsx b/src/pages/ContentScripts/features/repo-pr-tooltip/index.tsx index 376d9b86..e851291f 100644 --- a/src/pages/ContentScripts/features/repo-pr-tooltip/index.tsx +++ b/src/pages/ContentScripts/features/repo-pr-tooltip/index.tsx @@ -1,10 +1,7 @@ -import React from 'react'; -import { render, Container } from 'react-dom'; -import elementReady from 'element-ready'; -import $ from 'jquery'; - import features from '../../../../feature-manager'; -import getGithubTheme from '../../../../helpers/get-github-theme'; +import View, { PRDetail } from './view'; +import { NativePopover } from '../../components/NativePopover'; +import elementReady from 'element-ready'; import { getRepoName, isPublicRepoWithMeta, @@ -16,10 +13,12 @@ import { getMergedCodeAddition, getMergedCodeDeletion, } from '../../../../api/repo'; -import View, { PRDetail } from './view'; import { RepoMeta, metaStore } from '../../../../api/common'; -const githubTheme = getGithubTheme(); +import React from 'react'; +import { render } from 'react-dom'; +import $ from 'jquery'; + const featureId = features.getFeatureID(import.meta.url); let repoName: string; let PRDetail: PRDetail = { @@ -40,48 +39,24 @@ const getData = async () => { meta = (await metaStore.get(repoName)) as RepoMeta; }; -const renderTo = (container: Container) => { - render( - , - container - ); -}; - const init = async (): Promise => { repoName = getRepoName(); await getData(); await elementReady('#pull-requests-tab'); - $('#pull-requests-tab').attr({ - 'data-tip': '', - 'data-for': 'pr-tooltip', - 'data-class': `floating-window ${githubTheme}`, - 'data-place': 'bottom', - 'data-effect': 'solid', - 'data-delay-hide': 500, - 'data-delay-show': 1000, - style: { color: githubTheme === 'light' ? '#24292f' : '#c9d1d9' }, - 'data-text-color': githubTheme === 'light' ? '#24292F' : '#C9D1D9', - 'data-background-color': githubTheme === 'light' ? 'white' : '#161B22', - }); - const container = document.createElement('div'); - container.id = featureId; - renderTo(container); - (await elementReady('nav.js-repo-nav'))?.append(container); + const $prTab = $('#pull-requests-tab'); + const placeholderElement = $('
').appendTo( + 'body' + )[0]; + render( + + + , + placeholderElement + ); }; -const restore = async () => { - // Clicking another repo link in one repo will trigger a turbo:visit, - // so in a restoration visit we should be careful of the current repo. - if (repoName !== getRepoName()) { - repoName = getRepoName(); - await getData(); - } - // Ideally, we should do nothing if the container already exists. But after a tubor - // restoration visit, tooltip cannot be triggered though it exists in DOM tree. One - // way to solve this is to rerender the view to the container. At least this way works. - renderTo($(`#${featureId}`)[0]); -}; +const restore = async () => {}; features.add(featureId, { asLongAs: [isPublicRepoWithMeta], diff --git a/src/pages/ContentScripts/features/repo-pr-tooltip/view.tsx b/src/pages/ContentScripts/features/repo-pr-tooltip/view.tsx index 7c6fa870..6f9d4d4a 100644 --- a/src/pages/ContentScripts/features/repo-pr-tooltip/view.tsx +++ b/src/pages/ContentScripts/features/repo-pr-tooltip/view.tsx @@ -8,7 +8,6 @@ import optionsStorage, { defaults, } from '../../../../options-storage'; import generateDataByMonth from '../../../../helpers/generate-data-by-month'; -import ReactTooltip from 'react-tooltip'; import PRChart from './PRChart'; import MergedLinesChart from './MergedLinesChart'; import { RepoMeta } from '../../../../api/common'; @@ -88,7 +87,7 @@ const View = ({ currentRepo, PRDetail, meta }: Props): JSX.Element | null => { }; return ( - + <>
{getMessageByLocale('pr_popup_title', options.locale)}
@@ -108,7 +107,7 @@ const View = ({ currentRepo, PRDetail, meta }: Props): JSX.Element | null => { height={200} data={generateMergedLinesChartData(PRDetail, meta.updatedAt)} /> -
+ ); }; diff --git a/src/pages/ContentScripts/features/repo-star-tooltip/index.tsx b/src/pages/ContentScripts/features/repo-star-tooltip/index.tsx index 97ef1062..73214ae5 100644 --- a/src/pages/ContentScripts/features/repo-star-tooltip/index.tsx +++ b/src/pages/ContentScripts/features/repo-star-tooltip/index.tsx @@ -1,21 +1,20 @@ -import React from 'react'; -import { render, Container } from 'react-dom'; -import elementReady from 'element-ready'; -import $ from 'jquery'; - import features from '../../../../feature-manager'; -import getGithubTheme from '../../../../helpers/get-github-theme'; +import View from './view'; +import { NativePopover } from '../../components/NativePopover'; +import { checkLogined } from '../../../../helpers/get-developer-info'; +import elementReady from 'element-ready'; import { getRepoName, hasRepoContainerHeader, isPublicRepoWithMeta, } from '../../../../helpers/get-repo-info'; import { getStars } from '../../../../api/repo'; -import View from './view'; import { RepoMeta, metaStore } from '../../../../api/common'; -import { checkLogined } from '../../../../helpers/get-developer-info'; -const githubTheme = getGithubTheme(); +import React from 'react'; +import { render } from 'react-dom'; +import $ from 'jquery'; + const featureId = features.getFeatureID(import.meta.url); let repoName: string; let stars: any; @@ -26,51 +25,27 @@ const getData = async () => { meta = (await metaStore.get(repoName)) as RepoMeta; }; -const renderTo = (container: Container) => { - render(, container); -}; - const init = async (): Promise => { repoName = getRepoName(); await getData(); - const isLogined = checkLogined(); - const selector = isLogined + const starButtonSelector = isLogined ? 'button[data-ga-click*="star button"]' : 'a[data-hydro-click*="star button"]'; - await elementReady(selector); - const attributes = { - 'data-tip': '', - 'data-for': 'star-tooltip', - 'data-class': `floating-window ${githubTheme}`, - 'data-place': 'left', - 'data-effect': 'solid', - 'data-delay-hide': 500, - 'data-delay-show': 1000, - style: { color: githubTheme === 'light' ? '#24292f' : '#c9d1d9' }, - 'data-text-color': githubTheme === 'light' ? '#24292F' : '#C9D1D9', - 'data-background-color': githubTheme === 'light' ? 'white' : '#161B22', - }; - $(selector).attr(attributes); - - const container = document.createElement('div'); - container.id = featureId; - renderTo(container); - (await elementReady('#repository-container-header'))?.append(container); + await elementReady(starButtonSelector); + const $starButton = $(starButtonSelector); + const placeholderElement = $('
').appendTo( + 'body' + )[0]; + render( + + + , + placeholderElement + ); }; -const restore = async () => { - // Clicking another repo link in one repo will trigger a turbo:visit, - // so in a restoration visit we should be careful of the current repo. - if (repoName !== getRepoName()) { - repoName = getRepoName(); - await getData(); - } - // Ideally, we should do nothing if the container already exists. But after a tubor - // restoration visit, tooltip cannot be triggered though it exists in DOM tree. One - // way to solve this is to rerender the view to the container. At least this way works. - renderTo($(`#${featureId}`)[0]); -}; +const restore = async () => {}; features.add(featureId, { asLongAs: [isPublicRepoWithMeta, hasRepoContainerHeader], diff --git a/src/pages/ContentScripts/features/repo-star-tooltip/view.tsx b/src/pages/ContentScripts/features/repo-star-tooltip/view.tsx index dfc4cb82..b2a50d0b 100644 --- a/src/pages/ContentScripts/features/repo-star-tooltip/view.tsx +++ b/src/pages/ContentScripts/features/repo-star-tooltip/view.tsx @@ -7,7 +7,6 @@ import optionsStorage, { defaults, } from '../../../../options-storage'; import generateDataByMonth from '../../../../helpers/generate-data-by-month'; -import ReactTooltip from 'react-tooltip'; import StarChart from './StarChart'; import { RepoMeta } from '../../../../api/common'; @@ -30,7 +29,7 @@ const View = ({ stars, meta }: Props): JSX.Element | null => { if (!stars) return null; return ( - + <>
{getMessageByLocale('star_popup_title', options.locale)}
@@ -40,7 +39,7 @@ const View = ({ stars, meta }: Props): JSX.Element | null => { height={130} data={generateDataByMonth(stars, meta.updatedAt)} /> -
+ ); }; diff --git a/yarn.lock b/yarn.lock index dca907fb..28f20cca 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4619,7 +4619,7 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.7.2: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -5144,14 +5144,6 @@ react-redux@^7.2.4: prop-types "^15.7.2" react-is "^17.0.2" -react-tooltip@^4.2.21: - version "4.5.1" - resolved "https://registry.npmjs.org/react-tooltip/-/react-tooltip-4.5.1.tgz#77eccccdf16adec804132e558ec20ca5783b866a" - integrity sha512-Zo+CSFUGXar1uV+bgXFFDe7VeS2iByeIp5rTgTcc2HqtuOS5D76QapejNNfx320MCY91TlhTQat36KGFTqgcvw== - dependencies: - prop-types "^15.8.1" - uuid "^7.0.3" - react@^17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" @@ -5997,11 +5989,6 @@ uuid@^3.3.2: resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"