Skip to content

Commit 5067464

Browse files
committed
fixed completion tracking over changing date
1 parent 437791a commit 5067464

File tree

14 files changed

+90
-52
lines changed

14 files changed

+90
-52
lines changed

.devcontainer/compose.yml

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
services:
22
app:
33
hostname: dc
4-
network_mode: host
5-
build:
6-
context: .
7-
dockerfile: devcontainer.Dockerfile
4+
ports:
5+
- 5173:5173
6+
image: node:24-trixie-slim
87
command: sleep infinity
98
env_file:
109
- .env

.devcontainer/devcontainer.Dockerfile

Lines changed: 0 additions & 5 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"version": "0.0.0",
55
"type": "module",
66
"scripts": {
7-
"dev": "vite",
7+
"dev": "vite --host",
88
"build": "tsc -b && vite build",
99
"lint": "eslint . && tsc -b",
1010
"preview": "vite preview"

src/components/date/context.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import React from "react"
2+
3+
export const DateContext = React.createContext<Date>(new Date())

src/components/date/provider.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { formatDate } from "@/lib/dates"
2+
import React from "react"
3+
4+
import { DateContext } from "./context"
5+
6+
export const CurrentDateProvider: React.FC<React.PropsWithChildren> = ({ children }) => {
7+
const [date, setDate] = React.useState(new Date())
8+
const dateStr = formatDate(date)
9+
10+
React.useEffect(() => {
11+
const interval = setInterval(() => {
12+
const next = new Date()
13+
const nextStr = formatDate(next)
14+
if (nextStr !== dateStr) {
15+
setDate(next)
16+
}
17+
}, 60 * 1000)
18+
return () => clearInterval(interval)
19+
}, [])
20+
21+
return <DateContext.Provider value={date}>{children}</DateContext.Provider>
22+
}

src/components/habit/button.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DateContext } from "@/components/date/context"
12
import { useHabitContext } from "@/components/habit/context"
23
import { Button } from "@/components/ui/button"
34
import { formatDate } from "@/lib/dates"
@@ -51,13 +52,14 @@ const applyButton = (
5152
}
5253

