diff --git a/client/src/graphql/queries.ts b/client/src/graphql/queries.ts index 36dd7a9..d0644d9 100644 --- a/client/src/graphql/queries.ts +++ b/client/src/graphql/queries.ts @@ -80,4 +80,44 @@ export const GET_USERS = gql` name } } +`; + +export const GET_RECENT_TASKS = gql` + query GetRecentTasks { + recentTasks { + id + name + group_id + print_count + last_printed_at + steps { + id + name + instructions + order + print_count + last_printed_at + } + } + } +`; + +export const GET_FREQUENT_TASKS = gql` + query GetFrequentTasks { + frequentTasks { + id + name + group_id + print_count + last_printed_at + steps { + id + name + instructions + order + print_count + last_printed_at + } + } + } `; \ No newline at end of file diff --git a/client/src/hooks/useTaskData.ts b/client/src/hooks/useTaskData.ts index 2a617e0..e27feb4 100644 --- a/client/src/hooks/useTaskData.ts +++ b/client/src/hooks/useTaskData.ts @@ -1,6 +1,6 @@ import { useState } from 'react'; import { useQuery, useMutation } from '@apollo/client'; -import { GET_GROUPS, GET_TASKS, GET_STEP } from '../graphql/queries'; +import { GET_GROUPS, GET_TASKS, GET_STEP, GET_RECENT_TASKS, GET_FREQUENT_TASKS } from '../graphql/queries'; import { PRINT_TASK, PRINT_STEP, CREATE_NOTE, CREATE_GROUP, CREATE_TASK, CREATE_STEP } from '../graphql/mutations'; import type { GroupWithTasks, TaskWithSteps, StepWithNotes } from '../types'; import { doesExist, isArray } from '../utils/typeGuards'; @@ -120,6 +120,8 @@ export function useTaskData() { variables: { id: selectedStep?.id }, skip: !selectedStep?.id, }); + const { data: recentTasksData, loading: recentTasksLoading } = useQuery(GET_RECENT_TASKS); + const { data: frequentTasksData, loading: frequentTasksLoading } = useQuery(GET_FREQUENT_TASKS); const [printTask] = useMutation(PRINT_TASK); const [printStep] = useMutation(PRINT_STEP); @@ -224,6 +226,35 @@ export function useTaskData() { ? groupsData.groups.map((group: GraphQLGroup) => toGroupWithTasks(group)).filter(doesExist) : []; + const recentTasks = isArray(recentTasksData?.recentTasks) + ? recentTasksData.recentTasks.map((task: GraphQLTask) => toTaskWithSteps(task)).filter(doesExist) + : []; + + const frequentTasks = isArray(frequentTasksData?.frequentTasks) + ? frequentTasksData.frequentTasks.map((task: GraphQLTask) => toTaskWithSteps(task)).filter(doesExist) + : []; + + // Create virtual groups for recent and frequent tasks + const virtualGroups: GroupWithTasks[] = [ + { + id: -1, // Use negative IDs for virtual groups + name: 'Recent Tasks', + created_at: new Date(), + updated_at: new Date(), + tasks: recentTasks, + }, + { + id: -2, + name: 'Frequent Tasks', + created_at: new Date(), + updated_at: new Date(), + tasks: frequentTasks, + }, + ]; + + // Combine virtual groups with regular groups + const allGroups = [...virtualGroups, ...groups]; + const tasks = isArray(tasksData?.tasks) ? tasksData.tasks.map((task: GraphQLTask) => toTaskWithSteps(task)).filter(doesExist) : []; @@ -231,10 +262,10 @@ export function useTaskData() { const step = stepData?.step ? toStepWithNotes(stepData.step) : undefined; return { - groups, + groups: allGroups, tasks, step, - loading: groupsLoading || tasksLoading || stepLoading, + loading: groupsLoading || tasksLoading || stepLoading || recentTasksLoading || frequentTasksLoading, selectedGroup, selectedTask, selectedStep, diff --git a/client/src/layouts/DesktopLayout.tsx b/client/src/layouts/DesktopLayout.tsx index 3578c82..bf0bbcb 100644 --- a/client/src/layouts/DesktopLayout.tsx +++ b/client/src/layouts/DesktopLayout.tsx @@ -29,6 +29,8 @@ export function DesktopLayout({ Groups + + {/* Groups List */} {groups.map((group) => ( Tasks - + {selectedGroup.id > 0 && } {selectedGroup.tasks.map((task) => ( Groups + + {/* Groups List */} {groupList.map((group) => ( onGroupSelect(group)} > @@ -95,7 +99,7 @@ export function MobileLayout({ <> Tasks - + {selectedGroup.id > 0 && } {taskList.map((task) => (