32 lines
		
	
	
		
			779 B
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			779 B
		
	
	
	
		
			TypeScript
		
	
	
	
| import { useMemo, useCallback } from 'react';
 | |
| 
 | |
| import { useLocation, useHistory } from 'react-router';
 | |
| 
 | |
| export function useSearchParams() {
 | |
|   const { search } = useLocation();
 | |
| 
 | |
|   return useMemo(() => new URLSearchParams(search), [search]);
 | |
| }
 | |
| 
 | |
| export function useSearchParam(name: string, defaultValue?: string) {
 | |
|   const searchParams = useSearchParams();
 | |
|   const history = useHistory();
 | |
| 
 | |
|   const value = searchParams.get(name) ?? defaultValue;
 | |
| 
 | |
|   const setValue = useCallback(
 | |
|     (value: string | null) => {
 | |
|       if (value === null) {
 | |
|         searchParams.delete(name);
 | |
|       } else {
 | |
|         searchParams.set(name, value);
 | |
|       }
 | |
| 
 | |
|       history.push({ search: searchParams.toString() });
 | |
|     },
 | |
|     [history, name, searchParams],
 | |
|   );
 | |
| 
 | |
|   return [value, setValue] as const;
 | |
| }
 |