|
1 | 1 | <script lang="ts">
|
| 2 | + import { untrack } from 'svelte'; |
| 3 | + import { queryParameters, ssp } from 'sveltekit-search-params'; |
| 4 | + import type { DateRange } from 'bits-ui'; |
| 5 | + import { DateFormatter, getLocalTimeZone, fromAbsolute } from '@internationalized/date'; |
| 6 | +
|
2 | 7 | import {
|
3 | 8 | DATE_RANGE_PARAM,
|
4 | 9 | DATE_RANGES,
|
|
11 | 16 | import { Button } from '$lib/components/ui/button';
|
12 | 17 | import { Popover, PopoverContent, PopoverTrigger } from '$lib/components/ui/popover';
|
13 | 18 | import IconCalendarDateRange from '~icons/heroicons/calendar-date-range-16-solid';
|
14 |
| - import type { DateRange } from 'bits-ui'; |
15 |
| - import { DateFormatter, getLocalTimeZone, fromAbsolute } from '@internationalized/date'; |
| 19 | +
|
16 | 20 | import { cn } from '$lib/utils';
|
17 | 21 | import { RangeCalendar } from '$lib/components/ui/range-calendar/index';
|
18 |
| - import { goto } from '$app/navigation'; |
19 | 22 | import { page } from '$app/stores';
|
20 |
| - import { untrack } from 'svelte'; |
21 | 23 | import { parseDateRangeParams } from '$lib/util/date-ranges';
|
22 | 24 |
|
| 25 | + const params = queryParameters( |
| 26 | + { |
| 27 | + [DATE_RANGE_PARAM]: ssp.string(), |
| 28 | + [DATE_RANGE_START_PARAM]: ssp.number(), |
| 29 | + [DATE_RANGE_END_PARAM]: ssp.number() |
| 30 | + }, |
| 31 | + { pushHistory: false, showDefaults: false } |
| 32 | + ); |
| 33 | +
|
23 | 34 | const df = new DateFormatter('en-US', {
|
24 | 35 | dateStyle: 'medium'
|
25 | 36 | });
|
|
42 | 53 | if (newSelectedDateRange && newSelectedDateRange.start && newSelectedDateRange.end) {
|
43 | 54 | const startDate = newSelectedDateRange.start.toDate(getLocalTimeZone()).getTime();
|
44 | 55 | const endDate = newSelectedDateRange.end.toDate(getLocalTimeZone()).getTime();
|
45 |
| - updateURLParams(CUSTOM, startDate.toString(), endDate.toString()); |
| 56 | + updateURLParams(CUSTOM, startDate, endDate); |
46 | 57 | calendarDateRangePopoverOpen = false;
|
47 | 58 | }
|
48 | 59 | }
|
49 | 60 |
|
50 |
| - function updateURLParams(range: string, start?: string, end?: string) { |
51 |
| - const url = new URL($page.url); |
52 |
| - url.searchParams.set(DATE_RANGE_PARAM, range); |
| 61 | + function updateURLParams(range: string, start?: number, end?: number) { |
| 62 | + params[DATE_RANGE_PARAM] = range; |
53 | 63 |
|
54 | 64 | if (range === CUSTOM && start && end) {
|
55 |
| - url.searchParams.set(DATE_RANGE_START_PARAM, start); |
56 |
| - url.searchParams.set(DATE_RANGE_END_PARAM, end); |
| 65 | + params[DATE_RANGE_START_PARAM] = start; |
| 66 | + params[DATE_RANGE_END_PARAM] = end; |
57 | 67 | } else {
|
58 |
| - url.searchParams.delete(DATE_RANGE_START_PARAM); |
59 |
| - url.searchParams.delete(DATE_RANGE_END_PARAM); |
| 68 | + params[DATE_RANGE_START_PARAM] = null; |
| 69 | + params[DATE_RANGE_END_PARAM] = null; |
60 | 70 | }
|
61 |
| -
|
62 |
| - goto(url.toString(), { replaceState: true }); |
63 | 71 | }
|
64 | 72 |
|
65 | 73 | $effect(() => {
|
|
68 | 76 | const { dateRangeValue, startTimestamp, endTimestamp } = parseDateRangeParams(
|
69 | 77 | url.searchParams
|
70 | 78 | );
|
| 79 | + // console.log({ dateRangeValue, startTimestamp, endTimestamp }); |
| 80 | + // console.log(JSON.parse(JSON.stringify(params))); |
| 81 | +
|
| 82 | + // TODO: Use `params` and handle converting non-custom ranges (ex. "Past 1 Month") |
71 | 83 | selectDateRange = getDateRangeByValue(dateRangeValue);
|
72 | 84 | calendarDateRange = {
|
73 | 85 | start: fromAbsolute(Number(startTimestamp), getLocalTimeZone()),
|
74 | 86 | end: fromAbsolute(Number(endTimestamp), getLocalTimeZone())
|
75 | 87 | };
|
| 88 | +
|
| 89 | + // selectDateRange = getDateRangeByValue(params[DATE_RANGE_PARAM]); |
| 90 | + // calendarDateRange = { |
| 91 | + // start: fromAbsolute(params[DATE_RANGE_START_PARAM], getLocalTimeZone()), |
| 92 | + // end: fromAbsolute(params[DATE_RANGE_END_PARAM], getLocalTimeZone()) |
| 93 | + // }; |
76 | 94 | });
|
77 | 95 | });
|
78 | 96 |
|
|
0 commit comments