@replyke/core
Version:
Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.
113 lines • 4.74 kB
JavaScript
import { useCallback } from "react";
import useAxiosPrivate from "../../config/useAxiosPrivate";
import useProject from "../projects/useProject";
function isBrowserFile(file) {
return typeof File !== "undefined" && file instanceof File;
}
function useCreateEntity() {
const axios = useAxiosPrivate();
const { projectId } = useProject();
const createEntity = useCallback(async (props) => {
const { foreignId, sourceId, spaceId, title, content, attachments, keywords, mentions, location, metadata, excludeUserId, requireUser, isDraft, images, files, } = props;
if (!projectId) {
throw new Error("No projectId available.");
}
// DECISION POINT: JSON vs FormData
const hasImages = images && images.files.length > 0;
const hasFiles = files && files.files.length > 0;
if (hasImages || hasFiles) {
// NEW PATH: Multipart FormData request
const formData = new FormData();
// Append standard entity fields
if (foreignId !== undefined)
formData.append("foreignId", foreignId);
if (sourceId !== undefined)
formData.append("sourceId", sourceId);
if (spaceId !== undefined)
formData.append("spaceId", spaceId);
if (title !== undefined)
formData.append("title", title);
if (content !== undefined)
formData.append("content", content);
if (attachments !== undefined)
formData.append("attachments", JSON.stringify(attachments));
if (keywords !== undefined)
formData.append("keywords", JSON.stringify(keywords));
if (mentions !== undefined)
formData.append("mentions", JSON.stringify(mentions));
if (location !== undefined)
formData.append("location", JSON.stringify(location));
if (metadata !== undefined)
formData.append("metadata", JSON.stringify(metadata));
if (excludeUserId !== undefined)
formData.append("excludeUserId", excludeUserId.toString());
if (requireUser !== undefined)
formData.append("requireUser", requireUser.toString());
if (isDraft !== undefined)
formData.append("isDraft", isDraft.toString());
// Append images
if (hasImages) {
images.files.forEach((file) => {
if (isBrowserFile(file)) {
formData.append("images.files", file, file.name);
}
else {
formData.append("images.files", {
uri: file.uri,
type: file.type || "image/jpeg",
name: file.name,
});
}
});
if (images.options) {
formData.append("images.options", JSON.stringify(images.options));
}
}
// Append files
if (hasFiles) {
files.files.forEach((file) => {
if (isBrowserFile(file)) {
formData.append("files.files", file, file.name);
}
else {
formData.append("files.files", {
uri: file.uri,
type: file.type || "application/octet-stream",
name: file.name,
});
}
});
if (files.options) {
formData.append("files.options", JSON.stringify(files.options));
}
}
// Make multipart request
const response = await axios.post(`/${projectId}/entities`, formData, {
headers: { "Content-Type": "multipart/form-data" },
});
return response.data;
}
else {
// EXISTING PATH: JSON request (unchanged)
const response = await axios.post(`/${projectId}/entities`, {
foreignId,
sourceId,
spaceId,
title,
content,
attachments,
keywords,
mentions,
location,
metadata,
excludeUserId,
requireUser,
isDraft,
});
return response.data;
}
}, [projectId, axios]);
return createEntity;
}
export default useCreateEntity;
//# sourceMappingURL=useCreateEntity.js.map