Skip to content

Commit

Permalink
Add getMember API function and refactor related components
Browse files Browse the repository at this point in the history
  • Loading branch information
jmetrikat committed Feb 8, 2025
1 parent 5a457e0 commit 282d614
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 15 deletions.
26 changes: 26 additions & 0 deletions src/api/getMember.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { apiFetch } from "../helpers/api";
import { apiEndpoints } from "../helpers/constants";
import { Member } from "../helpers/schemas";
import { mapMember } from "../mappers/members";

export async function getMember(
spaceId: string,
objectId: string,
): Promise<{
member: Member | null;
}> {
const { url, method } = apiEndpoints.getMember(spaceId, objectId);
try {
const response = await apiFetch<{ member: Member }>(url, { method: method });
return {
member: response ? await mapMember(response.member) : null,
};
} catch (error) {
if (error instanceof Error && error.message.includes("404")) {
return {
member: null,
};
}
throw error;
}
}
4 changes: 2 additions & 2 deletions src/api/getObject.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { mapObject } from "../mappers/objects";

export async function getObject(
spaceId: string,
object_id: string,
objectId: string,
): Promise<{
object: SpaceObject | null;
}> {
const { url, method } = apiEndpoints.getObject(spaceId, object_id);
const { url, method } = apiEndpoints.getObject(spaceId, objectId);
try {
const response = await apiFetch<{ object: SpaceObject }>(url, { method: method });
return {
Expand Down
4 changes: 2 additions & 2 deletions src/api/getType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { mapType } from "../mappers/types";

export async function getType(
spaceId: string,
type_id: string,
typeId: string,
): Promise<{
type: Type | null;
}> {
const { url, method } = apiEndpoints.getType(spaceId, type_id);
const { url, method } = apiEndpoints.getType(spaceId, typeId);
try {
const response = await apiFetch<{ type: Type }>(url, { method: method });
return {
Expand Down
4 changes: 2 additions & 2 deletions src/components/ObjectList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -102,14 +102,14 @@ export default function ObjectList({ spaceId }: ObjectListProps) {
tooltip: `Type: ${object.type}`,
},
accessories: [
...(isPinned ? [{ icon: Icon.Star, tooltip: "Pinned" }] : []),
{
date: hasValidDate ? new Date(date) : undefined,
tooltip: hasValidDate
? `${getDateLabel()}: ${format(new Date(date), "EEEE d MMMM yyyy 'at' HH:mm")}`
: `Never ${getShortDateLabel()}`,
text: hasValidDate ? undefined : "—",
},
...(isPinned ? [{ icon: Icon.Star, tooltip: "Pinned" }] : []),
],
mutate: [mutateObjects, mutatePinnedObjects as MutatePromise<SpaceObject[] | Type[] | Member[]>],
isPinned,
Expand All @@ -135,7 +135,7 @@ export default function ObjectList({ spaceId }: ObjectListProps) {
key: member.id,
spaceId: spaceId,
objectId: member.id,
icon: member.icon,
icon: { source: member.icon, mask: Image.Mask.Circle },
title: member.name,
subtitle: { value: member.global_name, tooltip: `Global Name: ${member.global_name}` },
accessories: [
Expand Down
5 changes: 5 additions & 0 deletions src/helpers/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@ export const apiEndpoints = {
url: `${apiUrl}/spaces/${spaceId}/objects/${objectId}/export/${format}`,
method: "POST",
}),
// TODO: waiting for API to be implemented
getMember: (spaceId: string, objectId: string) => ({
url: `${apiUrl}/spaces/${spaceId}/members/${objectId}`,
method: "GET",
}),
getMembers: (spaceId: string, options: { offset: number; limit: number }) => ({
url: `${apiUrl}/spaces/${spaceId}/members${encodeQueryParams(options)}`,
method: "GET",
Expand Down
6 changes: 3 additions & 3 deletions src/hooks/usePinnedObjects.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { useCachedPromise } from "@raycast/utils";
import { getMember } from "../api/getMember";
import { getObject } from "../api/getObject";
import { getType } from "../api/getType";
import { getPinnedObjects, removePinnedObject } from "../helpers/localStorage";
import { Member } from "../helpers/schemas";

export function usePinnedObjects(spaceId: string) {
const { data, error, isLoading, mutate } = useCachedPromise(
Expand Down Expand Up @@ -79,8 +79,8 @@ export function usePinnedMembers(spaceId: string) {
const members = await Promise.all(
pinnedObjects.map(async ({ spaceId, objectId }) => {
try {
const response = (await getObject(spaceId, objectId)) as unknown as { object: Member };
return response.object;
const response = await getMember(spaceId, objectId);
return response.member;
} catch (error) {
const typedError = error as Error & { status?: number };
if (typedError.status === 404) {
Expand Down
23 changes: 17 additions & 6 deletions src/mappers/members.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,27 @@ import { Member } from "../helpers/schemas";

/**
* Map raw `Member` objects from the API into display-ready data (e.g., icon).
* @param members The raw `Member` objects from the API.
* @returns The display-ready `Member` objects.
*/
export async function mapMembers(members: Member[]): Promise<Member[]> {
return Promise.all(
members.map(async (member) => {
const icon = (await getIcon(member.icon)) || Icon.PersonCircle;
return {
...member,
name: member.name || "Untitled",
icon,
};
return mapMember(member);
}),
);
}

/**
* Map a raw `Member` object from the API into display-ready data (e.g., icon).
* @param member The raw `Member` object from the API.
* @returns The display-ready `Member` object.
*/
export async function mapMember(member: Member): Promise<Member> {
const icon = (await getIcon(member.icon)) || Icon.PersonCircle;
return {
...member,
name: member.name || "Untitled",
icon,
};
}

0 comments on commit 282d614

Please sign in to comment.