Skip to content

Commit

Permalink
feat: Add new selectors site filter
Browse files Browse the repository at this point in the history
We need to associate sites to user roles. The user role is selected as
the user's role in the project to which the site belongs (undefined if
the site does not belong to a project).
  • Loading branch information
David Code Howard committed Nov 1, 2023
1 parent ed971c1 commit 00faf6e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/selectors.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
import {
selectProjectMembershipsWithUsers,
selectProjectsWithTransferrableSites,
selectSitesAndUserRoles,
} from 'terraso-client-shared/selectors';
import { Site } from 'terraso-client-shared/site/siteSlice';
import { SerializableSet } from 'terraso-client-shared/store/utils';
Expand Down Expand Up @@ -184,3 +185,27 @@ test('can access all projects with role', () => {
unaffiliatedSites: [{ siteId: site3.id, siteName: site3.name }],
});
});

test('select user sites with project role', () => {
const user = generateUser();
const project1 = generateProject([generateMembership(user.id, 'manager')]);
const project2 = generateProject([
generateMembership(user.id, 'contributor'),
]);
const site1 = generateSite(project1);
const site2 = generateSite(project2);
const site3 = generateSite();
const site4 = generateSite(project2);

const store = createStore(
initState([project1, project2], [user], [site1, site2, site3, site4]),
);

const roles = selectSitesAndUserRoles(store.getState(), user.id);
expect(roles).toStrictEqual({
[site1.id]: [site1, 'manager'],
[site2.id]: [site2, 'contributor'],
[site3.id]: [site3, undefined],
[site4.id]: [site4, 'contributor'],
});
});
28 changes: 28 additions & 0 deletions src/selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,34 @@ const selectProjectsWithUserRole = createSelector(
),
);

const selectProjectUserRoles = (state: SharedState, userId: string) => {
return Object.fromEntries(
mapValues(state.project.projects, project => {
const membership = Object.values(project.memberships).find(
({ userId: membUserId }) => membUserId === userId,
);
if (membership) {
return [project.id, membership.userRole];
}
}).filter((item): item is [string, UserRole] => item !== undefined),
);
};

export const selectSitesAndUserRoles = createSelector(
[selectProjectUserRoles, selectSites],
(userRoleMap, sites) => {
return Object.fromEntries(
mapValues(sites, site => {
let role = undefined;
if (site.projectId !== undefined) {
role = userRoleMap[site.projectId];
}
return [site.id, [site, role]];
}),
);
},
);

export const selectProjectsWithTransferrableSites = createSelector(
[selectProjectsWithUserRole, selectSites],
(projects, sites) => {
Expand Down

0 comments on commit 00faf6e

Please sign in to comment.