UNPKG

@replyke/core

Version:

Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.

332 lines 19.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.unbanMember = exports.removeMember = exports.declineMember = exports.approveMember = exports.updateMemberRole = exports.fetchUserSpaces = exports.fetchSpaceMembers = exports.leaveSpace = exports.joinSpace = exports.fetchSpaceBreadcrumb = exports.fetchSpaceChildren = exports.deleteSpace = exports.updateSpace = exports.fetchSpaceBySlug = exports.fetchSpaceByShortId = exports.fetchSpace = exports.fetchSpaces = exports.createSpace = exports.useUnbanMemberMutation = exports.useRemoveMemberMutation = exports.useDeclineMemberMutation = exports.useApproveMemberMutation = exports.useUpdateMemberRoleMutation = exports.useLazyFetchUserSpacesQuery = exports.useFetchUserSpacesQuery = exports.useLazyFetchSpaceMembersQuery = exports.useFetchSpaceMembersQuery = exports.useLeaveSpaceMutation = exports.useJoinSpaceMutation = exports.useLazyFetchSpaceBreadcrumbQuery = exports.useFetchSpaceBreadcrumbQuery = exports.useLazyFetchSpaceChildrenQuery = exports.useFetchSpaceChildrenQuery = exports.useDeleteSpaceMutation = exports.useUpdateSpaceMutation = exports.useLazyFetchSpaceBySlugQuery = exports.useFetchSpaceBySlugQuery = exports.useLazyFetchSpaceByShortIdQuery = exports.useFetchSpaceByShortIdQuery = exports.useLazyFetchSpaceQuery = exports.useFetchSpaceQuery = exports.useLazyFetchSpacesQuery = exports.useFetchSpacesQuery = exports.useCreateSpaceMutation = exports.spacesApi = void 0; const baseApi_1 = require("./baseApi"); // ===== API Endpoints ===== exports.spacesApi = baseApi_1.baseApi.injectEndpoints({ endpoints: (builder) => ({ // ===== CRUD Operations ===== // Create a new space createSpace: builder.mutation({ query: ({ projectId, ...body }) => ({ url: `/${projectId}/spaces`, method: "POST", body, }), invalidatesTags: (result, error, { parentSpaceId }) => [ { type: "Space", id: "LIST" }, // Invalidate parent's children list if creating under a parent ...(parentSpaceId ? [{ type: "Space", id: `${parentSpaceId}-CHILDREN` }] : []), ], }), // Fetch many spaces (list with filters) fetchSpaces: builder.query({ query: ({ projectId, ...params }) => { const queryParams = new URLSearchParams(); if (params.page !== undefined) queryParams.append("page", params.page.toString()); if (params.limit !== undefined) queryParams.append("limit", params.limit.toString()); if (params.sortBy) queryParams.append("sortBy", params.sortBy); if (params.searchSlug) queryParams.append("searchSlug", params.searchSlug); if (params.searchName) queryParams.append("searchName", params.searchName); if (params.searchDescription) queryParams.append("searchDescription", params.searchDescription); if (params.searchAny) queryParams.append("searchAny", params.searchAny); if (params.readingPermission) queryParams.append("readingPermission", params.readingPermission); if (params.memberOf !== undefined) queryParams.append("memberOf", params.memberOf.toString()); if (params.parentSpaceId !== undefined) { // Convert null to "null" string for API queryParams.append("parentSpaceId", params.parentSpaceId === null ? "null" : params.parentSpaceId); } return { url: `/${projectId}/spaces?${queryParams.toString()}`, method: "GET", }; }, providesTags: (result) => [ { type: "Space", id: "LIST" }, ...(result?.data?.map(({ id }) => ({ type: "Space", id })) ?? []), ], }), // Fetch single space by ID (returns detailed space with memberPermissions, parentSpace, childSpaces) fetchSpace: builder.query({ query: ({ projectId, spaceId }) => ({ url: `/${projectId}/spaces/${spaceId}`, method: "GET", }), providesTags: (result, error, { spaceId }) => [ { type: "Space", id: spaceId }, ], }), // Fetch space by shortId (returns detailed space) fetchSpaceByShortId: builder.query({ query: ({ projectId, shortId }) => ({ url: `/${projectId}/spaces/by-short-id?shortId=${shortId}`, method: "GET", }), providesTags: (result) => [ ...(result ? [{ type: "Space", id: result.id }] : []), ], }), // Fetch space by slug (returns detailed space) fetchSpaceBySlug: builder.query({ query: ({ projectId, slug }) => ({ url: `/${projectId}/spaces/by-slug?slug=${slug}`, method: "GET", }), providesTags: (result) => [ ...(result ? [{ type: "Space", id: result.id }] : []), ], }), // Update space (returns detailed space) updateSpace: builder.mutation({ query: ({ projectId, spaceId, update }) => ({ url: `/${projectId}/spaces/${spaceId}`, method: "PATCH", body: update, }), // Optimistically update the cache async onQueryStarted({ projectId, spaceId, update }, { dispatch, queryFulfilled }) { const patches = []; // Update in fetchSpace query patches.push(dispatch(exports.spacesApi.util.updateQueryData("fetchSpace", { projectId, spaceId }, (draft) => { Object.assign(draft, update); }))); try { await queryFulfilled; } catch { // Revert optimistic update on failure patches.forEach((patch) => patch.undo()); } }, invalidatesTags: (result, error, { spaceId }) => [ { type: "Space", id: spaceId }, { type: "Space", id: "LIST" }, ], }), // Delete space deleteSpace: builder.mutation({ query: ({ projectId, spaceId }) => ({ url: `/${projectId}/spaces/${spaceId}`, method: "DELETE", }), invalidatesTags: (result, error, { spaceId }) => [ { type: "Space", id: spaceId }, { type: "Space", id: "LIST" }, // Invalidate children queries as they're cascade deleted { type: "Space", id: `${spaceId}-CHILDREN` }, ], }), // ===== Hierarchy Operations ===== // Fetch child spaces fetchSpaceChildren: builder.query({ query: ({ projectId, spaceId, page = 1, limit = 20 }) => ({ url: `/${projectId}/spaces/${spaceId}/children?page=${page}&limit=${limit}`, method: "GET", }), providesTags: (result, error, { spaceId }) => [ { type: "Space", id: `${spaceId}-CHILDREN` }, ...(result?.map(({ id }) => ({ type: "Space", id })) ?? []), ], }), // Fetch space breadcrumb fetchSpaceBreadcrumb: builder.query({ query: ({ projectId, spaceId }) => ({ url: `/${projectId}/spaces/${spaceId}/breadcrumb`, method: "GET", }), providesTags: (result, error, { spaceId }) => [ { type: "Space", id: `${spaceId}-BREADCRUMB` }, ], }), // ===== Membership Operations ===== // Join a space joinSpace: builder.mutation({ query: ({ projectId, spaceId }) => ({ url: `/${projectId}/spaces/${spaceId}/join`, method: "POST", }), // Optimistically update member count and member permissions async onQueryStarted({ projectId, spaceId }, { dispatch, queryFulfilled }) { const patches = []; // Update space query to increment member count and add memberPermissions patches.push(dispatch(exports.spacesApi.util.updateQueryData("fetchSpace", { projectId, spaceId }, (draft) => { draft.membersCount += 1; // Note: memberPermissions will be updated with actual data from response }))); try { const { data: member } = await queryFulfilled; // Update with actual member data dispatch(exports.spacesApi.util.updateQueryData("fetchSpace", { projectId, spaceId }, (draft) => { // Filter out "rejected" status as it's not valid for memberPermissions const status = member.status === "rejected" ? null : member.status; draft.memberPermissions = { isAdmin: member.role === "admin", isModerator: member.role === "moderator" || member.role === "admin", isMember: member.status === "active", status, canPost: member.status === "active", canModerate: member.role === "moderator" || member.role === "admin", canRead: true, }; })); } catch { // Revert optimistic update on failure patches.forEach((patch) => patch.undo()); } }, invalidatesTags: (result, error, { spaceId }) => [ { type: "Space", id: spaceId }, { type: "SpaceMember", id: spaceId }, ], }), // Leave a space leaveSpace: builder.mutation({ query: ({ projectId, spaceId }) => ({ url: `/${projectId}/spaces/${spaceId}/leave`, method: "DELETE", }), // Optimistically update member count and member permissions async onQueryStarted({ projectId, spaceId }, { dispatch, queryFulfilled }) { const patches = []; // Update space query to decrement member count and remove memberPermissions patches.push(dispatch(exports.spacesApi.util.updateQueryData("fetchSpace", { projectId, spaceId }, (draft) => { draft.membersCount = Math.max(0, draft.membersCount - 1); draft.memberPermissions = null; }))); try { await queryFulfilled; } catch { // Revert optimistic update on failure patches.forEach((patch) => patch.undo()); } }, invalidatesTags: (result, error, { spaceId }) => [ { type: "Space", id: spaceId }, { type: "SpaceMember", id: spaceId }, ], }), // Fetch space members fetchSpaceMembers: builder.query({ query: ({ projectId, spaceId, ...params }) => { const queryParams = new URLSearchParams(); if (params.page !== undefined) queryParams.append("page", params.page.toString()); if (params.limit !== undefined) queryParams.append("limit", params.limit.toString()); if (params.role) queryParams.append("role", params.role); if (params.status) queryParams.append("status", params.status); return { url: `/${projectId}/spaces/${spaceId}/members?${queryParams.toString()}`, method: "GET", }; }, providesTags: (result, error, { spaceId }) => [ { type: "SpaceMember", id: spaceId }, ...(result?.map(({ id }) => ({ type: "SpaceMember", id })) ?? []), ], }), // Fetch user's spaces fetchUserSpaces: builder.query({ query: ({ projectId, ...params }) => { const queryParams = new URLSearchParams(); if (params.page !== undefined) queryParams.append("page", params.page.toString()); if (params.limit !== undefined) queryParams.append("limit", params.limit.toString()); if (params.status) queryParams.append("status", params.status); if (params.role) queryParams.append("role", params.role); if (params.all) queryParams.append("all", "true"); const queryString = queryParams.toString(); return { url: `/${projectId}/spaces/user-spaces${queryString ? `?${queryString}` : ""}`, method: "GET", }; }, providesTags: (result) => [ { type: "Space", id: "USER-SPACES" }, ...(result?.map(({ id }) => ({ type: "Space", id })) ?? []), ], }), // Update member role (admin only) updateMemberRole: builder.mutation({ query: ({ projectId, spaceId, memberId, role }) => ({ url: `/${projectId}/spaces/${spaceId}/members/${memberId}/role`, method: "PATCH", body: { role }, }), invalidatesTags: (result, error, { spaceId, memberId }) => [ { type: "SpaceMember", id: spaceId }, { type: "SpaceMember", id: memberId }, ], }), // Approve pending member (moderator+) approveMember: builder.mutation({ query: ({ projectId, spaceId, memberId }) => ({ url: `/${projectId}/spaces/${spaceId}/members/${memberId}/approve`, method: "PATCH", }), invalidatesTags: (result, error, { spaceId, memberId }) => [ { type: "SpaceMember", id: spaceId }, { type: "SpaceMember", id: memberId }, ], }), // Decline pending member (moderator+) declineMember: builder.mutation({ query: ({ projectId, spaceId, memberId }) => ({ url: `/${projectId}/spaces/${spaceId}/members/${memberId}/decline`, method: "PATCH", }), invalidatesTags: (result, error, { spaceId, memberId }) => [ { type: "SpaceMember", id: spaceId }, { type: "SpaceMember", id: memberId }, ], }), // Remove/ban member (moderator+) removeMember: builder.mutation({ query: ({ projectId, spaceId, memberId }) => ({ url: `/${projectId}/spaces/${spaceId}/members/${memberId}`, method: "DELETE", }), invalidatesTags: (result, error, { spaceId, memberId }) => [ { type: "SpaceMember", id: spaceId }, { type: "SpaceMember", id: memberId }, { type: "Space", id: spaceId }, // Update member count ], }), // Unban a banned member (moderator+) unbanMember: builder.mutation({ query: ({ projectId, spaceId, memberId }) => ({ url: `/${projectId}/spaces/${spaceId}/members/${memberId}/unban`, method: "PATCH", }), invalidatesTags: (result, error, { spaceId, memberId }) => [ { type: "SpaceMember", id: spaceId }, { type: "SpaceMember", id: memberId }, ], }), }), }); // Export hooks for use in components exports.useCreateSpaceMutation = exports.spacesApi.useCreateSpaceMutation, exports.useFetchSpacesQuery = exports.spacesApi.useFetchSpacesQuery, exports.useLazyFetchSpacesQuery = exports.spacesApi.useLazyFetchSpacesQuery, exports.useFetchSpaceQuery = exports.spacesApi.useFetchSpaceQuery, exports.useLazyFetchSpaceQuery = exports.spacesApi.useLazyFetchSpaceQuery, exports.useFetchSpaceByShortIdQuery = exports.spacesApi.useFetchSpaceByShortIdQuery, exports.useLazyFetchSpaceByShortIdQuery = exports.spacesApi.useLazyFetchSpaceByShortIdQuery, exports.useFetchSpaceBySlugQuery = exports.spacesApi.useFetchSpaceBySlugQuery, exports.useLazyFetchSpaceBySlugQuery = exports.spacesApi.useLazyFetchSpaceBySlugQuery, exports.useUpdateSpaceMutation = exports.spacesApi.useUpdateSpaceMutation, exports.useDeleteSpaceMutation = exports.spacesApi.useDeleteSpaceMutation, exports.useFetchSpaceChildrenQuery = exports.spacesApi.useFetchSpaceChildrenQuery, exports.useLazyFetchSpaceChildrenQuery = exports.spacesApi.useLazyFetchSpaceChildrenQuery, exports.useFetchSpaceBreadcrumbQuery = exports.spacesApi.useFetchSpaceBreadcrumbQuery, exports.useLazyFetchSpaceBreadcrumbQuery = exports.spacesApi.useLazyFetchSpaceBreadcrumbQuery, exports.useJoinSpaceMutation = exports.spacesApi.useJoinSpaceMutation, exports.useLeaveSpaceMutation = exports.spacesApi.useLeaveSpaceMutation, exports.useFetchSpaceMembersQuery = exports.spacesApi.useFetchSpaceMembersQuery, exports.useLazyFetchSpaceMembersQuery = exports.spacesApi.useLazyFetchSpaceMembersQuery, exports.useFetchUserSpacesQuery = exports.spacesApi.useFetchUserSpacesQuery, exports.useLazyFetchUserSpacesQuery = exports.spacesApi.useLazyFetchUserSpacesQuery, exports.useUpdateMemberRoleMutation = exports.spacesApi.useUpdateMemberRoleMutation, exports.useApproveMemberMutation = exports.spacesApi.useApproveMemberMutation, exports.useDeclineMemberMutation = exports.spacesApi.useDeclineMemberMutation, exports.useRemoveMemberMutation = exports.spacesApi.useRemoveMemberMutation, exports.useUnbanMemberMutation = exports.spacesApi.useUnbanMemberMutation; // Export for manual cache management _a = exports.spacesApi.endpoints, exports.createSpace = _a.createSpace, exports.fetchSpaces = _a.fetchSpaces, exports.fetchSpace = _a.fetchSpace, exports.fetchSpaceByShortId = _a.fetchSpaceByShortId, exports.fetchSpaceBySlug = _a.fetchSpaceBySlug, exports.updateSpace = _a.updateSpace, exports.deleteSpace = _a.deleteSpace, exports.fetchSpaceChildren = _a.fetchSpaceChildren, exports.fetchSpaceBreadcrumb = _a.fetchSpaceBreadcrumb, exports.joinSpace = _a.joinSpace, exports.leaveSpace = _a.leaveSpace, exports.fetchSpaceMembers = _a.fetchSpaceMembers, exports.fetchUserSpaces = _a.fetchUserSpaces, exports.updateMemberRole = _a.updateMemberRole, exports.approveMember = _a.approveMember, exports.declineMember = _a.declineMember, exports.removeMember = _a.removeMember, exports.unbanMember = _a.unbanMember; //# sourceMappingURL=spacesApi.js.map