feat: space export (#506)

* wip

* Space export
* option to export pages with children
* include attachments in exports
* unified export UI

* cleanup

* fix: change export icon

* add export button to space settings

* cleanups

* export name
This commit is contained in:
Philip Okugbe
2024-11-30 19:47:22 +00:00
committed by GitHub
parent 9fa432dba9
commit fe83557767
20 changed files with 926 additions and 117 deletions

View File

@ -1,56 +1,72 @@
import api from '@/lib/api-client';
import api from "@/lib/api-client";
import {
IAddSpaceMember,
IChangeSpaceMemberRole,
IExportSpaceParams,
IRemoveSpaceMember,
ISpace,
} from "@/features/space/types/space.types";
import { IPagination, QueryParams } from "@/lib/types.ts";
import { IUser } from "@/features/user/types/user.types.ts";
import { saveAs } from "file-saver";
export async function getSpaces(params?: QueryParams): Promise<IPagination<ISpace>> {
export async function getSpaces(
params?: QueryParams
): Promise<IPagination<ISpace>> {
const req = await api.post("/spaces", params);
return req.data;
}
export async function getSpaceById(spaceId: string): Promise<ISpace> {
const req = await api.post<ISpace>('/spaces/info', { spaceId });
const req = await api.post<ISpace>("/spaces/info", { spaceId });
return req.data;
}
export async function createSpace(data: Partial<ISpace>): Promise<ISpace> {
const req = await api.post<ISpace>('/spaces/create', data);
const req = await api.post<ISpace>("/spaces/create", data);
return req.data;
}
export async function updateSpace(data: Partial<ISpace>): Promise<ISpace> {
const req = await api.post<ISpace>('/spaces/update', data);
const req = await api.post<ISpace>("/spaces/update", data);
return req.data;
}
export async function deleteSpace(spaceId: string): Promise<void> {
await api.post<void>('/spaces/delete', { spaceId });
await api.post<void>("/spaces/delete", { spaceId });
}
export async function getSpaceMembers(
spaceId: string
): Promise<IPagination<IUser>> {
const req = await api.post<any>('/spaces/members', { spaceId });
const req = await api.post<any>("/spaces/members", { spaceId });
return req.data;
}
export async function addSpaceMember(data: IAddSpaceMember): Promise<void> {
await api.post('/spaces/members/add', data);
await api.post("/spaces/members/add", data);
}
export async function removeSpaceMember(
data: IRemoveSpaceMember
): Promise<void> {
await api.post('/spaces/members/remove', data);
await api.post("/spaces/members/remove", data);
}
export async function changeMemberRole(
data: IChangeSpaceMemberRole
): Promise<void> {
await api.post('/spaces/members/change-role', data);
await api.post("/spaces/members/change-role", data);
}
export async function exportSpace(data: IExportSpaceParams): Promise<void> {
const req = await api.post("/spaces/export", data, {
responseType: "blob",
});
const fileName = req?.headers["content-disposition"]
.split("filename=")[1]
.replace(/"/g, "");
saveAs(req.data, decodeURIComponent(fileName));
}