diff --git a/src/apps/experimental/components/AppToolbar/menus/SyncPlayMenu.tsx b/src/apps/experimental/components/AppToolbar/menus/SyncPlayMenu.tsx index 1163a9252..6e08b3fea 100644 --- a/src/apps/experimental/components/AppToolbar/menus/SyncPlayMenu.tsx +++ b/src/apps/experimental/components/AppToolbar/menus/SyncPlayMenu.tsx @@ -19,6 +19,7 @@ import React, { FC, useCallback, useEffect, useState } from 'react'; import { pluginManager } from 'components/pluginManager'; import { useApi } from 'hooks/useApi'; +import { useSyncPlayGroups } from 'hooks/useSyncPlayGroups'; import globalize from 'scripts/globalize'; import { PluginType } from 'types/plugin'; import Events from 'utils/events'; @@ -47,7 +48,6 @@ const SyncPlayMenu: FC = ({ }) => { const [ syncPlay, setSyncPlay ] = useState(); const { __legacyApiClient__, api, user } = useApi(); - const [ groups, setGroups ] = useState([]); const [ currentGroup, setCurrentGroup ] = useState(); const isSyncPlayEnabled = Boolean(currentGroup); @@ -55,25 +55,7 @@ const SyncPlayMenu: FC = ({ setSyncPlay(pluginManager.firstOfType(PluginType.SyncPlay)?.instance); }, []); - useEffect(() => { - let isMounted = true; - - const fetchGroups = async () => { - if (api) { - const response = await getSyncPlayApi(api).syncPlayGetGroups(); - if (isMounted) setGroups(response.data); - } - }; - - fetchGroups() - .catch(err => { - console.error('[SyncPlayMenu] unable to fetch SyncPlay groups', err); - }); - - return () => { - isMounted = false; - }; - }, [ api ]); + const { data: groups } = useSyncPlayGroups(); const onGroupAddClick = useCallback(() => { if (api && user) { @@ -231,7 +213,7 @@ const SyncPlayMenu: FC = ({ /> ); - } else if (groups.length === 0 && user?.Policy?.SyncPlayAccess !== SyncPlayUserAccessType.CreateAndJoinGroups) { + } else if (!groups?.length && user?.Policy?.SyncPlayAccess !== SyncPlayUserAccessType.CreateAndJoinGroups) { menuItems.push( @@ -241,7 +223,7 @@ const SyncPlayMenu: FC = ({ ); } else { - if (groups.length > 0) { + if (groups && groups.length > 0) { groups.forEach(group => { menuItems.push( { + const { api } = currentApi; + if (!api) throw new Error('No API instance available'); + + const response = await getSyncPlayApi(api) + .syncPlayGetGroups(options); + return response.data; +}; + +export const useSyncPlayGroups = () => { + const currentApi = useApi(); + return useQuery({ + queryKey: [ 'SyncPlay', 'Groups' ], + queryFn: ({ signal }) => fetchSyncPlayGroups(currentApi, { signal }) + }); +};