Update directory page options to use URL params (#31977)
This commit is contained in:
		
							parent
							
								
									57a38f071b
								
							
						
					
					
						commit
						ae03e4ffc6
					
				| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					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;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
import type { ChangeEventHandler } from 'react';
 | 
					import type { ChangeEventHandler } from 'react';
 | 
				
			||||||
import { useCallback, useEffect, useRef, useState } from 'react';
 | 
					import { useCallback, useEffect, useRef } from 'react';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { defineMessages, useIntl } from 'react-intl';
 | 
					import { defineMessages, useIntl } from 'react-intl';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,8 @@ import { RadioButton } from 'mastodon/components/radio_button';
 | 
				
			||||||
import ScrollContainer from 'mastodon/containers/scroll_container';
 | 
					import ScrollContainer from 'mastodon/containers/scroll_container';
 | 
				
			||||||
import { useAppDispatch, useAppSelector } from 'mastodon/store';
 | 
					import { useAppDispatch, useAppSelector } from 'mastodon/store';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { useSearchParam } from '../../../hooks/useSearchParam';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { AccountCard } from './components/account_card';
 | 
					import { AccountCard } from './components/account_card';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const messages = defineMessages({
 | 
					const messages = defineMessages({
 | 
				
			||||||
| 
						 | 
					@ -47,18 +49,19 @@ export const Directory: React.FC<{
 | 
				
			||||||
  const intl = useIntl();
 | 
					  const intl = useIntl();
 | 
				
			||||||
  const dispatch = useAppDispatch();
 | 
					  const dispatch = useAppDispatch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [state, setState] = useState<{
 | 
					 | 
				
			||||||
    order: string | null;
 | 
					 | 
				
			||||||
    local: boolean | null;
 | 
					 | 
				
			||||||
  }>({
 | 
					 | 
				
			||||||
    order: null,
 | 
					 | 
				
			||||||
    local: null,
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  const column = useRef<Column>(null);
 | 
					  const column = useRef<Column>(null);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const order = state.order ?? params?.order ?? 'active';
 | 
					  const [orderParam, setOrderParam] = useSearchParam('order');
 | 
				
			||||||
  const local = state.local ?? params?.local ?? false;
 | 
					  const [localParam, setLocalParam] = useSearchParam('local');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let localParamBool: boolean | undefined;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (localParam === 'false') {
 | 
				
			||||||
 | 
					    localParamBool = false;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const order = orderParam ?? params?.order ?? 'active';
 | 
				
			||||||
 | 
					  const local = localParamBool ?? params?.local ?? true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const handlePin = useCallback(() => {
 | 
					  const handlePin = useCallback(() => {
 | 
				
			||||||
    if (columnId) {
 | 
					    if (columnId) {
 | 
				
			||||||
| 
						 | 
					@ -101,10 +104,10 @@ export const Directory: React.FC<{
 | 
				
			||||||
      if (columnId) {
 | 
					      if (columnId) {
 | 
				
			||||||
        dispatch(changeColumnParams(columnId, ['order'], e.target.value));
 | 
					        dispatch(changeColumnParams(columnId, ['order'], e.target.value));
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        setState((s) => ({ order: e.target.value, local: s.local }));
 | 
					        setOrderParam(e.target.value);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    [dispatch, columnId],
 | 
					    [dispatch, columnId, setOrderParam],
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const handleChangeLocal = useCallback<ChangeEventHandler<HTMLInputElement>>(
 | 
					  const handleChangeLocal = useCallback<ChangeEventHandler<HTMLInputElement>>(
 | 
				
			||||||
| 
						 | 
					@ -113,11 +116,13 @@ export const Directory: React.FC<{
 | 
				
			||||||
        dispatch(
 | 
					        dispatch(
 | 
				
			||||||
          changeColumnParams(columnId, ['local'], e.target.value === '1'),
 | 
					          changeColumnParams(columnId, ['local'], e.target.value === '1'),
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					      } else if (e.target.value === '1') {
 | 
				
			||||||
 | 
					        setLocalParam('true');
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        setState((s) => ({ local: e.target.value === '1', order: s.order }));
 | 
					        setLocalParam('false');
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    [dispatch, columnId],
 | 
					    [dispatch, columnId, setLocalParam],
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const handleLoadMore = useCallback(() => {
 | 
					  const handleLoadMore = useCallback(() => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue