Skip to content

Commit 95455e0

Browse files
committed
pre-select filtered tag on new task
1 parent 5458def commit 95455e0

5 files changed

Lines changed: 57 additions & 13 deletions

File tree

app/(tabs)/quick-wins/index.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@ import QuickWinsList from '@/components/quick-wins/list/QuickWinsList';
44
import AddTaskButton from '@/components/quick-wins/list/AddTaskButton';
55
import { useTasksForDate } from '@/db/useTasks';
66
import { useSelectedDate } from '@/lib/selectedDateStore';
7+
import { useState } from 'react';
78

89
export default function QuickWinsScreen() {
910
const { selectedDate } = useSelectedDate();
1011
const { refetch, isFetching } = useTasksForDate(selectedDate);
12+
const [selectedTagId, setSelectedTagId] = useState<number | null>(null);
1113

1214
return (
1315
<>
1416
<WeekHeader />
1517
<NarrowView refreshing={isFetching} onRefresh={() => { void refetch(); }}>
16-
<QuickWinsList />
17-
<AddTaskButton />
18+
<QuickWinsList selectedTagId={selectedTagId} onSelectTagId={setSelectedTagId} />
19+
<AddTaskButton initialTagId={selectedTagId} />
1820
</NarrowView>
1921
</>
2022
);

components/quick-wins/list/AddTaskButton.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import { useState } from 'react';
22
import { AddButton } from '@/components/common/AddButton';
33
import AddTaskModal from './AddTaskModal';
44

5-
export default function AddTaskButton() {
5+
type AddTaskButtonProps = {
6+
initialTagId?: number | null;
7+
};
8+
9+
export default function AddTaskButton({ initialTagId = null }: AddTaskButtonProps) {
610
const [modalVisible, setModalVisible] = useState(false);
711

812
return (
@@ -12,6 +16,7 @@ export default function AddTaskButton() {
1216
visible={modalVisible}
1317
onClose={() => setModalVisible(false)}
1418
title="Add Task"
19+
initialTagIds={initialTagId != null ? [initialTagId] : []}
1520
/>
1621
</>
1722
);

components/quick-wins/list/AddTaskModal.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ interface AddTaskModalProps {
1717
visible: boolean;
1818
onClose: () => void;
1919
title?: string;
20+
initialTagIds?: number[];
2021
}
2122

2223
const { height: screenHeight } = Dimensions.get('window');
@@ -25,6 +26,7 @@ export default function AddTaskModal({
2526
visible,
2627
onClose,
2728
title = 'Add Task',
29+
initialTagIds,
2830
}: AddTaskModalProps) {
2931
const [modalVisible, setModalVisible] = useState(visible);
3032
const slideAnim = useRef(new Animated.Value(screenHeight)).current;
@@ -103,9 +105,10 @@ export default function AddTaskModal({
103105
</View>
104106

105107
<TaskForm
106-
key={visible ? 'open' : 'closed'}
108+
key={`${visible ? 'open' : 'closed'}-${(initialTagIds ?? []).join(',')}`}
107109
ref={formRef}
108110
onSuccess={handleClose}
111+
initialTagIds={initialTagIds}
109112
/>
110113
</Animated.View>
111114
</TouchableWithoutFeedback>

components/quick-wins/list/QuickWinsList.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@ import QuickWinsTagFilter from './QuickWinsTagFilter';
66
import QuickWinsTaskList from './QuickWinsTaskList';
77
import { useQuickWinsList } from './useQuickWinsList';
88

9-
export default function QuickWinsList() {
10-
const [selectedTagId, setSelectedTagId] = useState<number | null>(null);
9+
type QuickWinsListProps = {
10+
selectedTagId: number | null;
11+
onSelectTagId: (id: number | null) => void;
12+
};
13+
14+
export default function QuickWinsList({
15+
selectedTagId,
16+
onSelectTagId,
17+
}: QuickWinsListProps) {
1118
const [tagOrderModalVisible, setTagOrderModalVisible] = useState(false);
1219
const {
1320
tasksFiltered,
@@ -26,7 +33,7 @@ export default function QuickWinsList() {
2633
<QuickWinsTagFilter
2734
tagsInUse={tagsInUse}
2835
selectedTagId={selectedTagId}
29-
onSelectTagId={setSelectedTagId}
36+
onSelectTagId={onSelectTagId}
3037
onReorderPress={() => setTagOrderModalVisible(true)}
3138
showReorderButton={tags.length > 0}
3239
/>

components/quick-wins/list/TaskForm.tsx

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ export interface TaskFormRef {
2525
interface TaskFormProps {
2626
task?: Task;
2727
onSuccess?: () => void;
28+
initialTagIds?: number[];
2829
}
2930

30-
const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(({ task, onSuccess }, ref) => {
31+
const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(
32+
({ task, onSuccess, initialTagIds }, ref) => {
3133
const { selectedDate } = useSelectedDate();
3234
const isEdit = task != null;
3335

@@ -37,7 +39,7 @@ const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(({ task, onSuccess }, re
3739
);
3840
const [showDatePicker, setShowDatePicker] = useState(false);
3941
const [tagNames, setTagNames] = useState<string[]>([]);
40-
const [tagNamesInitialized, setTagNamesInitialized] = useState(!isEdit);
42+
const [tagNamesInitialized, setTagNamesInitialized] = useState(false);
4143

4244
const { data: tagIds = [] } = useTaskTagIds(isEdit ? task!.id : undefined);
4345
const { data: tags = [] } = useTagsQuery();
@@ -51,6 +53,24 @@ const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(({ task, onSuccess }, re
5153
setTagNamesInitialized(true);
5254
}, [isEdit, tagIds, tags]);
5355

56+
useEffect(() => {
57+
if (isEdit) return;
58+
if (tagNamesInitialized) return;
59+
if (!initialTagIds || initialTagIds.length === 0) {
60+
setTagNamesInitialized(true);
61+
return;
62+
}
63+
if (tags.length === 0) {
64+
setTagNamesInitialized(true);
65+
return;
66+
}
67+
const initialNames = initialTagIds
68+
.map((id) => tags.find((t) => t.id === id)?.name)
69+
.filter((n): n is string => Boolean(n));
70+
setTagNames(initialNames);
71+
setTagNamesInitialized(true);
72+
}, [isEdit, initialTagIds, tagNamesInitialized, tags]);
73+
5474
const [isSubmitting, setIsSubmitting] = useState(false);
5575
const createTask = useCreateTask();
5676
const updateTask = useUpdateTask();
@@ -102,8 +122,13 @@ const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(({ task, onSuccess }, re
102122
if (tagNames.length > 0) {
103123
const tagIdsToSet: number[] = [];
104124
for (const name of tagNames) {
105-
const tag = await createTag.mutateAsync(name);
106-
tagIdsToSet.push(tag.id);
125+
const existing = tags.find((t) => t.name === name);
126+
if (existing) {
127+
tagIdsToSet.push(existing.id);
128+
} else {
129+
const tag = await createTag.mutateAsync(name);
130+
tagIdsToSet.push(tag.id);
131+
}
107132
}
108133
await setTaskTags.mutateAsync({ taskId: newTask.id, tagIds: tagIdsToSet });
109134
}
@@ -210,7 +235,8 @@ const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(({ task, onSuccess }, re
210235
isSubmitting ||
211236
pending ||
212237
!taskTitle.trim() ||
213-
(isEdit && !tagNamesInitialized)
238+
((isEdit || (initialTagIds != null && initialTagIds.length > 0)) &&
239+
!tagNamesInitialized)
214240
}
215241
>
216242
<Text className="text-base font-bold" style={{ color: Colors.text }}>
@@ -226,7 +252,8 @@ const TaskForm = forwardRef<TaskFormRef, TaskFormProps>(({ task, onSuccess }, re
226252
)}
227253
</View>
228254
);
229-
});
255+
}
256+
);
230257

231258
const styles = StyleSheet.create({
232259
formWrap: {

0 commit comments

Comments
 (0)