Skip to content

Commit 43494ce

Browse files
committed
add date ranges
1 parent ced7e47 commit 43494ce

File tree

1 file changed

+42
-39
lines changed

1 file changed

+42
-39
lines changed

apps/web/src/components/ui/date-range-picker.tsx

Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,36 @@ export function DateRangePicker({
3434
className,
3535
initialDateRange,
3636
}: DateRangePickerProps) {
37-
const [dateRange, setDateRange] = useState<DateRange>(initialDateRange)
37+
const [dateRange, setDateRange] = useState<DateRange>(initialDateRange || {
38+
from: startOfDay(new Date(new Date().setDate(new Date().getDate() - 7))),
39+
to: endOfDay(new Date())
40+
})
3841
const [isOpen, setIsOpen] = useState(false)
39-
const [tempDate, setTempDate] = useState<Date | null>(null)
42+
const [tempFrom, setTempFrom] = useState<Date | null>(null)
4043
const [compareLastPeriod, setCompareLastPeriod] = useState(false)
41-
const [fromInput, setFromInput] = useState(format(initialDateRange.from, "yyyy-MM-dd HH:mm:ss"))
42-
const [toInput, setToInput] = useState(format(initialDateRange.to, "yyyy-MM-dd HH:mm:ss"))
4344

4445
const handleRangeSelect = (range: DateRange | undefined) => {
45-
if (range?.from && range?.to) {
46-
setDateRange(range)
46+
if (!range?.from) return;
47+
48+
// If both dates are selected or no from date, start new selection
49+
if ((dateRange.from && dateRange.to) || !dateRange.from) {
50+
setDateRange({
51+
from: startOfDay(range.from),
52+
to: undefined
53+
} as DateRange);
54+
return;
4755
}
48-
}
56+
57+
// If only from is selected, set to date
58+
if (dateRange.from && !dateRange.to) {
59+
const newDate = range.to;
60+
setDateRange({
61+
from: dateRange.from,
62+
to: endOfDay(newDate)
63+
});
64+
return;
65+
}
66+
};
4967

5068
const handlePresetClick = (days: number) => {
5169
const to = new Date()
@@ -59,9 +77,7 @@ export function DateRangePicker({
5977
}
6078

6179
const handleFromChange = (e: React.ChangeEvent<HTMLInputElement>) => {
62-
const value = e.target.value
63-
setFromInput(value)
64-
80+
const value = e.target.value.replace('UTC ', '')
6581
const date = new Date(value)
6682
if (!isNaN(date.getTime())) {
6783
setDateRange(prev => ({
@@ -72,9 +88,7 @@ export function DateRangePicker({
7288
}
7389

7490
const handleToChange = (e: React.ChangeEvent<HTMLInputElement>) => {
75-
const value = e.target.value
76-
setToInput(value)
77-
91+
const value = e.target.value.replace('UTC ', '')
7892
const date = new Date(value)
7993
if (!isNaN(date.getTime())) {
8094
setDateRange(prev => ({
@@ -95,7 +109,8 @@ export function DateRangePicker({
95109
)}
96110
>
97111
<CalendarIcon className="mr-2 h-4 w-4" />
98-
{format(dateRange.from, "MMM dd")} - {format(dateRange.to, "MMM dd")}
112+
{dateRange.from ? format(dateRange.from, "MMM dd") : "Start"} -
113+
{dateRange.to ? format(dateRange.to, "MMM dd") : "End"}
99114
</Button>
100115
</PopoverTrigger>
101116
<PopoverContent className="w-auto p-0" align="start">
@@ -130,16 +145,12 @@ export function DateRangePicker({
130145
<div className="space-y-2">
131146
<div>
132147
<Label className="text-sm">From</Label>
133-
<div className="flex items-center">
134-
<span className="mr-2 text-sm text-muted-foreground">UTC</span>
135-
<Input
136-
type="text"
137-
value={fromInput}
138-
onChange={handleFromChange}
139-
className="rounded-md text-sm"
140-
placeholder="YYYY-MM-DD HH:mm:ss"
141-
/>
142-
</div>
148+
<Input
149+
type="text"
150+
value={dateRange.from ? `UTC ${format(dateRange.from, "yyyy-MM-dd HH:mm:ss")}` : ""}
151+
onChange={handleFromChange}
152+
className="rounded-md text-sm"
153+
/>
143154
</div>
144155

145156
<div>
@@ -148,25 +159,17 @@ export function DateRangePicker({
148159
<Button
149160
variant="link"
150161
className="h-auto p-0 text-xs text-black hover:text-black/80"
151-
onClick={() => {
152-
const now = new Date()
153-
setToInput(format(now, "yyyy-MM-dd HH:mm:ss"))
154-
setDateRange(prev => ({ ...prev, to: now }))
155-
}}
162+
onClick={() => setDateRange(prev => ({ ...prev, to: new Date() }))}
156163
>
157164
Set to latest
158165
</Button>
159166
</div>
160-
<div className="flex items-center">
161-
<span className="mr-2 text-sm text-muted-foreground">UTC</span>
162-
<Input
163-
type="text"
164-
value={toInput}
165-
onChange={handleToChange}
166-
className="rounded-md text-sm"
167-
placeholder="YYYY-MM-DD HH:mm:ss"
168-
/>
169-
</div>
167+
<Input
168+
type="text"
169+
value={dateRange.to ? `UTC ${format(dateRange.to, "yyyy-MM-dd HH:mm:ss")}` : ""}
170+
onChange={handleToChange}
171+
className="rounded-md text-sm"
172+
/>
170173
</div>
171174

172175
<div className="flex items-center space-x-2 pt-2">

0 commit comments

Comments
 (0)