@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
74 lines • 3.2 kB
JavaScript
import { useCallback } from "react";
import useProject from "../projects/useProject";
import useAxiosPrivate from "../../config/useAxiosPrivate";
function useCreateSpace() {
const { projectId } = useProject();
const axios = useAxiosPrivate();
const createSpace = useCallback(async (props) => {
if (!projectId) {
throw new Error("No projectId available.");
}
if (!props.name) {
throw new Error("Space name is required");
}
// Build FormData if files are present, otherwise use JSON
const hasFiles = props.avatar || props.banner;
if (hasFiles) {
const formData = new FormData();
// Append regular fields
formData.append("name", props.name);
if (props.slug !== undefined && props.slug !== null) {
formData.append("slug", props.slug);
}
if (props.description !== undefined && props.description !== null) {
formData.append("description", props.description);
}
if (props.readingPermission) {
formData.append("readingPermission", props.readingPermission);
}
if (props.postingPermission) {
formData.append("postingPermission", props.postingPermission);
}
if (props.requireJoinApproval !== undefined) {
formData.append("requireJoinApproval", String(props.requireJoinApproval));
}
if (props.metadata) {
formData.append("metadata", JSON.stringify(props.metadata));
}
if (props.parentSpaceId) {
formData.append("parentSpaceId", props.parentSpaceId);
}
// Append avatar file and options
if (props.avatar) {
formData.append("avatarFile", props.avatar.file);
formData.append("avatarFile.options", JSON.stringify(props.avatar.options));
}
// Append banner file and options
if (props.banner) {
formData.append("bannerFile", props.banner.file);
formData.append("bannerFile.options", JSON.stringify(props.banner.options));
}
const response = await axios.post(`/${projectId}/spaces`, formData, {
headers: { "Content-Type": "multipart/form-data" },
});
return response.data;
}
else {
// No files - use JSON request (backward compatibility)
const response = await axios.post(`/${projectId}/spaces`, {
name: props.name,
slug: props.slug,
description: props.description,
readingPermission: props.readingPermission,
postingPermission: props.postingPermission,
requireJoinApproval: props.requireJoinApproval,
metadata: props.metadata,
parentSpaceId: props.parentSpaceId,
});
return response.data;
}
}, [projectId, axios]);
return createSpace;
}
export default useCreateSpace;
//# sourceMappingURL=useCreateSpace.js.map