5354
export const CompletionButton: React.FC<P> = ({ options = defaultOptions, preview, ...rest }) => {
54-
const { habit, color, update, date } = useHabitContext()
55+
const today = React.useContext(DateContext)
56+
const { habit, color, update, selectedDate } = useHabitContext()
5557

5658
const handleClick = (manualValue?: number) => {
5759
if (preview) return
5860

5961
const next = clone(HabitSchema, habit)
60-
const dateStr = formatDate(date)
62+
const dateStr = formatDate(selectedDate ?? today)
6163

6264
if (options.kind.case === undefined) {
6365
delete next.completions[dateStr]

src/components/habit/chart.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import { DateContext } from "@/components/date/context"
12
import { useHabitContext } from "@/components/habit/context"
23
import { formatDate } from "@/lib/dates"
34
import { cn } from "@/lib/utils"
45
import { type Completion } from "@/proto/models/v1/models_pb"
5-
import type React from "react"
6+
import React from "react"
67

78
import { HabitDatePicker } from "./date-picker"
89

@@ -27,7 +28,7 @@ interface CellProps {
2728
}
2829

2930
const Cell: React.FC<CellProps> = ({ date, background, completion, selected, interactive }) => {
30-
const { setDate } = useHabitContext()
31+
const { setSelectedDate } = useHabitContext()
3132

3233
let progress = 0
3334
if (completion !== undefined) {
@@ -44,7 +45,7 @@ const Cell: React.FC<CellProps> = ({ date, background, completion, selected, int
4445
style={{
4546
opacity: progress === 0 ? 1 : progress,
4647
}}
47-
onClick={interactive ? () => setDate(date) : undefined}
48+
onClick={interactive ? () => setSelectedDate(date) : undefined}
4849
>
4950
{interactive && selected && <div className="h-2 w-2 rounded-xs bg-secondary" />}
5051
</div>
@@ -56,9 +57,10 @@ interface P {
5657
}
5758

5859
export const HabitChart: React.FC<P> = ({ interactive }) => {
59-
const { habit, color, date } = useHabitContext()
60+
const today = React.useContext(DateContext)
61+
const { habit, color, selectedDate } = useHabitContext()
6062
const now = new Date()
61-
const selectedDateStr = formatDate(date)
63+
const selectedDateStr = formatDate(selectedDate ?? today)
6264

6365
return (
6466
<div className="flex flex-col gap-2">

src/components/habit/context.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ interface S {
1010
isFetching: boolean
1111
color: colors.Options
1212

13-
date: Date
14-
setDate: React.Dispatch<React.SetStateAction<Date>>
13+
selectedDate: Date | undefined
14+
setSelectedDate: React.Dispatch<React.SetStateAction<Date | undefined>>
1515
completion: Completion
1616
isCompleted: boolean
1717
progress: number

src/components/habit/date-picker.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { DateContext } from "@/components/date/context"
12
import { Button } from "@/components/ui/button"
23
import { Calendar } from "@/components/ui/calendar"
34
import {
@@ -15,14 +16,15 @@ import React from "react"
1516
import { useHabitContext } from "./context"
1617

1718
export const HabitDatePicker: React.FC = () => {
18-
const { date, setDate } = useHabitContext()
19+
const today = React.useContext(DateContext)
20+
const { selectedDate, setSelectedDate } = useHabitContext()
1921
const [open, setOpen] = React.useState(false)
2022

21-
const dateStr = formatDate(date)
23+
const dateStr = formatDate(selectedDate ?? today)
2224
const todayStr = formatDate(new Date())
2325

2426
const handleSelect = (d: Date | undefined) => {
25-
setDate(d || new Date())
27+
setSelectedDate(d || new Date())
2628
setOpen(false)
2729
}
2830

@@ -33,7 +35,7 @@ export const HabitDatePicker: React.FC = () => {
3335
size="sm"
3436
className="w-fit"
3537
disabled={dateStr === todayStr}
36-
onClick={() => setDate(new Date())}
38+
onClick={() => setSelectedDate(undefined)}
3739
>
3840
<Undo2 />
3941
</Button>
@@ -43,7 +45,7 @@ export const HabitDatePicker: React.FC = () => {
4345
<div className="flex items-center gap-2">
4446
<Button variant="ghost" size="sm" className="w-fit">
4547
<CalendarIcon />
46-
{date?.toLocaleDateString()}
48+
{selectedDate?.toLocaleDateString()}
4749
</Button>
4850
</div>
4951
</DialogTrigger>
@@ -56,7 +58,7 @@ export const HabitDatePicker: React.FC = () => {
5658

5759
<Calendar
5860
mode="single"
59-
selected={date}
61+
selected={selectedDate}
6062
onSelect={handleSelect}
6163
weekStartsOn={1}
6264
className="min-h-85"
@@ -71,7 +73,7 @@ export const HabitDatePicker: React.FC = () => {
7173
<Button
7274
variant="outline"
7375
onClick={() => {
74-
setDate(new Date())
76+
setSelectedDate(new Date())
7577
setOpen(false)
7678
}}
7779
>

src/components/habit/list.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useCollectionContext } from "@/components/collection/context"
22
import { HabitCard } from "@/components/habit/card"
3-
import { HabitFetcher } from "@/components/habit/fetcher"
3+
import { HabitProvider } from "@/components/habit/provider"
44
import { useOrderingContext } from "@/components/ordering/context"
55
import { RefreshButton } from "@/components/refresh-button"
66
import { TagContext } from "@/components/tag/context"
@@ -40,9 +40,9 @@ export const HabitList: React.FC = () => {
4040

4141
<div className="flex flex-col items-center gap-2 w-full">
4242
{orderedNames.map((name) => (
43-
<HabitFetcher key={name} name={name}>
43+
<HabitProvider key={name} name={name}>
4444
<HabitCard />
45-
</HabitFetcher>
45+
</HabitProvider>
4646
))}
4747
</div>
4848

0 commit comments

Comments
 (0)