From 00a614f47c829f9c6bdca87ca48da4ec758e2127 Mon Sep 17 00:00:00 2001 From: "Kevin T. Coughlin" <706967+KevinTCoughlin@users.noreply.github.com> Date: Sun, 19 Jan 2025 02:58:27 +0000 Subject: [PATCH 1/2] Dispose of Async instance to prevent memory leak --- src/controls/sitePicker/SitePicker.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/controls/sitePicker/SitePicker.tsx b/src/controls/sitePicker/SitePicker.tsx index e235a6d8b..edf957dd2 100644 --- a/src/controls/sitePicker/SitePicker.tsx +++ b/src/controls/sitePicker/SitePicker.tsx @@ -67,7 +67,11 @@ const styles = mergeStyleSets({ }, }); -const async = new Async(); +useEffect(() => { + return () => { + async.dispose(); + }; +}, []); export const SitePicker: React.FunctionComponent = ( props: React.PropsWithChildren From b6a716ad186271e275adcf73f055a6ecfe4e46fe Mon Sep 17 00:00:00 2001 From: "Kevin T. Coughlin" <706967+KevinTCoughlin@users.noreply.github.com> Date: Sat, 1 Mar 2025 18:55:03 +0000 Subject: [PATCH 2/2] Prefer useAsync for automatic disposal --- src/controls/sitePicker/SitePicker.tsx | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/controls/sitePicker/SitePicker.tsx b/src/controls/sitePicker/SitePicker.tsx index edf957dd2..034d6a439 100644 --- a/src/controls/sitePicker/SitePicker.tsx +++ b/src/controls/sitePicker/SitePicker.tsx @@ -13,8 +13,7 @@ import { SelectableOptionMenuItemType, Icon } from '@fluentui/react'; - -import { Async } from '@uifabric/utilities/lib/Async'; +import { useAsync } from '@fluentui/react-hooks'; import * as telemetry from '../../common/telemetry'; import { toRelativeUrl } from '../../common/utilities/GeneralHelper'; @@ -67,12 +66,6 @@ const styles = mergeStyleSets({ }, }); -useEffect(() => { - return () => { - async.dispose(); - }; -}, []); - export const SitePicker: React.FunctionComponent = ( props: React.PropsWithChildren ) => { @@ -103,6 +96,7 @@ export const SitePicker: React.FunctionComponent = ( const [allSites, setAllSites] = React.useState(); const [filteredSites, setFilteredSites] = React.useState(); const [searchQuery, setSearchQuery] = React.useState(); + const async = useAsync(); const onSearchChange = React.useCallback( (e, newSearchQuery: string) => {