mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: move recording recently visited into separate component (#7494)
This commit is contained in:
		
							parent
							
								
									93eb642f2f
								
							
						
					
					
						commit
						20da40d38d
					
				| @ -14,7 +14,6 @@ import { useKeyboardShortcut } from 'hooks/useKeyboardShortcut'; | ||||
| import { SEARCH_INPUT } from 'utils/testIds'; | ||||
| import { useOnClickOutside } from 'hooks/useOnClickOutside'; | ||||
| import { useOnBlur } from 'hooks/useOnBlur'; | ||||
| import { useRecentlyVisited } from 'hooks/useRecentlyVisited'; | ||||
| import { | ||||
|     CommandResultGroup, | ||||
|     type CommandResultGroupItem, | ||||
| @ -27,6 +26,7 @@ import { CommandFeatures } from './CommandFeatures'; | ||||
| import { usePlausibleTracker } from 'hooks/usePlausibleTracker'; | ||||
| import { CommandRecent } from './CommandRecent'; | ||||
| import { CommandPages } from './CommandPages'; | ||||
| import { RecentlyVisitedRecorder } from './RecentlyVisitedRecorder'; | ||||
| 
 | ||||
| export const CommandResultsPaper = styled(Paper)(({ theme }) => ({ | ||||
|     position: 'absolute', | ||||
| @ -110,7 +110,6 @@ export const CommandBar = () => { | ||||
|     >([]); | ||||
|     const [searchedFlagCount, setSearchedFlagCount] = useState(0); | ||||
|     const [value, setValue] = useState<string>(''); | ||||
|     const { lastVisited } = useRecentlyVisited(); | ||||
|     const { routes } = useRoutes(); | ||||
|     const allRoutes: Record<string, IPageRouteInfo> = {}; | ||||
|     for (const route of [ | ||||
| @ -200,6 +199,7 @@ export const CommandBar = () => { | ||||
| 
 | ||||
|     return ( | ||||
|         <StyledContainer ref={searchContainerRef} active={showSuggestions}> | ||||
|             <RecentlyVisitedRecorder /> | ||||
|             <StyledSearch> | ||||
|                 <SearchIcon | ||||
|                     sx={{ | ||||
| @ -266,10 +266,7 @@ export const CommandBar = () => { | ||||
|                 elseShow={ | ||||
|                     showSuggestions && ( | ||||
|                         <CommandResultsPaper> | ||||
|                             <CommandRecent | ||||
|                                 lastVisited={lastVisited} | ||||
|                                 routes={allRoutes} | ||||
|                             /> | ||||
|                             <CommandRecent routes={allRoutes} /> | ||||
|                             <CommandPageSuggestions routes={allRoutes} /> | ||||
|                         </CommandResultsPaper> | ||||
|                     ) | ||||
|  | ||||
| @ -5,7 +5,10 @@ import { | ||||
|     RecentlyVisitedProjectButton, | ||||
| } from './RecentlyVisited/CommandResultGroup'; | ||||
| import { List } from '@mui/material'; | ||||
| import type { LastViewedPage } from 'hooks/useRecentlyVisited'; | ||||
| import { | ||||
|     useRecentlyVisited, | ||||
|     type LastViewedPage, | ||||
| } from 'hooks/useRecentlyVisited'; | ||||
| 
 | ||||
| const toListItemButton = ( | ||||
|     item: LastViewedPage, | ||||
| @ -38,12 +41,11 @@ const toListItemButton = ( | ||||
| }; | ||||
| 
 | ||||
| export const CommandRecent = ({ | ||||
|     lastVisited, | ||||
|     routes, | ||||
| }: { | ||||
|     lastVisited: LastViewedPage[]; | ||||
|     routes: Record<string, { path: string; route: string; title: string }>; | ||||
| }) => { | ||||
|     const { lastVisited } = useRecentlyVisited(); | ||||
|     const buttons = lastVisited.map((item, index) => | ||||
|         toListItemButton(item, routes, index), | ||||
|     ); | ||||
|  | ||||
| @ -0,0 +1,31 @@ | ||||
| import { useRecentlyVisited } from 'hooks/useRecentlyVisited'; | ||||
| import { useLocation, useMatch } from 'react-router-dom'; | ||||
| import { routes } from 'component/menu/routes'; | ||||
| import { useEffect } from 'react'; | ||||
| 
 | ||||
| export const RecentlyVisitedRecorder = () => { | ||||
|     const { setLastVisited } = useRecentlyVisited(); | ||||
|     const featureMatch = useMatch('/projects/:projectId/features/:featureId'); | ||||
|     const projectMatch = useMatch('/projects/:projectId'); | ||||
| 
 | ||||
|     const location = useLocation(); | ||||
| 
 | ||||
|     useEffect(() => { | ||||
|         if (!location.pathname) return; | ||||
| 
 | ||||
|         const path = routes.find((r) => r.path === location.pathname); | ||||
|         if (path) { | ||||
|             setLastVisited({ pathName: path.path }); | ||||
|         } else if (featureMatch?.params.featureId) { | ||||
|             setLastVisited({ | ||||
|                 featureId: featureMatch?.params.featureId, | ||||
|                 projectId: featureMatch?.params.projectId, | ||||
|             }); | ||||
|         } else if (projectMatch?.params.projectId) { | ||||
|             setLastVisited({ | ||||
|                 projectId: projectMatch?.params.projectId, | ||||
|             }); | ||||
|         } | ||||
|     }, [location, featureMatch, projectMatch]); | ||||
|     return <></>; | ||||
| }; | ||||
| @ -9,11 +9,13 @@ import { | ||||
|     createMemoryRouter, | ||||
| } from 'react-router-dom'; | ||||
| import { useRecentlyVisited } from './useRecentlyVisited'; | ||||
| import { RecentlyVisitedRecorder } from 'component/commandBar/RecentlyVisitedRecorder'; | ||||
| 
 | ||||
| const RouteNameRender: FC<{}> = () => { | ||||
|     const { lastVisited } = useRecentlyVisited(); | ||||
|     return ( | ||||
|         <div> | ||||
|             <RecentlyVisitedRecorder /> | ||||
|             {lastVisited.map((visited) => ( | ||||
|                 <div>{visited.pathName}</div> | ||||
|             ))} | ||||
| @ -34,14 +36,22 @@ test('checks that routes that exist in routes.ts gets added to lastVisited', asy | ||||
|                 <Route path='/search' element={<Navigate to={'/unknown1'} />} /> | ||||
|                 <Route | ||||
|                     path='/unknown1' | ||||
|                     element={<Navigate to={'/integrations'} />} | ||||
|                 /> | ||||
|                 <Route | ||||
|                     path='/integrations' | ||||
|                     element={<Navigate to={'/unknown2'} />} | ||||
|                 /> | ||||
|                 <Route | ||||
|                     path='/unknown2' | ||||
|                     element={<Navigate to={'/integrations'} />} | ||||
|                 /> | ||||
|                 <Route | ||||
|                     path='/integrations' | ||||
|                     element={<Navigate to={'/unknown3'} />} | ||||
|                 /> | ||||
|                 <Route | ||||
|                     path='/unknown3' | ||||
|                     element={<Navigate to={'/unknown4'} />} | ||||
|                 /> | ||||
|                 <Route | ||||
|                     path='/unknown4' | ||||
|                     element={<Navigate to={'/segments'} />} | ||||
|                 /> | ||||
|                 <Route path='/segments' element={<div>segment div</div>} /> | ||||
|  | ||||
| @ -1,6 +1,4 @@ | ||||
| import { useCallback, useEffect, useState } from 'react'; | ||||
| import { useLocation, useMatch } from 'react-router-dom'; | ||||
| import { routes } from 'component/menu/routes'; | ||||
| import { getLocalStorageItem, setLocalStorageItem } from '../utils/storage'; | ||||
| import { basePath } from 'utils/formatPath'; | ||||
| import { useCustomEvent } from './useCustomEvent'; | ||||
| @ -20,8 +18,6 @@ const localStorageItems = (key: string): LastViewedPage[] => { | ||||
| 
 | ||||
| export const useRecentlyVisited = () => { | ||||
|     const key = `${basePath}:unleash-lastVisitedPages`; | ||||
|     const featureMatch = useMatch('/projects/:projectId/features/:featureId'); | ||||
|     const projectMatch = useMatch('/projects/:projectId'); | ||||
| 
 | ||||
|     const [lastVisited, setLastVisited] = useState<LastViewedPage[]>( | ||||
|         localStorageItems(key), | ||||
| @ -34,26 +30,6 @@ export const useRecentlyVisited = () => { | ||||
|         }, | ||||
|     ); | ||||
| 
 | ||||
|     const location = useLocation(); | ||||
| 
 | ||||
|     useEffect(() => { | ||||
|         if (!location.pathname) return; | ||||
| 
 | ||||
|         const path = routes.find((r) => r.path === location.pathname); | ||||
|         if (path) { | ||||
|             setCappedLastVisited({ pathName: path.path }); | ||||
|         } else if (featureMatch?.params.featureId) { | ||||
|             setCappedLastVisited({ | ||||
|                 featureId: featureMatch?.params.featureId, | ||||
|                 projectId: featureMatch?.params.projectId, | ||||
|             }); | ||||
|         } else if (projectMatch?.params.projectId) { | ||||
|             setCappedLastVisited({ | ||||
|                 projectId: projectMatch?.params.projectId, | ||||
|             }); | ||||
|         } | ||||
|     }, [location, featureMatch, projectMatch]); | ||||
| 
 | ||||
|     useEffect(() => { | ||||
|         if (lastVisited) { | ||||
|             setLocalStorageItem(key, lastVisited); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user