import React, { FC, useEffect, useState } from 'react' import { OrderItem, Parcel, ServiceDetails } from '../model/models' import { splitWeightIntoParcels } from './parcels' import { __experimentalNumberControl as NumberControl, Button, } from '@wordpress/components' import { plus, trash } from '@wordpress/icons' import { useI18n } from '@wordpress/react-i18n' import { sprintf } from '@wordpress/i18n' export declare interface PackageDetailsProps { selectedShippingOption?: string availableServices: Array toCountry: string items: Array totalWeightInGrams: number parcels: Array setParcels: (parcels: Array) => void } const PackageDetails: FC = ({ selectedShippingOption, availableServices, toCountry, items, totalWeightInGrams, parcels, setParcels, }) => { const { __ } = useI18n() const [maxWeight, setMaxWeight] = useState() const [packageLimits, setPackageLimits] = useState() useEffect(() => { const shippingOption = availableServices?.find( value => value.service_id === selectedShippingOption ) const maxWeightInGram = shippingOption && shippingOption.max_weight_in_kgs ? shippingOption.max_weight_in_kgs * 1000 - 100 : undefined setMaxWeight(maxWeightInGram) if (shippingOption?.max_dimensions) { setPackageLimits( sprintf( // translators: 1: maximum weight in kilograms, 2: length in cm, 3: width in cm, 4: height in cm __( 'Max parcel weight %1$s kg. Within %2$s x %3$s X %4$s cm.', 'posten-bring-checkout' ), shippingOption.max_weight_in_kgs.toString(), shippingOption.max_dimensions.length.toString(), shippingOption.max_dimensions.width.toString(), shippingOption.max_dimensions.height.toString() ) ) } else if (shippingOption?.max_edges) { setPackageLimits( // translators: 1: maximum weight in kilograms, 2: longest edge in cm, 3: sum of edges in cm sprintf( __( 'Max parcel weight %1$s kg. Max length %2$s cm. Length + width + height = max %3$s cm.', 'posten-bring-checkout' ), shippingOption.max_weight_in_kgs.toString(), shippingOption.max_edges.max_longest_edge.toString(), shippingOption.max_edges.max_sum_of_edges.toString() ) ) } else if (shippingOption?.max_circumference) { setPackageLimits( sprintf( // translators: 1: maximum weight in kilograms, 2: longest edge in cm, 3: max circumference in cm __( 'Max parcel weight %1$s kg. Max length %2$s cm. Max circumference + longest edge = max %3$s cm.', 'posten-bring-checkout' ), shippingOption.max_weight_in_kgs.toString(), shippingOption.max_circumference.max_longest_side.toString(), shippingOption.max_circumference.max_circumference_plus_longest_side.toString() ) ) } }, [selectedShippingOption, availableServices, __]) useEffect(() => { setParcels(splitWeightIntoParcels(totalWeightInGrams, maxWeight)) }, [totalWeightInGrams, setParcels, maxWeight]) const addParcel = () => { const updatedParcels = [...parcels] updatedParcels.push({ weightInGrams: 100 }) setParcels(updatedParcels) } const updateParcelWeight = (index: number, weight: number) => { const updatedParcels = [...parcels] updatedParcels[index].weightInGrams = weight setParcels(updatedParcels) } const removeParcel = (index: number) => { if (index <= 0 || index >= parcels.length) return const updatedParcels = [...parcels] updatedParcels.splice(index, 1) setParcels(updatedParcels) } const canAddParcel = selectedShippingOption === '0340' ? toCountry !== 'Norway' : !['3584', '3639'].includes(selectedShippingOption ?? '') return ( parcels.length > 0 && (
{canAddParcel && ( )} {parcels.map((parcel, idx) => ( {canAddParcel && ( )} ))}
{__('Parcel', 'posten-bring-checkout')}
{__('Weight', 'posten-bring-checkout')}
{sprintf( // translators: 1: parcel number, 2: total number of parcels __('Parcel %1$s of %2$s', 'posten-bring-checkout'), `${idx + 1}`, `${parcels.length}` )}
updateParcelWeight(idx, Number(value) * 1000) } __next40pxDefaultSize={true} />
{idx > 0 && (
{packageLimits}
) ) } export default PackageDetails