UNPKG

@replyke/core

Version:

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

113 lines 4.74 kB
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