Skip to content

Commit dcf764c

Browse files
committed
add space type filtering
1 parent c128c89 commit dcf764c

2 files changed

Lines changed: 51 additions & 51 deletions

File tree

.changeset/add-space-type.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,13 @@
44
---
55

66
Add `type` field to `PublicSpace` type returned by `Space.findManyPublic()` and `usePublicSpaces()`. The type is either `"PERSONAL"` or `"DAO"`.
7+
8+
Add `spaceType` filter option to `Space.findManyPublic()` and `usePublicSpaces()` to filter spaces by type. Example usage:
9+
10+
```typescript
11+
// Filter for DAO spaces only
12+
const { data } = usePublicSpaces({ filter: { spaceType: 'DAO' } });
13+
14+
// Combine with existing filters
15+
const { data } = usePublicSpaces({ filter: { editorId: 'xxx', spaceType: 'PERSONAL' } });
16+
```

packages/hypergraph/src/space/find-many-public.ts

Lines changed: 41 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -30,34 +30,7 @@ const spaceFields = `
3030
}
3131
`;
3232

33-
const spacesQueryDocument = `
34-
query spaces {
35-
spaces {
36-
${spaceFields}
37-
}
38-
}
39-
`;
40-
41-
const memberSpacesQueryDocument = `
42-
query memberSpaces($accountId: UUID!) {
43-
spaces(filter: {members: {some: {memberSpaceId: {is: $accountId}}}}) {
44-
${spaceFields}
45-
}
46-
}
47-
`;
48-
49-
const editorSpacesQueryDocument = `
50-
query editorSpaces($accountId: UUID!) {
51-
spaces(filter: {editors: {some: {memberSpaceId: {is: $accountId}}}}) {
52-
${spaceFields}
53-
}
54-
}
55-
`;
56-
57-
export const SpaceTypeSchema = EffectSchema.Union(
58-
EffectSchema.Literal('PERSONAL'),
59-
EffectSchema.Literal('DAO'),
60-
);
33+
export const SpaceTypeSchema = EffectSchema.Union(EffectSchema.Literal('PERSONAL'), EffectSchema.Literal('DAO'));
6134

6235
export type SpaceType = typeof SpaceTypeSchema.Type;
6336

@@ -96,10 +69,6 @@ type SpacesQueryResult = {
9669
}[];
9770
};
9871

99-
type SpacesQueryVariables = {
100-
accountId: string;
101-
};
102-
10372
type SpaceQueryEntry = NonNullable<SpacesQueryResult['spaces']>[number];
10473

10574
const decodeSpace = EffectSchema.decodeUnknownEither(PublicSpaceSchema);
@@ -150,14 +119,49 @@ export const parseSpacesQueryResult = (queryResult: SpacesQueryResult) => {
150119
};
151120

152121
export type FindManyPublicFilter =
153-
| Readonly<{ memberId: string; editorId?: never }>
154-
| Readonly<{ editorId: string; memberId?: never }>
155-
| Readonly<{ memberId?: undefined; editorId?: undefined }>;
122+
| Readonly<{ memberId: string; editorId?: never; spaceType?: SpaceType }>
123+
| Readonly<{ editorId: string; memberId?: never; spaceType?: SpaceType }>
124+
| Readonly<{ memberId?: undefined; editorId?: undefined; spaceType?: SpaceType }>;
156125

157126
export type FindManyPublicParams = Readonly<{
158127
filter?: FindManyPublicFilter;
159128
}>;
160129

130+
const buildFilterString = (filter?: FindManyPublicFilter): string | undefined => {
131+
const conditions: string[] = [];
132+
133+
if (filter?.memberId) {
134+
conditions.push(`members: {some: {memberSpaceId: {is: "${filter.memberId}"}}}`);
135+
}
136+
137+
if (filter?.editorId) {
138+
conditions.push(`editors: {some: {memberSpaceId: {is: "${filter.editorId}"}}}`);
139+
}
140+
141+
if (filter?.spaceType) {
142+
conditions.push(`type: {is: ${filter.spaceType}}`);
143+
}
144+
145+
if (conditions.length === 0) {
146+
return undefined;
147+
}
148+
149+
return `filter: {${conditions.join(', ')}}`;
150+
};
151+
152+
const buildSpacesQuery = (filter?: FindManyPublicFilter): string => {
153+
const filterString = buildFilterString(filter);
154+
const filterClause = filterString ? `(${filterString})` : '';
155+
156+
return `
157+
query spaces {
158+
spaces${filterClause} {
159+
${spaceFields}
160+
}
161+
}
162+
`;
163+
};
164+
161165
export const findManyPublic = async (params?: FindManyPublicParams) => {
162166
const filter = params?.filter;
163167
const memberId = filter?.memberId;
@@ -168,21 +172,7 @@ export const findManyPublic = async (params?: FindManyPublicParams) => {
168172
}
169173

170174
const endpoint = `${Config.getApiOrigin()}/v2/graphql`;
171-
172-
if (memberId) {
173-
const queryResult = await request<SpacesQueryResult, SpacesQueryVariables>(endpoint, memberSpacesQueryDocument, {
174-
accountId: memberId,
175-
});
176-
return parseSpacesQueryResult(queryResult);
177-
}
178-
179-
if (editorId) {
180-
const queryResult = await request<SpacesQueryResult, SpacesQueryVariables>(endpoint, editorSpacesQueryDocument, {
181-
accountId: editorId,
182-
});
183-
return parseSpacesQueryResult(queryResult);
184-
}
185-
186-
const queryResult = await request<SpacesQueryResult>(endpoint, spacesQueryDocument);
175+
const queryDocument = buildSpacesQuery(filter);
176+
const queryResult = await request<SpacesQueryResult>(endpoint, queryDocument);
187177
return parseSpacesQueryResult(queryResult);
188178
};

0 commit comments

Comments
 (0)