Skip to content

Commit ab44310

Browse files
committed
feat: Integrate TaskContext for task editing and management across components
1 parent 5ed1ffb commit ab44310

File tree

9 files changed

+179
-137
lines changed

9 files changed

+179
-137
lines changed

ui/src/components/task/EndTimeField.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,28 @@ import React from "react";
22
import { Input } from "@/components/ui/input";
33
import { cn, parseTimeInputToISOString } from "@/lib/utils";
44
import { useToast } from "@/components/ui/use-toast";
5-
import { TaskEditProps } from "./types";
5+
import { Task } from "./types";
6+
import { useTaskContext } from "@/contexts/TaskContext";
67

7-
interface EndTimeFieldProps extends TaskEditProps {
8+
interface EndTimeFieldProps {
9+
task: Task;
810
categoryColor?: string;
911
}
1012

1113
export const EndTimeField = ({
1214
task,
13-
editingField,
14-
editValue,
15-
onEditStart,
16-
setEditValue,
17-
setEditingField,
18-
handleEditSave,
1915
categoryColor = "#6b7280",
2016
}: EndTimeFieldProps) => {
2117
const { toast } = useToast();
18+
const { taskEdit } = useTaskContext();
19+
const {
20+
editingField,
21+
editValue,
22+
handleEditStart,
23+
setEditValue,
24+
setEditingField,
25+
handleEditSave,
26+
} = taskEdit;
2227

2328
const isEditing =
2429
editingField?.taskId === task.id && editingField?.field === "end_time";
@@ -109,7 +114,7 @@ export const EndTimeField = ({
109114
)}
110115
onClick={() => {
111116
if (!isDisabled) {
112-
onEditStart(task.id, "end_time", fieldValue || "");
117+
handleEditStart(task.id, "end_time", fieldValue || "");
113118
}
114119
}}
115120
>

ui/src/components/task/SortableTask.tsx

Lines changed: 12 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -10,53 +10,17 @@ import { StartTimeField } from "./StartTimeField";
1010
import { EndTimeField } from "./EndTimeField";
1111
import { TaskCategoryField } from "./TaskCategoryField";
1212
import { TaskMetaInfo } from "./TaskMetaInfo";
13-
import { Task, Category } from "@/types/task";
14-
import { EditingField } from "./types";
15-
16-
interface TaskEditActions {
17-
editingField: EditingField | null;
18-
editValue: string;
19-
setEditingField: (field: EditingField | null) => void;
20-
setEditValue: (value: string) => void;
21-
handleEditStart: (
22-
taskId: string,
23-
field:
24-
| "title"
25-
| "estimated_minute"
26-
| "start_time"
27-
| "end_time"
28-
| "category_id",
29-
value: string,
30-
) => void;
31-
handleEditChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
32-
handleEditSave: (customValue?: string) => void;
33-
handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;
34-
}
35-
36-
interface TaskActions {
37-
handleDelete: (taskId: string) => void;
38-
handleTaskTimer: (
39-
taskId: string,
40-
action: "start" | "stop" | "complete",
41-
) => void;
42-
handleRepeatTask: (task: Task) => void;
43-
}
13+
import { Task } from "@/types/task";
14+
import { useTaskContext } from "@/contexts/TaskContext";
4415

4516
interface SortableTaskProps {
4617
task: Task;
47-
taskEdit: TaskEditActions;
48-
taskActions: TaskActions;
49-
lastTaskEndTime: string | null;
50-
categories: Category[];
5118
}
5219

53-
const SortableTask = ({
54-
task,
55-
taskEdit,
56-
taskActions,
57-
lastTaskEndTime,
58-
categories,
59-
}: SortableTaskProps) => {
20+
const SortableTask = ({ task }: SortableTaskProps) => {
21+
// TaskContextから必要な値を取得
22+
const { taskEdit, taskActions, lastTaskEndTime, categories } =
23+
useTaskContext();
6024
const { attributes, listeners, setNodeRef, transform, transition } =
6125
useSortable({
6226
id: task.id,
@@ -132,18 +96,6 @@ const SortableTask = ({
13296
);
13397
const categoryColor = selectedCategory?.color || "#6b7280";
13498

135-
const taskEditProps = {
136-
task,
137-
editingField: taskEdit.editingField,
138-
editValue: taskEdit.editValue,
139-
onEditStart: taskEdit.handleEditStart,
140-
handleEditChange: taskEdit.handleEditChange,
141-
handleEditSave: taskEdit.handleEditSave,
142-
handleKeyDown: taskEdit.handleKeyDown,
143-
setEditValue: taskEdit.setEditValue,
144-
setEditingField: taskEdit.setEditingField,
145-
};
146-
14799
return (
148100
<div
149101
ref={setNodeRef}
@@ -162,31 +114,23 @@ const SortableTask = ({
162114
<GripVertical className="h-4 w-4" style={{ color: categoryColor }} />
163115
</div>
164116

165-
<TaskTimerButton
166-
task={task}
167-
onTaskTimer={taskActions.handleTaskTimer}
168-
onRepeatTask={taskActions.handleRepeatTask}
169-
categoryColor={categoryColor}
170-
/>
117+
<TaskTimerButton task={task} categoryColor={categoryColor} />
171118

172119
<div className="flex-grow">
173-
<TaskTitleField {...taskEditProps} categoryColor={categoryColor} />
120+
<TaskTitleField task={task} categoryColor={categoryColor} />
174121

175122
<div className="flex gap-3 text-sm text-muted-foreground">
176-
<TaskEstimatedTimeField
177-
{...taskEditProps}
178-
categoryColor={categoryColor}
179-
/>
123+
<TaskEstimatedTimeField task={task} categoryColor={categoryColor} />
180124

181125
<StartTimeField
182-
{...taskEditProps}
126+
task={task}
183127
lastTaskEndTime={lastTaskEndTime}
184128
categoryColor={categoryColor}
185129
/>
186130

187-
<EndTimeField {...taskEditProps} categoryColor={categoryColor} />
131+
<EndTimeField task={task} categoryColor={categoryColor} />
188132

189-
<TaskCategoryField {...taskEditProps} categories={categories} />
133+
<TaskCategoryField task={task} categories={categories} />
190134

191135
<TaskMetaInfo task={task} categoryColor={categoryColor} />
192136
</div>

ui/src/components/task/StartTimeField.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,33 @@ import { ChevronDown } from "lucide-react";
1010
import { parseTimeInputToISOString } from "@/lib/utils";
1111
import { createClient } from "@/lib/supabase/client";
1212
import { useToast } from "@/components/ui/use-toast";
13-
import { TaskEditProps } from "./types";
13+
import { Task } from "./types";
14+
import { useTaskContext } from "@/contexts/TaskContext";
1415

1516
const supabase = createClient();
1617

17-
interface StartTimeFieldProps extends TaskEditProps {
18+
interface StartTimeFieldProps {
19+
task: Task;
1820
lastTaskEndTime?: string | null;
1921
categoryColor?: string;
2022
}
2123

2224
export const StartTimeField = ({
2325
task,
24-
editingField,
25-
editValue,
26-
onEditStart,
27-
setEditValue,
28-
setEditingField,
29-
handleEditSave,
3026
lastTaskEndTime,
3127
categoryColor = "#6b7280",
3228
}: StartTimeFieldProps) => {
3329
const [popoverOpen, setPopoverOpen] = useState(false);
3430
const { toast } = useToast();
31+
const { taskEdit } = useTaskContext();
32+
const {
33+
editingField,
34+
editValue,
35+
handleEditStart,
36+
setEditValue,
37+
setEditingField,
38+
handleEditSave,
39+
} = taskEdit;
3540

3641
const isEditing =
3742
editingField?.taskId === task.id && editingField?.field === "start_time";
@@ -220,7 +225,7 @@ export const StartTimeField = ({
220225
<p
221226
className="cursor-pointer hover:bg-gray-50 p-1 rounded"
222227
onClick={() => {
223-
onEditStart(task.id, "start_time", fieldValue || "");
228+
handleEditStart(task.id, "start_time", fieldValue || "");
224229
}}
225230
>
226231
<span style={{ color: categoryColor }}>開始: </span>

ui/src/components/task/TaskCategoryField.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,22 @@ import {
66
PopoverTrigger,
77
} from "@/components/ui/popover";
88
import { ChevronDown, Tag } from "lucide-react";
9-
import { TaskEditProps } from "./types";
10-
import { Category } from "@/types/task";
9+
import { Task, Category } from "@/types/task";
10+
import { useTaskContext } from "@/contexts/TaskContext";
1111

12-
interface TaskCategoryFieldProps extends TaskEditProps {
12+
interface TaskCategoryFieldProps {
13+
task: Task;
1314
categories: Category[];
1415
}
1516

1617
export const TaskCategoryField = ({
1718
task,
18-
editingField,
19-
onEditStart,
20-
setEditValue,
21-
setEditingField: _setEditingField,
22-
handleEditSave,
2319
categories,
2420
}: TaskCategoryFieldProps) => {
2521
const [popoverOpen, setPopoverOpen] = useState(false);
22+
const { taskEdit } = useTaskContext();
23+
const { editingField, handleEditStart, setEditValue, handleEditSave } =
24+
taskEdit;
2625

2726
const isEditing =
2827
editingField?.taskId === task.id && editingField?.field === "category_id";
@@ -114,7 +113,7 @@ export const TaskCategoryField = ({
114113
<p
115114
className="cursor-pointer hover:bg-gray-50 p-1 rounded flex items-center"
116115
onClick={() => {
117-
onEditStart(task.id, "category_id", fieldValue || "");
116+
handleEditStart(task.id, "category_id", fieldValue || "");
118117
}}
119118
>
120119
<Tag

ui/src/components/task/TaskEstimatedTimeField.tsx

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,29 @@ import {
77
PopoverTrigger,
88
} from "@/components/ui/popover";
99
import { ChevronDown } from "lucide-react";
10-
import { TaskEditProps } from "./types";
10+
import { Task } from "./types";
11+
import { useTaskContext } from "@/contexts/TaskContext";
1112

12-
interface TaskEstimatedTimeFieldProps extends TaskEditProps {
13+
interface TaskEstimatedTimeFieldProps {
14+
task: Task;
1315
categoryColor?: string;
1416
}
1517

1618
export const TaskEstimatedTimeField = ({
1719
task,
18-
editingField,
19-
editValue,
20-
onEditStart,
21-
handleEditChange,
22-
handleEditSave,
23-
setEditValue,
24-
setEditingField,
2520
categoryColor = "#6b7280",
2621
}: TaskEstimatedTimeFieldProps) => {
2722
const [popoverOpen, setPopoverOpen] = useState(false);
23+
const { taskEdit } = useTaskContext();
24+
const {
25+
editingField,
26+
editValue,
27+
handleEditStart,
28+
handleEditChange,
29+
handleEditSave,
30+
setEditValue,
31+
setEditingField,
32+
} = taskEdit;
2833

2934
const isEditing =
3035
editingField?.taskId === task.id &&
@@ -114,7 +119,7 @@ export const TaskEstimatedTimeField = ({
114119
<p
115120
className="cursor-pointer hover:bg-gray-50 p-1 rounded"
116121
onClick={() =>
117-
onEditStart(
122+
handleEditStart(
118123
task.id,
119124
"estimated_minute",
120125
task.estimated_minute ? task.estimated_minute.toString() : "",

ui/src/components/task/TaskTimerButton.tsx

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@ import { Button } from "@/components/ui/button";
22
import { Play, Square, CheckCircle2, RotateCcw } from "lucide-react";
33
import { Task } from "./types";
44
import { useState } from "react";
5+
import { useTaskContext } from "@/contexts/TaskContext";
56

67
interface TaskTimerButtonProps {
78
task: Task;
8-
onTaskTimer: (taskId: string, action: "start" | "stop" | "complete") => void;
9-
onRepeatTask?: (task: Task) => void;
109
categoryColor?: string;
1110
}
1211

1312
export const TaskTimerButton = ({
1413
task,
15-
onTaskTimer,
16-
onRepeatTask,
1714
categoryColor = "#6b7280",
1815
}: TaskTimerButtonProps) => {
1916
const [isHovered, setIsHovered] = useState(false);
17+
18+
// TaskContextから必要な関数を取得
19+
const { taskActions } = useTaskContext();
20+
const { handleTaskTimer, handleRepeatTask } = taskActions;
2021
if (!task.start_time) {
2122
return (
2223
<Button
2324
size="icon"
2425
variant="outline"
25-
onClick={() => onTaskTimer(task.id, "start")}
26+
onClick={() => handleTaskTimer(task.id, "start")}
2627
className="h-8 w-8 hover:bg-opacity-10"
2728
style={{
2829
color: categoryColor,
@@ -40,7 +41,7 @@ export const TaskTimerButton = ({
4041
<Button
4142
size="icon"
4243
variant="outline"
43-
onClick={() => onTaskTimer(task.id, "stop")}
44+
onClick={() => handleTaskTimer(task.id, "stop")}
4445
className="h-8 w-8 hover:bg-opacity-10"
4546
style={{
4647
color: categoryColor,
@@ -63,17 +64,17 @@ export const TaskTimerButton = ({
6364
borderColor: categoryColor,
6465
backgroundColor: `${categoryColor}20`,
6566
}}
66-
disabled={!onRepeatTask}
67+
disabled={!handleRepeatTask}
6768
onClick={(e) => {
68-
if (onRepeatTask) {
69+
if (handleRepeatTask) {
6970
e.stopPropagation();
70-
onRepeatTask(task);
71+
handleRepeatTask(task);
7172
}
7273
}}
7374
onMouseEnter={() => setIsHovered(true)}
7475
onMouseLeave={() => setIsHovered(false)}
7576
>
76-
{isHovered && onRepeatTask ? (
77+
{isHovered ? (
7778
<RotateCcw className="h-4 w-4" />
7879
) : (
7980
<CheckCircle2 className="h-4 w-4" />

0 commit comments

Comments
 (0)