mirror of
https://github.com/mastodon/mastodon.git
synced 2024-12-18 15:48:22 +00:00
Update directory page options to use URL params (#31977)
This commit is contained in:
parent
57a38f071b
commit
ae03e4ffc6
31
app/javascript/hooks/useSearchParam.ts
Normal file
31
app/javascript/hooks/useSearchParam.ts
Normal 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;
|
||||||
|
}
|
|
@ -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 a new issue