Update directory page options to use URL params (#31977)

This commit is contained in:
Renaud Chaput 2024-09-19 17:34:08 +02:00 committed by GitHub
parent 57a38f071b
commit ae03e4ffc6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 51 additions and 15 deletions

View file

@ -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;
}

View file

@ -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(() => {