Skip to content

Commit b680f26

Browse files
committed
few tweaks
1 parent 066fc11 commit b680f26

File tree

5 files changed

+67
-58
lines changed

5 files changed

+67
-58
lines changed

apps/app/src/components/TaskForm.tsx

+8-49
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Animated, { useAnimatedStyle, useSharedValue, withTiming } from "react-na
99
import * as DropdownMenu from "zeego/dropdown-menu"
1010

1111
import type { TaskReminder, TaskRepeat } from "@element/database/types"
12-
import { getRepeatingDatesBetween, join, merge, reminderHash, useDisclosure } from "@element/shared"
12+
import { TASK_REMINDER_OPTIONS, getRepeatingDatesBetween, join, merge, taskReminderHash, useDisclosure } from "@element/shared"
1313
import colors from "@element/tailwind-config/src/colors"
1414

1515
import type { FormResponseError } from "../lib/form"
@@ -42,45 +42,6 @@ type Props = {
4242
}
4343
)
4444

45-
const REMINDER_OPTIONS: { value: TaskReminder; name: string }[] = [
46-
{
47-
value: "AT_TIME",
48-
name: "At time of task",
49-
},
50-
{
51-
value: "MINUTES_5",
52-
name: "5 minutes before",
53-
},
54-
{
55-
value: "MINUTES_10",
56-
name: "10 minutes before",
57-
},
58-
{
59-
value: "MINUTES_15",
60-
name: "15 minutes before",
61-
},
62-
{
63-
value: "MINUTES_30",
64-
name: "30 minutes before",
65-
},
66-
{
67-
value: "HOURS_1",
68-
name: "1 hour before",
69-
},
70-
{
71-
value: "HOURS_2",
72-
name: "2 hour before",
73-
},
74-
{
75-
value: "DAYS_1",
76-
name: "1 day before",
77-
},
78-
{
79-
value: "DAYS_2",
80-
name: "2 days before",
81-
},
82-
]
83-
8445
export function TaskForm(props: Props) {
8546
const router = useRouter()
8647
const canGoBack = router.canGoBack()
@@ -132,15 +93,13 @@ export function TaskForm(props: Props) {
13293
const handlePickTime = (startTime: Date) => {
13394
timeProps.onClose()
13495

135-
const reminder = form.reminder ? REMINDER_OPTIONS.find((r) => r.value === form.reminder)!.value : null
136-
13796
const isOutOfWindow =
138-
reminder && form.date
97+
form.reminder && form.date
13998
? dayjs(form.date)
14099
.set("hours", dayjs(startTime).hour())
141100
.set("minutes", dayjs(startTime).minute())
142-
.subtract(reminderHash[reminder].hours, "hours")
143-
.subtract(reminderHash[reminder].minutes, "minutes")
101+
.subtract(taskReminderHash[form.reminder].hours, "hours")
102+
.subtract(taskReminderHash[form.reminder].minutes, "minutes")
144103
.isBefore(dayjs())
145104
: null
146105

@@ -368,22 +327,22 @@ export function TaskForm(props: Props) {
368327
<TouchableOpacity className={merge(inputClassName, "flex flex-row items-center space-x-2")}>
369328
<Icon icon={AlarmClock} size={16} />
370329
<Text className="text-sm">
371-
{REMINDER_OPTIONS.find((r) => r.value === form.reminder)?.name || "None"}
330+
{TASK_REMINDER_OPTIONS.find((r) => r.value === form.reminder)?.name || "None"}
372331
</Text>
373332
</TouchableOpacity>
374333
</DropdownMenu.Trigger>
375334
<DropdownMenu.Content>
376335
<DropdownMenu.Item key="none" onSelect={() => setForm({ ...form, reminder: null })}>
377336
None
378337
</DropdownMenu.Item>
379-
{REMINDER_OPTIONS.map((option) => (
338+
{TASK_REMINDER_OPTIONS.map((option) => (
380339
<DropdownMenu.Item
381340
key={option.value}
382341
disabled={dayjs(form.date!)
383342
.set("hour", Number(form.startTime!.split(":")[0]))
384343
.set("minute", Number(form.startTime!.split(":")[1]))
385-
.subtract(reminderHash[option.value].hours, "hours")
386-
.subtract(reminderHash[option.value].minutes, "minutes")
344+
.subtract(taskReminderHash[option.value].hours, "hours")
345+
.subtract(taskReminderHash[option.value].minutes, "minutes")
387346
.isBefore(dayjs())}
388347
onSelect={() => {
389348
setForm({ ...form, reminder: option.value })

apps/web/app/components/TaskItem.tsx

+10-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { useTimelineTasks } from "~/lib/hooks/useTimelineTasks"
1010
import { TaskActionMethods } from "~/pages/_app.timeline.$id"
1111
import type { TimelineTask } from "~/pages/api+/tasks"
1212

13+
import { AlarmClock } from "lucide-react"
1314
import { Button } from "./ui/Button"
1415
import { ButtonGroup } from "./ui/ButtonGroup"
1516
import { useFetcher } from "./ui/Form"
@@ -24,6 +25,7 @@ export const taskItemSelectFields = {
2425
durationMinutes: true,
2526
date: true,
2627
isComplete: true,
28+
reminder: true,
2729
isImportant: true,
2830
repeat: true,
2931
repeatParentId: true,
@@ -171,7 +173,14 @@ function _TaskItem({ task }: Props) {
171173
) : (
172174
<div />
173175
)}
174-
{task.startTime ? <p className="text-xxs">{task.startTime}</p> : <div />}
176+
{task.startTime ? (
177+
<div className="flex items-center space-x-0.5">
178+
<AlarmClock size={12} />
179+
<p className="text-xxs">{task.startTime}</p>
180+
</div>
181+
) : (
182+
<div />
183+
)}
175184
</div>
176185
)}
177186
</div>

apps/web/app/pages/api+/task-reminder.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { type TaskReminderBody, qstashReceiver } from "@element/server-services"
2-
import { reminderHash } from "@element/shared"
2+
import { taskReminderHash } from "@element/shared"
33
import type { ActionFunctionArgs } from "@remix-run/node"
44
import dayjs from "dayjs"
55

@@ -51,22 +51,24 @@ export const action = async ({ request }: ActionFunctionArgs) => {
5151
dayjs(task.date)
5252
.set("hour", Number(task.startTime!.split(":")[0]))
5353
.set("minute", Number(task.startTime!.split(":")[1]))
54-
.subtract(reminderHash[task.reminder].hours, "hours")
55-
.subtract(reminderHash[task.reminder].minutes, "minutes")
54+
.subtract(taskReminderHash[task.reminder].hours, "hours")
55+
.subtract(taskReminderHash[task.reminder].minutes, "minutes")
5656
.isBefore(dayjs())
5757
) {
5858
console.log("task is in the past")
5959
return json({ success: true })
6060
}
6161

6262
const pushTokens = await db.pushToken.findMany({ where: { userId: task.creatorId } })
63+
const isToday = dayjs(task.date).isSame(dayjs(), "day")
6364
const messages = pushTokens
6465
.filter((t) => Expo.isExpoPushToken(t.token))
6566
.map(
6667
(t) =>
6768
({
6869
to: t.token,
69-
body: `Here's a reminder about your task ${task.name} at ${task.startTime}!`,
70+
body: `Here's a reminder about your task '${task.name}'`,
71+
subtitle: `It's at ${task.startTime}${isToday ? "" : " tomorrow!"}`,
7072
data: { url: "/" },
7173
}) satisfies ExpoPushMessage,
7274
)

packages/server/services/src/taskReminder.server.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { FULL_WEB_URL, IS_DEV } from "@element/server-env"
33
import dayjs from "dayjs"
44
import utc from "dayjs/plugin/utc"
55

6-
import { reminderHash } from "@element/shared"
6+
import { taskReminderHash } from "@element/shared"
77
import { qstash } from "./lib/qstash.server"
88
dayjs.extend(utc)
99

@@ -19,8 +19,8 @@ export async function createTaskReminder(task: Pick<Task, "id" | "date" | "start
1919
const reminderDateTime = dayjs(task.date)
2020
.set("hour", hour)
2121
.set("minute", minute)
22-
.subtract(reminderHash[task.reminder].hours, "hours")
23-
.subtract(reminderHash[task.reminder].minutes, "minutes")
22+
.subtract(taskReminderHash[task.reminder].hours, "hours")
23+
.subtract(taskReminderHash[task.reminder].minutes, "minutes")
2424
.subtract(2, "hours")
2525

2626
const headers = new Headers()

packages/shared/src/models/task-reminder.ts

+40-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { TaskReminder } from "@element/database/types"
22

3-
export const reminderHash = {
3+
export const taskReminderHash = {
44
AT_TIME: { minutes: 0, hours: 0 },
55
MINUTES_5: { minutes: 5, hours: 0 },
66
MINUTES_10: { minutes: 10, hours: 0 },
@@ -11,3 +11,42 @@ export const reminderHash = {
1111
DAYS_1: { minutes: 0, hours: 24 },
1212
DAYS_2: { minutes: 0, hours: 48 },
1313
} satisfies Record<TaskReminder, { minutes: number; hours: number }>
14+
15+
export const TASK_REMINDER_OPTIONS: { value: TaskReminder; name: string }[] = [
16+
{
17+
value: "AT_TIME",
18+
name: "At time of task",
19+
},
20+
{
21+
value: "MINUTES_5",
22+
name: "5 minutes before",
23+
},
24+
{
25+
value: "MINUTES_10",
26+
name: "10 minutes before",
27+
},
28+
{
29+
value: "MINUTES_15",
30+
name: "15 minutes before",
31+
},
32+
{
33+
value: "MINUTES_30",
34+
name: "30 minutes before",
35+
},
36+
{
37+
value: "HOURS_1",
38+
name: "1 hour before",
39+
},
40+
{
41+
value: "HOURS_2",
42+
name: "2 hour before",
43+
},
44+
{
45+
value: "DAYS_1",
46+
name: "1 day before",
47+
},
48+
{
49+
value: "DAYS_2",
50+
name: "2 days before",
51+
},
52+
]

0 commit comments

Comments
 (0)