91 lines
2.2 KiB
TypeScript
91 lines
2.2 KiB
TypeScript
"use client";
|
|
|
|
import { usePathname, useRouter, useSearchParams } from "next/navigation";
|
|
import { useCallback, useMemo } from "react";
|
|
|
|
import {
|
|
formatPeriod,
|
|
formatPeriodForUrl,
|
|
formatPeriodParam,
|
|
MONTH_NAMES,
|
|
parsePeriodParam,
|
|
} from "@/lib/utils/period";
|
|
|
|
const PERIOD_PARAM = "periodo";
|
|
|
|
export function useMonthPeriod() {
|
|
const searchParams = useSearchParams();
|
|
const pathname = usePathname();
|
|
const router = useRouter();
|
|
|
|
const periodFromParams = searchParams.get(PERIOD_PARAM);
|
|
const referenceDate = useMemo(() => new Date(), []);
|
|
const defaultPeriod = useMemo(
|
|
() =>
|
|
formatPeriod(referenceDate.getFullYear(), referenceDate.getMonth() + 1),
|
|
[referenceDate],
|
|
);
|
|
const { period, monthName, year } = useMemo(
|
|
() => parsePeriodParam(periodFromParams, referenceDate),
|
|
[periodFromParams, referenceDate],
|
|
);
|
|
const defaultMonth = useMemo(
|
|
() => MONTH_NAMES[referenceDate.getMonth()] ?? "",
|
|
[referenceDate],
|
|
);
|
|
const defaultYear = useMemo(
|
|
() => referenceDate.getFullYear().toString(),
|
|
[referenceDate],
|
|
);
|
|
|
|
const buildHref = useCallback(
|
|
(targetPeriod: string) => {
|
|
const params = new URLSearchParams(searchParams.toString());
|
|
params.set(PERIOD_PARAM, formatPeriodForUrl(targetPeriod));
|
|
|
|
return `${pathname}?${params.toString()}`;
|
|
},
|
|
[pathname, searchParams],
|
|
);
|
|
|
|
const buildHrefFromMonth = useCallback(
|
|
(month: string, nextYear: string | number) => {
|
|
const parsedYear = Number.parseInt(String(nextYear).trim(), 10);
|
|
if (Number.isNaN(parsedYear)) {
|
|
return buildHref(defaultPeriod);
|
|
}
|
|
|
|
const param = formatPeriodParam(month, parsedYear);
|
|
const parsed = parsePeriodParam(param, referenceDate);
|
|
return buildHref(parsed.period);
|
|
},
|
|
[buildHref, defaultPeriod, referenceDate],
|
|
);
|
|
|
|
const replacePeriod = useCallback(
|
|
(targetPeriod: string) => {
|
|
if (!targetPeriod) {
|
|
return;
|
|
}
|
|
|
|
router.replace(buildHref(targetPeriod), { scroll: false });
|
|
},
|
|
[buildHref, router],
|
|
);
|
|
|
|
return {
|
|
pathname,
|
|
period,
|
|
currentMonth: monthName,
|
|
currentYear: year.toString(),
|
|
defaultPeriod,
|
|
defaultMonth,
|
|
defaultYear,
|
|
buildHref,
|
|
buildHrefFromMonth,
|
|
replacePeriod,
|
|
};
|
|
}
|
|
|
|
export { PERIOD_PARAM as MONTH_PERIOD_PARAM };
|