mirror of
https://github.com/vercel/commerce.git
synced 2025-05-12 12:47:50 +00:00
87 lines
1.9 KiB
TypeScript
87 lines
1.9 KiB
TypeScript
'use server';
|
|
|
|
import { createFile, stageUploadFile, uploadFile } from 'lib/shopify';
|
|
import { StagedUploadsCreatePayload, UploadInput } from 'lib/shopify/types';
|
|
|
|
const prepareFilePayload = ({
|
|
stagedFileUpload,
|
|
file
|
|
}: {
|
|
stagedFileUpload: StagedUploadsCreatePayload;
|
|
file: File;
|
|
}) => {
|
|
const formData = new FormData();
|
|
|
|
const url = stagedFileUpload.url;
|
|
|
|
stagedFileUpload.parameters.forEach(({ name, value }) => {
|
|
formData.append(name, value);
|
|
});
|
|
|
|
formData.append('file', file);
|
|
return { url, formData };
|
|
};
|
|
|
|
const createStagedUploadFiles = async (params: UploadInput) => {
|
|
try {
|
|
const stagedTargets = await stageUploadFile(params);
|
|
if (!stagedTargets || stageUploadFile.length === 0) return null;
|
|
|
|
return JSON.parse(JSON.stringify(stagedTargets[0]));
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
};
|
|
|
|
const onUploadFile = async ({
|
|
url,
|
|
formData,
|
|
fileName,
|
|
resourceUrl,
|
|
contentType = 'FILE'
|
|
}: {
|
|
url: string;
|
|
formData: FormData;
|
|
fileName: string;
|
|
resourceUrl: string;
|
|
contentType?: 'FILE' | 'IMAGE';
|
|
}) => {
|
|
try {
|
|
await uploadFile({ url, formData });
|
|
return await createFile({
|
|
alt: fileName,
|
|
contentType,
|
|
originalSource: resourceUrl
|
|
});
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
};
|
|
|
|
export const handleUploadFile = async ({ file }: { file: File }) => {
|
|
if (!file) return;
|
|
try {
|
|
const stagedTarget = await createStagedUploadFiles({
|
|
filename: file.name,
|
|
fileSize: String(file.size),
|
|
httpMethod: 'POST',
|
|
resource: 'FILE',
|
|
mimeType: file.type
|
|
});
|
|
|
|
if (stagedTarget) {
|
|
const data = prepareFilePayload({ file, stagedFileUpload: stagedTarget });
|
|
|
|
const result = await onUploadFile({
|
|
...data,
|
|
fileName: file.name,
|
|
resourceUrl: stagedTarget.resourceUrl
|
|
});
|
|
|
|
return result?.[0]?.id;
|
|
}
|
|
} catch (error) {
|
|
console.log(error);
|
|
}
|
|
};
|