diff --git a/api/useAccountActivities.ts b/api/useAccountActivities.ts index 0e281356d..ef956a926 100644 --- a/api/useAccountActivities.ts +++ b/api/useAccountActivities.ts @@ -1,44 +1,111 @@ import { type Schema } from "@/amplify/data/resource"; import { generateClient, SelectionSet } from "aws-amplify/data"; -import { filter, flatMap, flow, map, sortBy } from "lodash/fp"; +import { filter, flatMap, flow, map, sortBy, union, uniqBy } from "lodash/fp"; import useSWR from "swr"; import { handleApiErrors } from "./globals"; const client = generateClient(); -const selectionSet = [ +const selectionSetAccount = [ "projects.activities.activity.id", "projects.activities.activity.createdAt", "projects.activities.activity.finishedOn", + "projects.activities.activity.forProjects.projects.id", + "projects.activities.activity.meetingActivitiesId", ] as const; -type ActivityData = SelectionSet< +type ActivityAccountData = SelectionSet< Schema["AccountProjects"]["type"], - typeof selectionSet + typeof selectionSetAccount >; -type ProjectActivityData = - ActivityData["projects"]["activities"][number]["activity"]; +type ProjectActivityAccountData = + ActivityAccountData["projects"]["activities"][number]["activity"]; + +const selectionSetPartner = [ + "activities.activity.id", + "activities.activity.createdAt", + "activities.activity.finishedOn", + "activities.activity.forProjects.projects.id", + "activities.activity.meetingActivitiesId", +] as const; + +type ActivityPartnerData = SelectionSet< + Schema["Projects"]["type"], + typeof selectionSetPartner +>; + +type ProjectActivityPartnerData = + ActivityPartnerData["activities"][number]["activity"]; type AccountActivity = { id: string; finishedOn: Date; + projectIds: string[]; + meetingId?: string; }; -const mapActivity = ({ +const mapActivityAccount = ({ id, createdAt, finishedOn, -}: ProjectActivityData): AccountActivity => ({ + forProjects, + meetingActivitiesId, +}: ProjectActivityAccountData): AccountActivity => ({ id, finishedOn: new Date(finishedOn || createdAt), + projectIds: forProjects?.map((p) => p.projects.id) ?? [], + meetingId: meetingActivitiesId || undefined, }); +const mapActivityPartner = ({ + id, + createdAt, + finishedOn, + forProjects, + meetingActivitiesId, +}: ProjectActivityPartnerData): AccountActivity => ({ + id, + finishedOn: new Date(finishedOn || createdAt), + projectIds: forProjects?.map((p) => p.projects.id) ?? [], + meetingId: meetingActivitiesId || undefined, +}); + +const fetchPartnerActivities = async (accountId: string) => { + const { data, errors } = await client.models.Projects.listByPartnerId( + { + partnerId: accountId, + }, + { + selectionSet: selectionSetPartner, + } + ); + if (errors) { + handleApiErrors(errors, "Error loading partner activities"); + throw errors; + } + if (!data) + throw new Error(`Receive partner activities failed for ${accountId}`); + try { + return flow( + flatMap((d: ActivityPartnerData) => d.activities), + map("activity"), + filter((a) => !!a), + map(mapActivityPartner), + sortBy((a: AccountActivity) => -a.finishedOn.getTime()) + )(data); + } catch (error) { + console.error("fetchPartnerActivities", { error }); + throw error; + } +}; + const fetchAccountActivities = (accountId?: string) => async () => { if (!accountId) return; + const partnerActivities = await fetchPartnerActivities(accountId); const { data, errors } = await client.models.AccountProjects.listAccountProjectsByAccountId( { accountId }, { - selectionSet, + selectionSet: selectionSetAccount, } ); if (errors) { @@ -49,11 +116,13 @@ const fetchAccountActivities = (accountId?: string) => async () => { throw new Error(`Receive account activities failed for ${accountId}`); try { return flow( - flatMap((d: ActivityData) => d.projects.activities), + flatMap((d: ActivityAccountData) => d.projects.activities), map("activity"), filter((a) => !!a), - map(mapActivity), - sortBy((a: AccountActivity) => -a.finishedOn.getTime()) + map(mapActivityAccount), + union(partnerActivities), + uniqBy("id"), + sortBy((a) => -a.finishedOn.getTime()) )(data); } catch (error) { console.error("fetchAccountActivities", { error }); diff --git a/components/accounts/AccountNotes.tsx b/components/accounts/AccountNotes.tsx index ef35c3fa6..3e3435c92 100644 --- a/components/accounts/AccountNotes.tsx +++ b/components/accounts/AccountNotes.tsx @@ -1,6 +1,6 @@ import useAccountActivities from "@/api/useAccountActivities"; import { FC } from "react"; -import ActivityComponent from "../activities/activity"; +import LeanActivitiy from "../activities/activity-lean"; import DefaultAccordionItem from "../ui-elements/accordion/DefaultAccordionItem"; type AccountNotesProps = { @@ -13,13 +13,7 @@ const AccountNotes: FC = ({ accountId }) => { return ( {activities?.map((a) => ( - + ))} ); diff --git a/docs/releases/next.md b/docs/releases/next.md index 319b0f86d..0f4b83641 100644 --- a/docs/releases/next.md +++ b/docs/releases/next.md @@ -1,11 +1,10 @@ # Partnerprojekte bei Partnerdetails zeigen (Version :VERSION) -- Bei Accounts tauchen auch Projekte auf, bei denen der Account als Partner engagiert ist +- Bei Accounts tauchen auch Projekte auf, bei denen der Account als Partner engagiert ist. +- Auch die Notizen werden angezeigt, wenn der Account als Partner im Projekt involviert ist. ## In Arbeit -- das gleiche gilt auch für die Notizen. - ## Geplant ### Meetings