add own version of the DateParm

This commit is contained in:
Dawid Wysokiński 2021-01-01 14:28:03 +01:00
parent 3e87c42e0b
commit f708dd6c51
3 changed files with 75 additions and 10 deletions

View File

@ -4,7 +4,6 @@ import {
NumberParam, NumberParam,
withDefault, withDefault,
StringParam, StringParam,
DateParam,
} from 'use-query-params'; } from 'use-query-params';
import { useDebouncedCallback } from 'use-debounce'; import { useDebouncedCallback } from 'use-debounce';
import useDateUtils from '@libs/date/useDateUtils'; import useDateUtils from '@libs/date/useDateUtils';
@ -12,6 +11,7 @@ import useUpdateEffect from '@libs/useUpdateEffect';
import useScrollToElement from '@libs/useScrollToElement'; import useScrollToElement from '@libs/useScrollToElement';
import useServer from '@features/ServerPage/libs/ServerContext/useServer'; import useServer from '@features/ServerPage/libs/ServerContext/useServer';
import SortParam from '@libs/serialize-query-params/SortParam'; import SortParam from '@libs/serialize-query-params/SortParam';
import DateParam from '@libs/serialize-query-params/DateParam';
import useStats from './useStats'; import useStats from './useStats';
import { validateRowsPerPage } from '@common/Table/helpers'; import { validateRowsPerPage } from '@common/Table/helpers';
import { COLUMNS, LIMIT, DEFAULT_SORT } from './constants'; import { COLUMNS, LIMIT, DEFAULT_SORT } from './constants';
@ -35,13 +35,16 @@ function Ranking({ t }: Props) {
const classes = useStyles(); const classes = useStyles();
const server = useServer(); const server = useServer();
const dateUtils = useDateUtils(); const dateUtils = useDateUtils();
const defaultDate = useRef(dateUtils.date(server.historyUpdatedAt)); const dateParam = new DateParam({ dateUtils });
const defaultDate = useRef(
dateParam.newDecodedDate(dateUtils.date(server.historyUpdatedAt))
);
const [query, setQuery] = useQueryParams({ const [query, setQuery] = useQueryParams({
page: withDefault(NumberParam, 0), page: withDefault(NumberParam, 0),
limit: withDefault(NumberParam, LIMIT), limit: withDefault(NumberParam, LIMIT),
q: withDefault(StringParam, ''), q: withDefault(StringParam, ''),
sort: withDefault(SortParam, DEFAULT_SORT), sort: withDefault(SortParam, DEFAULT_SORT),
createDate: withDefault(DateParam, defaultDate.current), createDate: withDefault(dateParam, defaultDate.current),
}); });
const limit = validateRowsPerPage(query.limit); const limit = validateRowsPerPage(query.limit);
const [q, setQ] = useState(query.q); const [q, setQ] = useState(query.q);
@ -60,7 +63,7 @@ function Ranking({ t }: Props) {
server.key, server.key,
query.q, query.q,
query.sort.toString(), query.sort.toString(),
dateUtils.toJSON(query.createDate) query.createDate.server
); );
return ( return (
@ -69,7 +72,7 @@ function Ranking({ t }: Props) {
<DatePicker <DatePicker
size="small" size="small"
label={t('ranking.createDateInputLabel')} label={t('ranking.createDateInputLabel')}
value={query.createDate} value={query.createDate.display}
disableFuture disableFuture
variant="dialog" variant="dialog"
onChange={d => { onChange={d => {

View File

@ -4,7 +4,6 @@ import {
NumberParam, NumberParam,
withDefault, withDefault,
StringParam, StringParam,
DateParam,
} from 'use-query-params'; } from 'use-query-params';
import { useDebouncedCallback } from 'use-debounce'; import { useDebouncedCallback } from 'use-debounce';
import useDateUtils from '@libs/date/useDateUtils'; import useDateUtils from '@libs/date/useDateUtils';
@ -13,6 +12,7 @@ import useScrollToElement from '@libs/useScrollToElement';
import useServer from '@features/ServerPage/libs/ServerContext/useServer'; import useServer from '@features/ServerPage/libs/ServerContext/useServer';
import useStats from './useStats'; import useStats from './useStats';
import SortParam from '@libs/serialize-query-params/SortParam'; import SortParam from '@libs/serialize-query-params/SortParam';
import DateParam from '@libs/serialize-query-params/DateParam';
import { validateRowsPerPage } from '@common/Table/helpers'; import { validateRowsPerPage } from '@common/Table/helpers';
import * as ROUTES from '@config/routes'; import * as ROUTES from '@config/routes';
import { COLUMNS, LIMIT, DEFAULT_SORT } from './constants'; import { COLUMNS, LIMIT, DEFAULT_SORT } from './constants';
@ -36,13 +36,16 @@ function Ranking({ t }: Props) {
const classes = useStyles(); const classes = useStyles();
const server = useServer(); const server = useServer();
const dateUtils = useDateUtils(); const dateUtils = useDateUtils();
const defaultDate = useRef(dateUtils.date(server.historyUpdatedAt)); const dateParam = new DateParam({ dateUtils });
const defaultDate = useRef(
dateParam.newDecodedDate(dateUtils.date(server.historyUpdatedAt))
);
const [query, setQuery] = useQueryParams({ const [query, setQuery] = useQueryParams({
page: withDefault(NumberParam, 0), page: withDefault(NumberParam, 0),
limit: withDefault(NumberParam, LIMIT), limit: withDefault(NumberParam, LIMIT),
q: withDefault(StringParam, ''), q: withDefault(StringParam, ''),
sort: withDefault(SortParam, DEFAULT_SORT), sort: withDefault(SortParam, DEFAULT_SORT),
createDate: withDefault(DateParam, defaultDate.current), createDate: withDefault(dateParam, defaultDate.current),
}); });
const limit = validateRowsPerPage(query.limit); const limit = validateRowsPerPage(query.limit);
const [q, setQ] = useState(query.q); const [q, setQ] = useState(query.q);
@ -61,7 +64,7 @@ function Ranking({ t }: Props) {
server.key, server.key,
query.q, query.q,
query.sort.toString(), query.sort.toString(),
dateUtils.toJSON(query.createDate) query.createDate.server
); );
return ( return (
@ -70,7 +73,7 @@ function Ranking({ t }: Props) {
<DatePicker <DatePicker
size="small" size="small"
label={t('ranking.createDateInputLabel')} label={t('ranking.createDateInputLabel')}
value={query.createDate} value={query.createDate.display}
disableFuture disableFuture
variant="dialog" variant="dialog"
onChange={d => { onChange={d => {

View File

@ -0,0 +1,59 @@
import { QueryParamConfig } from 'use-query-params';
import DateUtils from '@libs/date/DateUtils';
import { getEncodedValue } from './helpers';
type Decoded = {
display: Date;
server: Date;
};
export default class DateParam
implements QueryParamConfig<Date, Decoded | undefined> {
private dateUtils: DateUtils;
constructor({ dateUtils }: { dateUtils: DateUtils }) {
this.dateUtils = dateUtils;
}
public newDecodedDate = (val: any): Decoded => {
return {
server: new Date(this.dateUtils.toJSON(new Date(val))),
display: this.dateUtils.date(val),
};
};
public encode = (
date: Date | null | undefined
): string | null | undefined => {
if (!date) {
return undefined;
}
return this.dateUtils.format(date, 'yyyy-MM-dd');
};
public decode = (
input: string | (string | null)[] | null | undefined
): Decoded | undefined => {
const dateString = getEncodedValue(input);
if (!dateString) return undefined;
const parts = dateString.split('-') as any;
// may only be a year so won't even have a month
if (parts[1] !== null) {
parts[1] -= 1; // Note: months are 0-based
} else {
// just a year, set the month and day to the first
parts[1] = 0;
parts[2] = 1;
}
const decoded = this.newDecodedDate(
new Date(...(parts as [number, number, number]))
);
if (isNaN(decoded.server.getTime()) || isNaN(decoded.server.getTime())) {
return undefined;
}
return decoded;
};
}