37 lines
1.0 KiB
TypeScript
37 lines
1.0 KiB
TypeScript
import { useEffect, useState } from "react";
|
|
import { useSearchParams } from "react-router";
|
|
|
|
import { defaultPeriod, isValidPeriod } from "./calendar";
|
|
|
|
function useUrlPeriod() {
|
|
const [parameters, setParameters] = useSearchParams();
|
|
const from = parameters.get("from");
|
|
const to = parameters.get("to");
|
|
const isValid = isValidPeriod(from, to);
|
|
const hasPeriod = from !== null || to !== null;
|
|
const [[defaultFrom, defaultTo]] = useState<[string, string]>(defaultPeriod);
|
|
|
|
const resolve = (value: null | string, fallback: string) => {
|
|
if (!isValid) return null;
|
|
|
|
return hasPeriod ? value : fallback;
|
|
};
|
|
|
|
useEffect(() => {
|
|
if (isValid || (!parameters.has("from") && !parameters.has("to"))) return;
|
|
const normalized = new URLSearchParams(parameters);
|
|
normalized.delete("from");
|
|
normalized.delete("to");
|
|
setParameters(normalized, { replace: true });
|
|
}, [isValid, parameters, setParameters]);
|
|
|
|
return {
|
|
from: resolve(from, defaultFrom),
|
|
parameters,
|
|
setParameters,
|
|
to: resolve(to, defaultTo),
|
|
};
|
|
}
|
|
|
|
export { useUrlPeriod };
|