mirror of
https://github.com/vercel/commerce.git
synced 2025-05-12 20:57:51 +00:00
274 lines
7.0 KiB
TypeScript
274 lines
7.0 KiB
TypeScript
'use server';
|
|
|
|
import { renderToBuffer } from '@react-pdf/renderer';
|
|
import OrderConfirmationPdf from 'components/orders/order-confirmation-pdf';
|
|
import { handleUploadFile } from 'components/form/file-input/actions';
|
|
import { CORE_RETURN_FIELDS, TAGS, WARRANTY_FIELDS } from 'lib/constants';
|
|
import { getOrderConfirmationContent, updateOrderMetafields } from 'lib/shopify';
|
|
import {
|
|
CoreReturnStatus,
|
|
Order,
|
|
OrderConfirmationContent,
|
|
ShopifyOrderMetafield,
|
|
UpdateOrderMetafieldInput,
|
|
WarrantyStatus
|
|
} from 'lib/shopify/types';
|
|
import { revalidateTag } from 'next/cache';
|
|
import { cache } from 'react';
|
|
|
|
const getMetafieldValue = (
|
|
key: keyof ShopifyOrderMetafield,
|
|
newValue: { value?: string | null; type: string; key: string },
|
|
orderMetafields?: ShopifyOrderMetafield
|
|
): UpdateOrderMetafieldInput => {
|
|
return orderMetafields?.[key]?.id
|
|
? { id: orderMetafields[key]?.id!, value: newValue.value, key: newValue.key }
|
|
: { ...newValue, namespace: 'custom' };
|
|
};
|
|
|
|
export const activateWarranty = async (order: Order, formData: FormData) => {
|
|
let odometerFileId = null;
|
|
let installationFileId = null;
|
|
const odometerFile = formData.get('warranty_activation_odometer');
|
|
const installationFile = formData.get('warranty_activation_installation');
|
|
if (odometerFile) {
|
|
odometerFileId = await handleUploadFile({ file: odometerFile as File });
|
|
}
|
|
|
|
if (installationFile) {
|
|
installationFileId = await handleUploadFile({ file: installationFile as File });
|
|
}
|
|
|
|
// https://shopify.dev/docs/api/admin-graphql/2024-01/mutations/orderUpdate
|
|
const metafields = [
|
|
getMetafieldValue(
|
|
'warrantyActivationOdometer',
|
|
{
|
|
key: 'warranty_activation_odometer',
|
|
value: odometerFileId,
|
|
type: 'file_reference'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'warrantyActivationInstallation',
|
|
{
|
|
key: 'warranty_activation_installation',
|
|
value: installationFileId,
|
|
type: 'file_reference'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'warrantyActivationSelfInstall',
|
|
{
|
|
key: 'warranty_activation_self_install',
|
|
value: formData.get('warranty_activation_self_install') === 'on' ? 'true' : 'false',
|
|
type: 'boolean'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'warrantyActivationMileage',
|
|
{
|
|
key: 'warranty_activation_mileage',
|
|
value: formData.get('warranty_activation_mileage') as string | null,
|
|
type: 'number_integer'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'warrantyActivationVIN',
|
|
{
|
|
key: 'warranty_activation_vin',
|
|
value: formData.get('warranty_activation_vin') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
)
|
|
];
|
|
|
|
const shouldSetWarrantyStatusToActivated = WARRANTY_FIELDS.every((field) =>
|
|
metafields.find(({ key }) => (Array.isArray(field) ? field.includes(key) : key === field))
|
|
);
|
|
|
|
if (shouldSetWarrantyStatusToActivated) {
|
|
metafields.push({
|
|
key: 'warranty_status',
|
|
value: WarrantyStatus.Activated,
|
|
namespace: 'custom',
|
|
type: 'single_line_text_field'
|
|
});
|
|
}
|
|
|
|
try {
|
|
await updateOrderMetafields({
|
|
orderId: order.id,
|
|
metafields
|
|
});
|
|
|
|
revalidateTag(TAGS.orderMetafields);
|
|
} catch (error) {
|
|
console.log('activateWarranty action', error);
|
|
}
|
|
};
|
|
|
|
async function generateOrderConfirmationPDF(
|
|
order: Order,
|
|
content: OrderConfirmationContent,
|
|
signature1: string,
|
|
signature2: string,
|
|
signDate: string
|
|
) {
|
|
return renderToBuffer(
|
|
<OrderConfirmationPdf
|
|
order={order}
|
|
content={content}
|
|
signature1={signature1}
|
|
signature2={signature2}
|
|
date={signDate}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export const fetchOrderConfirmationContent = cache(async () => {
|
|
return getOrderConfirmationContent();
|
|
});
|
|
|
|
type ConfirmOrderOptions = {
|
|
order: Order;
|
|
content: OrderConfirmationContent;
|
|
formData: FormData;
|
|
};
|
|
|
|
export const confirmOrder = async ({ order, content, formData }: ConfirmOrderOptions) => {
|
|
const signature1 = formData.get('signature1') as string;
|
|
const signature2 = formData.get('signature2') as string;
|
|
const signDate = formData.get('date') as string;
|
|
|
|
const pdfBuffer = await generateOrderConfirmationPDF(
|
|
order,
|
|
content,
|
|
signature1,
|
|
signature2,
|
|
signDate
|
|
);
|
|
|
|
const fileName = `${new Date().getTime()}-${order.name}-signaturePdf.pdf`;
|
|
const file = new File([pdfBuffer], fileName, { type: 'application/pdf' });
|
|
|
|
const confirmationPDFId = await handleUploadFile({ file });
|
|
|
|
const rawFormData = [
|
|
{
|
|
key: 'customer_confirmation',
|
|
value: confirmationPDFId,
|
|
type: 'file_reference',
|
|
namespace: 'custom'
|
|
}
|
|
];
|
|
|
|
try {
|
|
await updateOrderMetafields({
|
|
orderId: order.id,
|
|
metafields: rawFormData
|
|
});
|
|
|
|
revalidateTag(TAGS.orderMetafields);
|
|
} catch (error) {
|
|
console.log('activateWarranty action', error);
|
|
}
|
|
};
|
|
|
|
export async function returnCore(order: Order, formData: FormData) {
|
|
const metafields = [
|
|
getMetafieldValue(
|
|
'coreReturnName',
|
|
{
|
|
key: 'core_return_name',
|
|
value: formData.get('name') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'coreReturnEmail',
|
|
{
|
|
key: 'core_return_email',
|
|
value: formData.get('email') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'coreReturnPhone',
|
|
{
|
|
key: 'core_return_phone',
|
|
value: formData.get('phone') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'coreReturnAddress',
|
|
{
|
|
key: 'core_return_address',
|
|
value: formData.get('address') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'coreReturnCity',
|
|
{
|
|
key: 'core_return_city',
|
|
value: formData.get('city') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'coreReturnState',
|
|
{
|
|
key: 'core_return_state',
|
|
value: formData.get('state[code]') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
),
|
|
getMetafieldValue(
|
|
'coreReturnZip',
|
|
{
|
|
key: 'core_return_zip',
|
|
value: formData.get('zip') as string | null,
|
|
type: 'single_line_text_field'
|
|
},
|
|
order
|
|
)
|
|
];
|
|
|
|
const shouldSetCoreStatusToReturned = CORE_RETURN_FIELDS.every((field) =>
|
|
metafields.find(({ key }) => (Array.isArray(field) ? field.includes(key) : key === field))
|
|
);
|
|
|
|
if (shouldSetCoreStatusToReturned) {
|
|
metafields.push({
|
|
key: 'core_status',
|
|
value: CoreReturnStatus.PickupRequested,
|
|
namespace: 'custom',
|
|
type: 'single_line_text_field'
|
|
});
|
|
}
|
|
|
|
try {
|
|
await updateOrderMetafields({
|
|
orderId: order.id,
|
|
metafields
|
|
});
|
|
|
|
revalidateTag(TAGS.orderMetafields);
|
|
} catch (error) {
|
|
console.log('activateWarranty action', error);
|
|
}
|
|
}
|