From f015b25fe8067385ff5b320bd53adbfa041b2243 Mon Sep 17 00:00:00 2001 From: Jones Date: Thu, 4 Apr 2024 08:50:42 +0100 Subject: [PATCH] chore: replace react-portal with react-useportal --- package.json | 2 -- .../NodeConfigurationFields.tsx | 11 ++++++----- .../components/TagSelector/TagSelector.tsx | 7 ++++++- yarn.lock | 19 ++++--------------- 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 3cf0ffb6ff5..3ceeb2b60ac 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,6 @@ "react-dom": "18.2.0", "react-dropzone": "14.2.3", "react-ga4": "2.1.0", - "react-portal": "4.2.2", "react-redux": "8.0.5", "react-router-dom": "6.22.3", "react-storage-hooks": "4.0.1", @@ -110,7 +109,6 @@ "@types/pluralize": "0.0.33", "@types/react": "18.2.73", "@types/react-dom": "18.2.23", - "@types/react-portal": "4.0.7", "@types/react-redux": "7.1.33", "@types/react-router": "5.1.20", "@types/react-router-dom": "5.3.3", diff --git a/src/app/base/components/NodeConfigurationFields/NodeConfigurationFields.tsx b/src/app/base/components/NodeConfigurationFields/NodeConfigurationFields.tsx index 819d4f9206d..d6b5bd3af3f 100644 --- a/src/app/base/components/NodeConfigurationFields/NodeConfigurationFields.tsx +++ b/src/app/base/components/NodeConfigurationFields/NodeConfigurationFields.tsx @@ -2,8 +2,8 @@ import { useState } from "react"; import { Col, Modal, Row, Textarea } from "@canonical/react-components"; import { useFormikContext } from "formik"; -import { Portal } from "react-portal"; import { useSelector } from "react-redux"; +import usePortal from "react-useportal"; import * as Yup from "yup"; import type { SchemaOf } from "yup"; @@ -31,11 +31,11 @@ export const NodeConfigurationSchema: SchemaOf = .defined(); const NodeConfigurationFields = (): JSX.Element => { + const { openPortal, closePortal, isOpen, Portal, ref } = usePortal(); const { setFieldValue, values } = useFormikContext(); const selectedTags = useSelector((state: RootState) => tagSelectors.getByIDs(state, values.tags) ); - const [isOpen, setIsOpen] = useState(false); const [newTagName, setNewTagName] = useState(null); const manualTags = useSelector(tagSelectors.getManual); @@ -50,6 +50,7 @@ const NodeConfigurationFields = (): JSX.Element => { name="description" /> tag.definition.length > 0 )} @@ -57,7 +58,7 @@ const NodeConfigurationFields = (): JSX.Element => { name="tags" onAddNewTag={(name) => { setNewTagName(name); - setIsOpen(true); + openPortal(); }} placeholder="Create or remove tags" tagList={manualTags} @@ -68,7 +69,7 @@ const NodeConfigurationFields = (): JSX.Element => { setIsOpen(false)} + close={() => closePortal()} title={Label.AddTag} > { onTagCreated={(tag) => { setFieldValue("tags", values.tags.concat([tag.id])); setNewTagName(null); - setIsOpen(false); + closePortal(); }} /> diff --git a/src/app/base/components/TagSelector/TagSelector.tsx b/src/app/base/components/TagSelector/TagSelector.tsx index 0d7cffac7af..6a64543b966 100644 --- a/src/app/base/components/TagSelector/TagSelector.tsx +++ b/src/app/base/components/TagSelector/TagSelector.tsx @@ -13,6 +13,7 @@ export type Tag = { }; export type Props = { + addTagRef?: React.RefObject; allowNewTags?: boolean; disabled?: boolean; error?: string; @@ -66,6 +67,7 @@ const generateDropdownItems = ({ tags, updateTags, generateDropdownEntry, + addTagRef, }: { allowNewTags: Props["allowNewTags"]; onAddNewTag: Props["onAddNewTag"]; @@ -75,6 +77,7 @@ const generateDropdownItems = ({ tags: Tag[]; updateTags: UpdateTags; generateDropdownEntry: Props["generateDropdownEntry"]; + addTagRef?: React.RefObject; }): JSX.Element[] => { const dropdownItems = []; if ( @@ -86,7 +89,7 @@ const generateDropdownItems = ({ // Insert an extra item for creating a new tag if allowed and filter is not // an already existing tag const newTagItem = ( -
  • +