import React, { FC, useCallback, useEffect, useRef, useState } from 'react' import { InputControl, Text, Badge } from '@wordpress/ui' import { ServiceIcon } from '@mybring/iconsystem' import { Button, Notice, Popover } from '@wordpress/components' import { Icon, pencil } from '@wordpress/icons' import { MybringCustomerAndServices, Order, ServiceDetails, } from '../model/models' import ShippingOptionSelector from './ShippingOptionSelector' import apiFetch from '@wordpress/api-fetch' import { useI18n } from '@wordpress/react-i18n' import OrderListDetails from './OrderListDetails' import { sprintf } from '@wordpress/i18n' export declare interface OrderListItemProps { order: Order mapServiceId: (_: string | undefined) => string | undefined | React.ReactNode customers: Array customerNumber?: string onSave: (_orderId: string, _?: Order) => void error: string | undefined } const OrderListItem: FC = ({ order, customers, customerNumber, mapServiceId, onSave, error, }) => { const [editable, setEditable] = React.useState(false) const [editedOrder, setEditedOrder] = React.useState(order) const [displayOrderDetails, setDisplayOrderDetails] = useState(false) const [displayValidationErrors, setDisplayValidationErrors] = useState(false) const [availableServicesForOrder, setAvailableServicesForOrder] = useState< Array >([]) const shippingOptionSelectRef = useRef(null) const { __, _nx } = useI18n() useEffect(() => { if (!editable) { setEditedOrder(order) } }, [order, editable]) useEffect(() => { if (editable) { setTimeout(() => shippingOptionSelectRef.current?.focus(), 50) } }, [editable]) const getServiceIcon = useCallback((serviceId?: string): string => { switch (serviceId) { case null: return '' case '3584': return 'serviceicon-mailbox' case '5800': case '5801': case '0340': case '0342': return 'serviceicon-pointer' case '5100': return 'serviceicon-crate' case '5400': return 'serviceicon-crate-on-pallet' case '5000': case '0330': case '0332': return 'serviceicon-building' default: return 'serviceicon-door' } }, []) const onEdit = useCallback(async () => { if (availableServicesForOrder.length === 0) { setAvailableServicesForOrder( await apiFetch({ path: '/posten-bring-checkout/services' }) ) } setEditable(true) shippingOptionSelectRef.current?.focus() }, [availableServicesForOrder.length]) const onChange = (field: string, value: string | number) => { if (editedOrder) { setEditedOrder({ ...editedOrder, [field]: value, }) } } const onSaveChanges = () => { onSave(order.order_id, editedOrder) setEditable(false) } return (
  • {!editable ? (
    {order.order_shipping_option ? ( <>
    {`${mapServiceId(order.order_shipping_option)} - ${ order.total_weight / 1000 } kg`}
    ) : ( <> {!order.order_validation_errors.some( value => value.bookingDisabled ) && (
    {__( 'No shipping option selected', 'posten-bring-checkout' )}
    )} )} {error && ( {__( 'An error occurred! We have been notified and are investigating. Please try again later, or contact us via ', 'posten-bring-checkout' )} {__( 'checkout.implementering@posten.no', 'posten-bring-checkout' )} )} {!error && !order.order_validation_errors.some( value => value.bookingDisabled ) ? ( <> {order.nvit && order.items.some( i => i.hs_code == null || i.hs_code === '' ) && ( <> NVIT {sprintf( _nx( '%d item requires an HS code', '%d items require an HS code', order.items.filter( i => i.hs_code == null || i.hs_code === '' ).length, 'Validation message presented when one or more items requires an HS code and shipment is labelled as an NVIT (Norske varer i transitt) shipment', 'posten-bring-checkout' ), order.items.filter( i => i.hs_code == null || i.hs_code === '' ).length )} )} ) : ( <> {!error && ( )} )}
    ) : (
    { onChange('order_shipping_option', selected) }} availableServices={availableServicesForOrder} selectedCustomer={ customerNumber || customers[0].customerNumber } customersAndServices={customers} preSelectedShippingOption={undefined} label={undefined} ref={shippingOptionSelectRef} /> onChange('total_weight', e.target.valueAsNumber * 1000) } />
    )}
  • ) } export default OrderListItem