Skip to content

Commit

Permalink
Merge pull request #178 from cabcookie:split-notes-in-blocks
Browse files Browse the repository at this point in the history
Projektempfehlungen korrigiert
  • Loading branch information
cabcookie authored Aug 10, 2024
2 parents 99f6e69 + 2d91d38 commit 60e09df
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 62 deletions.
18 changes: 9 additions & 9 deletions api/useMeetingProjectRecommendation.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { generateClient } from "aws-amplify/data";
import { flatMap, flatten, flow, get, uniq } from "lodash/fp";
import useSWR from "swr";
import { handleApiErrors } from "./globals";
import { Meeting } from "./useMeetings";
const client = generateClient<Schema>();

const fetchPerson = async (personId: string) => {
Expand All @@ -25,20 +24,21 @@ const fetchPerson = async (personId: string) => {
)(data);
};

const fetchMeetingProjectRecommendation = (meeting?: Meeting) => async () => {
if (!meeting) return;
const data = await Promise.all(meeting.participantIds.map(fetchPerson));
return flow(flatten, uniq)(data) as string[] | undefined;
};
const fetchMeetingProjectRecommendation =
(participantIds: string[] | undefined) => async () => {
if (!participantIds) return;
const data = await Promise.all(participantIds.map(fetchPerson));
return flow(flatten, uniq)(data) as string[] | undefined;
};

const useMeetingProjectRecommendation = (meeting?: Meeting) => {
const useMeetingProjectRecommendation = (participantIds?: string[]) => {
const {
data: projectIds,
isLoading,
error,
} = useSWR(
`/api/meetings/${meeting?.id}/recommendations`,
fetchMeetingProjectRecommendation(meeting)
`/api/meetings/${participantIds}/recommendations`,
fetchMeetingProjectRecommendation(participantIds)
);

return { projectIds, isLoading, error };
Expand Down
76 changes: 27 additions & 49 deletions components/meetings/meeting-project-recommender.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,57 +5,24 @@ import { Meeting } from "@/api/useMeetings";
import usePeople from "@/api/usePeople";
import { Person } from "@/api/usePerson";
import useCurrentUser, { User } from "@/api/useUser";
import { compact, filter, flatMap, flow, get, map, uniq } from "lodash/fp";
import { compact, filter, flatMap, flow, get, map } from "lodash/fp";
import { FC, useEffect, useState } from "react";

const filterOutProjectIds = (avoidIds: string[] | undefined) => (id: string) =>
!avoidIds?.includes(id);

const getPersonById = (people: Person[] | undefined) => (personId: string) =>
people?.find((p) => p.id === personId);

const getUniqAccountIds =
(people: Person[] | undefined) =>
(meeting: Meeting | undefined): string[] | undefined =>
flow(
get("participantIds"),
map(getPersonById(people)),
flatMap(get("accounts")),
map(get("accountId")),
uniq
)(meeting);

const getNonInternalAccountIds =
const filterInternalParticipants =
(user: User | undefined, people: Person[] | undefined) =>
(meeting: Meeting | undefined): string[] | undefined =>
flow(
getUniqAccountIds(people),
filter((id) => !!id && id !== user?.currentAccountId)
)(meeting);

const filterProjecsByAccountIds =
(projects: Project[] | undefined) =>
(accountIds: string[] | undefined): Project[] | undefined =>
flow(
filter(
(p: Project) =>
!accountIds ||
accountIds.length === 0 ||
p.accountIds.some((accountId) => accountIds.includes(accountId))
)
)(projects);

const filterInternalProjects =
(
meeting: Meeting | undefined,
user: User | undefined,
people: Person[] | undefined
) =>
(projects: Project[]): Project[] | undefined =>
flow(
getNonInternalAccountIds(user, people),
filterProjecsByAccountIds(projects)
)(meeting);
(participantIds: string[] | undefined): string[] | undefined => {
if (!user?.currentAccountId) return participantIds;
const externalIds = participantIds?.filter((id) =>
people
?.find((p) => p.id === id)
?.accounts.some((a) => a.accountId !== user.currentAccountId)
);
if (!externalIds?.length) return participantIds;
return externalIds;
};

type MeetingProjectRecommenderProps = {
meeting?: Meeting | undefined;
Expand All @@ -66,12 +33,24 @@ const MeetingProjectRecommender: FC<MeetingProjectRecommenderProps> = ({
meeting,
addProjectToMeeting,
}) => {
const { projectIds } = useMeetingProjectRecommendation(meeting);
const { user } = useCurrentUser();
const [relevantParticipantIds, setRelevantParticipantIds] = useState<
string[] | undefined
>();
const { projectIds } = useMeetingProjectRecommendation(
relevantParticipantIds
);
const { getProjectById } = useProjectsContext();
const { getAccountNamesByIds } = useAccountsContext();
const [projects, setProjects] = useState<Project[] | undefined>();
const { people } = usePeople();
const { user } = useCurrentUser();

useEffect(() => {
flow(
filterInternalParticipants(user, people),
setRelevantParticipantIds
)(meeting?.participantIds);
}, [meeting?.participantIds, people, user]);

useEffect(() => {
flow(
Expand All @@ -83,10 +62,9 @@ const MeetingProjectRecommender: FC<MeetingProjectRecommenderProps> = ({
map(getProjectById),
compact,
filter((p: Project) => !p.done),
filterInternalProjects(meeting, user, people),
setProjects
)(projectIds);
}, [meeting, projectIds, user, people, getProjectById]);
}, [getProjectById, meeting, projectIds]);

return (
<div className="px-1 md:px-2 text-sm text-muted-foreground">
Expand Down
6 changes: 2 additions & 4 deletions docs/releases/next.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
# Benutzerprofil mit Person verknüpfen und vorgeschlagene Projekte filtern, wenn nur Externe (Version :VERSION)
# Projektempfehlungen korrigiert (Version :VERSION)

- Das eigene Benutzerprofil kann nun mit einer Person in der Personenliste verknüpft werden. Darüber wird dann auch ermittelt, zu welcher Firma der Benutzer aktuell gehört, um besser unterscheiden zu können, ob ein Meeting, das der Benutzer angelegt hat, ein internes Meeting ist oder auch Externe beteiligt sind.
- Personen können nun gelöscht werden. Das ist dann wichtig, wenn man versehentlich ein Duplikat erzeugt hat. Die Auflösung von Duplikaten liegt noch beim Anwender.
- Bei vorgeschlagenenen Projekten in einem Meeting wird berücksichtigt, ob es ein rein internes Meeting ist oder ob Externe dabei sind. Sind Externe dabei, werden nur Projekte vorgeschlagen, an denen die Externen beteilgt sind.
- Die Projektempfehlungen wurden nicht verlässlich gefiltert. Das ist nun korrigiert.

## In Arbeit

Expand Down

0 comments on commit 60e09df

Please sign in to comment.