Skip to content

Commit

Permalink
feat: Add new selectors site filter (#155)
Browse files Browse the repository at this point in the history
* feat: Add new selectors site filter

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).

* refactor: Return lookup from selector

* fix: Return empty object is userId is null
  • Loading branch information
david-code authored Nov 3, 2023
1 parent 869dd73 commit 41efed4
Show file tree
Hide file tree
Showing 2 changed files with 56 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 @@ -185,3 +186,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]: 'manager',
[site2.id]: 'contributor',
[site3.id]: undefined,
[site4.id]: 'contributor',
});
});
31 changes: 31 additions & 0 deletions src/selectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,37 @@ const selectProjectsWithUserRole = createSelector(
),
);

const selectProjectUserRoles = (state: SharedState, userId?: string) => {
return Object.fromEntries(
mapValues(state.project.projects, project => {
if (userId === undefined) {
return {};
}
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, role];
}),
);
},
);

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

0 comments on commit 41efed4

Please sign in to comment.