ab9d7ddf7e
* Fix tasks page * remove console log * use to-do instead
120 lines
3.6 KiB
TypeScript
120 lines
3.6 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { DateTime } from 'luxon';
|
|
import { useRecoilState } from 'recoil';
|
|
|
|
import { TasksRecoilScopeContext } from '@/activities/states/recoil-scope-contexts/TasksRecoilScopeContext';
|
|
import { useInitializeTasksFilters } from '@/activities/tasks/hooks/useInitializeTasksFilters';
|
|
import { ActivityTargetableEntity } from '@/activities/types/ActivityTargetableEntity';
|
|
import { currentUserState } from '@/auth/states/currentUserState';
|
|
import { filtersScopedState } from '@/ui/filter-n-sort/states/filtersScopedState';
|
|
import { FilterOperand } from '@/ui/filter-n-sort/types/FilterOperand';
|
|
import { turnFilterIntoWhereClause } from '@/ui/filter-n-sort/utils/turnFilterIntoWhereClause';
|
|
import { activeTabIdScopedState } from '@/ui/tab/states/activeTabIdScopedState';
|
|
import { useRecoilScopedState } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedState';
|
|
import { ActivityType, useGetActivitiesQuery } from '~/generated/graphql';
|
|
import { tasksFilters } from '~/pages/tasks/tasks-filters';
|
|
import { parseDate } from '~/utils/date-utils';
|
|
|
|
export function useTasks(entity?: ActivityTargetableEntity) {
|
|
useInitializeTasksFilters({
|
|
availableFilters: tasksFilters,
|
|
});
|
|
|
|
const [activeTabId] = useRecoilScopedState(
|
|
activeTabIdScopedState,
|
|
TasksRecoilScopeContext,
|
|
);
|
|
|
|
const [filters, setFilters] = useRecoilScopedState(
|
|
filtersScopedState,
|
|
TasksRecoilScopeContext,
|
|
);
|
|
|
|
// If there is no filter, we set the default filter to the current user
|
|
const [currentUser] = useRecoilState(currentUserState);
|
|
|
|
useEffect(() => {
|
|
if (currentUser && !filters.length && !entity) {
|
|
setFilters([
|
|
{
|
|
key: 'assigneeId',
|
|
type: 'entity',
|
|
value: currentUser.id,
|
|
operand: FilterOperand.Is,
|
|
displayValue: currentUser.displayName,
|
|
displayAvatarUrl: currentUser.avatarUrl ?? undefined,
|
|
},
|
|
]);
|
|
}
|
|
}, [currentUser, filters, setFilters, entity]);
|
|
|
|
const whereFilters = entity
|
|
? {
|
|
activityTargets: {
|
|
some: {
|
|
OR: [
|
|
{ companyId: { equals: entity.id } },
|
|
{ personId: { equals: entity.id } },
|
|
],
|
|
},
|
|
},
|
|
}
|
|
: Object.assign(
|
|
{},
|
|
...filters.map((filter) => {
|
|
return turnFilterIntoWhereClause(filter);
|
|
}),
|
|
);
|
|
|
|
const { data: completeTasksData } = useGetActivitiesQuery({
|
|
variables: {
|
|
where: {
|
|
type: { equals: ActivityType.Task },
|
|
completedAt: { not: { equals: null } },
|
|
...whereFilters,
|
|
},
|
|
},
|
|
});
|
|
|
|
const { data: incompleteTaskData } = useGetActivitiesQuery({
|
|
variables: {
|
|
where: {
|
|
type: { equals: ActivityType.Task },
|
|
completedAt: { equals: null },
|
|
...whereFilters,
|
|
},
|
|
},
|
|
});
|
|
|
|
const tasksData =
|
|
activeTabId === 'to-do' || entity ? incompleteTaskData : completeTasksData;
|
|
|
|
const todayOrPreviousTasks = tasksData?.findManyActivities.filter((task) => {
|
|
if (!task.dueAt) {
|
|
return false;
|
|
}
|
|
const dueDate = parseDate(task.dueAt).toJSDate();
|
|
const today = DateTime.now().endOf('day').toJSDate();
|
|
return dueDate <= today;
|
|
});
|
|
|
|
const upcomingTasks = tasksData?.findManyActivities.filter((task) => {
|
|
if (!task.dueAt) {
|
|
return false;
|
|
}
|
|
const dueDate = parseDate(task.dueAt).toJSDate();
|
|
const today = DateTime.now().endOf('day').toJSDate();
|
|
return dueDate > today;
|
|
});
|
|
|
|
const unscheduledTasks = tasksData?.findManyActivities.filter((task) => {
|
|
return !task.dueAt;
|
|
});
|
|
|
|
return {
|
|
todayOrPreviousTasks,
|
|
upcomingTasks,
|
|
unscheduledTasks,
|
|
};
|
|
}
|