|
import moment from 'moment'; |
|
import { useQueryParams } from 'hooks/useQueryParams'; |
|
import type { QueryParams } from './query-params'; |
|
import { identity } from 'lodash'; |
|
import { createSafeQueryParam } from './create-safe-query-param'; |
|
import { z } from 'zod'; |
|
|
|
const periodSchema = z.enum(['today', 'yesterday', 'this_week', 'this_month', 'last_3_months']); |
|
const dateSchema = z.date(); |
|
|
|
export function Period() { |
|
const queryParams = useQueryParams<QueryParams>(); |
|
|
|
const periodQueryParam = createSafeQueryParam<PeriodPreset>({ |
|
serialize: identity, |
|
deserialize: identity, |
|
getUnsafeQueryParam: () => queryParams.value.period, |
|
parse: (unsafeValue) => periodSchema.parse(unsafeValue), |
|
onParseError: onPeriodReset, |
|
}); |
|
|
|
const fromQueryParam = createSafeQueryParam<Date>({ |
|
serialize: serializeDate, |
|
deserialize: deserializeDate, |
|
getUnsafeQueryParam: () => queryParams.value.from, |
|
parse: (unsafeValue) => dateSchema.parse(unsafeValue), |
|
onParseError: resetRange, |
|
}); |
|
|
|
const toQueryParam = createSafeQueryParam<Date>({ |
|
serialize: serializeDate, |
|
deserialize: deserializeDate, |
|
getUnsafeQueryParam: () => queryParams.value.to, |
|
parse: (unsafeValue) => dateSchema.parse(unsafeValue), |
|
onParseError: resetRange, |
|
}); |
|
|
|
function resetRange() { |
|
queryParams.set({ from: undefined, to: undefined }); |
|
} |
|
|
|
function onPeriodReset() { |
|
queryParams.set({ from: undefined, to: undefined, period: undefined }); |
|
} |
|
|
|
return 'JSX'; |
|
} |
|
|
|
const dateFormat = 'YYYY-MM-DD'; |
|
|
|
function serializeDate(payload: Date) { |
|
return moment(payload).format(dateFormat); |
|
} |
|
|
|
function deserializeDate(payload: string) { |
|
return moment(payload, dateFormat).toDate(); |
|
} |