import { Component, createMemo, createSignal, For, onMount } from 'solid-js'; import Button from '@src/components/Button'; import styles from './Metabox.module.scss'; import { courierMap, deleteOrderFulfillment, editOrderFulfillments, fetchSelectedCouriers, customDomain, lineItems, editingOrderNumber, fulfillments, fetchOrderFulfillments, } from '@src/storages/tracking'; import EditTrackingModal, { editingFulfillment, setEditingFulfillment, setTitle } from '@src/components/EditTrackingModal'; import { Fulfillment, FulfillmentFactory, FulfillmentTrackingFactory } from '@src/typings/trackings'; import {forEach} from "lodash-es"; import md5 from 'crypto-js/md5'; import { v4 as uuidv4 } from 'uuid'; export const Metabox: Component = () => { const [showModal, setShowModal] = createSignal(false); const orderId = window.woocommerce_admin_meta_boxes.post_id; onMount(() => { fetchOrderFulfillments(orderId); fetchSelectedCouriers(); }); const handleOk = async (f: Fulfillment) => { const now = new Date().toISOString().replace(/\.\d+(?=Z$)/, ''); if (f.id === '') { f.created_at = now; f.updated_at = now; f.id = uuidv4(); } else { f.updated_at = now; } forEach(f.trackings || [], (tracking) => { if (tracking.tracking_id === '') { tracking.tracking_id = md5(`${tracking.slug}-${tracking.tracking_number}`).toString(); } }); await editOrderFulfillments(orderId, f); setShowModal(false); setEditingFulfillment(FulfillmentFactory.createDefault()); await fetchOrderFulfillments(orderId); }; const handleCancel = () => { setShowModal(false); setEditingFulfillment(FulfillmentFactory.createDefault()); }; const handleDelete = async (fulfillmentId: string) => { await deleteOrderFulfillment(orderId, fulfillmentId); await fetchOrderFulfillments(orderId); }; const itemsMap = createMemo(() => { const itemsMap = new Map(); fulfillments().forEach(fulfillment => { const items = fulfillment.items || []; const arr = items.map((item, index) => { const itemId = Number(item.id); const match = lineItems().find(l => itemId === l.id); return { name: match?.name || String(item.id), quantity: item.quantity, }; }); itemsMap.set(String(fulfillment.id), arr); }); return itemsMap; }); const formatTackingLink = (tracking_number: string, slug: string) => { return /^https?:\/\//.test(customDomain()) ? `${customDomain()}/${slug}/${tracking_number}` : `https://${customDomain()}/${slug}/${tracking_number}`; }; return (
{fulfillments().map((fulfillment, index) => (
Shipment {index + 1}
{(itemsMap().get(fulfillment.id) || []).map((item, index) => (
{item.name}  x {item.quantity}
))}
{fulfillment.trackings.map((tracking, index) => (
Tracking {index + 1}
{courierMap().get(tracking.slug)?.name || tracking.slug} 
))}
))}
); }; export default Metabox;