@shipengine/elements 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs CHANGED
@@ -13757,6 +13757,7 @@ const getShipmentSchema = ({
13757
13757
  const minimumShipDate = nextDayCutoff(17);
13758
13758
  const maximumShipDate = daysAfter(7, minimumShipDate);
13759
13759
  const ShipmentForm = ({
13760
+ addressLoading,
13760
13761
  addressPreference,
13761
13762
  charsetWarning,
13762
13763
  carriers,
@@ -14103,9 +14104,7 @@ const ShipmentForm = ({
14103
14104
  });
14104
14105
  if (errors) throw new Error(errors.map(e => e.message).join(", "));
14105
14106
  if (!shipment) throw new Error("errorMessages.unableToLoad.shipment");
14106
- const addressPreferenceIsEmpty =
14107
- // undefined means it's still loading
14108
- addressPreference !== undefined && isEmptyAddress(addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection);
14107
+ const addressPreferenceIsEmpty = !addressLoading && isEmptyAddress(addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection); // undefined means it's still loading
14109
14108
  return jsxRuntime.jsxs("form", Object.assign({
14110
14109
  id: "shipment-form",
14111
14110
  onSubmit: formLogger.capture(handleSubmit)
@@ -14504,7 +14503,7 @@ const ShipmentForm = ({
14504
14503
  }, {
14505
14504
  children: jsxRuntime.jsx(SubmitButton, Object.assign({
14506
14505
  control: form.control,
14507
- disabled: isEditShipFormToOpen,
14506
+ disabled: addressLoading || isEditShipFormToOpen || addressPreferenceIsEmpty,
14508
14507
  variant: giger.ButtonVariant.OUTLINED
14509
14508
  }, {
14510
14509
  children: t("purchase-label:actions.calculateRates", {
@@ -15966,7 +15965,12 @@ const useAddress = ({
15966
15965
  error: parseAddressErrors,
15967
15966
  mutateAsync: parseAddress
15968
15967
  } = alchemy.useParseAddress();
15969
- const [addressPreference, setAddressPreference] = React.useState();
15968
+ const [addressPreference, _setAddressPreference] = React.useState();
15969
+ const [loading, setLoading] = React.useState(true);
15970
+ const setAddressPreference = React.useCallback((...args) => {
15971
+ setLoading(false);
15972
+ _setAddressPreference(...args);
15973
+ }, [_setAddressPreference]);
15970
15974
  const toggle = React.useCallback(() => {
15971
15975
  let updatedSelection = undefined;
15972
15976
  setAddressPreference(prevState => {
@@ -16071,6 +16075,8 @@ const useAddress = ({
16071
16075
  // without this check it will keep reverting a one-off label's address preference back to empty for some reason
16072
16076
  !isEmptyAddress(shipment === null || shipment === void 0 ? void 0 : shipment.shipTo)) {
16073
16077
  void handleValidateAddress(shipment === null || shipment === void 0 ? void 0 : shipment.shipTo, salesOrder === null || salesOrder === void 0 ? void 0 : salesOrder.shipTo);
16078
+ } else {
16079
+ setLoading(false);
16074
16080
  }
16075
16081
  }, [addressPreference, handleValidateAddress, salesOrder === null || salesOrder === void 0 ? void 0 : salesOrder.shipTo, shipment === null || shipment === void 0 ? void 0 : shipment.shipTo]);
16076
16082
  const charsetWarning = React.useMemo(() => Object.keys((addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection) || {}).reduce((warning, key) => {
@@ -16092,6 +16098,7 @@ const useAddress = ({
16092
16098
  }, undefined), [addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection, t]);
16093
16099
  const errors = [...(validateAddressErrors !== null && validateAddressErrors !== void 0 ? validateAddressErrors : []), ...(updateShipmentErrors !== null && updateShipmentErrors !== void 0 ? updateShipmentErrors : []), ...(parseAddressErrors !== null && parseAddressErrors !== void 0 ? parseAddressErrors : [])];
16094
16100
  return {
16101
+ addressLoading: loading,
16095
16102
  addressErrors: errors.length > 0 ? errors : undefined,
16096
16103
  addressPreference,
16097
16104
  charsetWarning,
@@ -16508,6 +16515,7 @@ const useShipmentForm = ({
16508
16515
  reset: resetSalesOrderShipment
16509
16516
  } = alchemy.useUpdateSalesOrderShipment();
16510
16517
  const {
16518
+ addressLoading,
16511
16519
  addressErrors,
16512
16520
  addressPreference,
16513
16521
  charsetWarning,
@@ -16558,6 +16566,7 @@ const useShipmentForm = ({
16558
16566
  scrubber: React.useCallback(() => "common:errorMessages.noRatesAvailable", [])
16559
16567
  });
16560
16568
  return {
16569
+ addressLoading,
16561
16570
  addressPreference,
16562
16571
  carriers,
16563
16572
  charsetWarning,
@@ -16860,13 +16869,14 @@ const getDefaultWarehouse = warehouses => {
16860
16869
  return (_a = warehouses === null || warehouses === void 0 ? void 0 : warehouses.find(w => w.isDefault)) !== null && _a !== void 0 ? _a : warehouses === null || warehouses === void 0 ? void 0 : warehouses[0];
16861
16870
  };
16862
16871
 
16863
- const useGetOrCreateShipment = shipmentId => {
16872
+ const useGetOrCreateShipment = (onShipmentUpdated, shipmentId) => {
16864
16873
  var _a, _b;
16865
16874
  const {
16866
16875
  data: warehouses
16867
16876
  } = alchemy.useListWarehouses({
16868
16877
  enabled: shipmentId === undefined
16869
16878
  });
16879
+ const [shouldTriggerUpdate, setShouldTriggerUpdate] = React.useState(false);
16870
16880
  const createShipment = alchemy.useCreateShipment();
16871
16881
  // useCreateShipment as called by this hook will only ever create one shipment at a time,
16872
16882
  // lens it for convenience
@@ -16880,9 +16890,16 @@ const useGetOrCreateShipment = shipmentId => {
16880
16890
  createShipment.mutate({
16881
16891
  warehouseId: getDefaultWarehouse(warehouses).warehouseId
16882
16892
  });
16893
+ setShouldTriggerUpdate(true);
16883
16894
  }
16884
16895
  }, [warehouses, shipmentId, createShipment, createdShipment]);
16885
16896
  const getShipment = alchemy.useGetShipment(shipmentId !== null && shipmentId !== void 0 ? shipmentId : createdShipment === null || createdShipment === void 0 ? void 0 : createdShipment.shipmentId);
16897
+ React.useEffect(() => {
16898
+ if (shouldTriggerUpdate && getShipment.data) {
16899
+ onShipmentUpdated === null || onShipmentUpdated === void 0 ? void 0 : onShipmentUpdated(getShipment.data);
16900
+ setShouldTriggerUpdate(false);
16901
+ }
16902
+ }, [shouldTriggerUpdate, getShipment]);
16886
16903
  const errors = [...((_a = getShipment.error) !== null && _a !== void 0 ? _a : []), ...((_b = createShipment.error) !== null && _b !== void 0 ? _b : [])];
16887
16904
  return {
16888
16905
  errors: errors.length > 0 ? errors : undefined,
@@ -16901,7 +16918,7 @@ const PurchaseLabelByShipment = _a => {
16901
16918
  shipmentId
16902
16919
  } = _a,
16903
16920
  props = __rest(_a, ["onLoad", "onShipmentUpdated", "shipmentId"]);
16904
- const _b = useGetOrCreateShipment(shipmentId),
16921
+ const _b = useGetOrCreateShipment(onShipmentUpdated, shipmentId),
16905
16922
  {
16906
16923
  shipment
16907
16924
  } = _b,
package/index.js CHANGED
@@ -13725,6 +13725,7 @@ const getShipmentSchema = ({
13725
13725
  const minimumShipDate = nextDayCutoff(17);
13726
13726
  const maximumShipDate = daysAfter(7, minimumShipDate);
13727
13727
  const ShipmentForm = ({
13728
+ addressLoading,
13728
13729
  addressPreference,
13729
13730
  charsetWarning,
13730
13731
  carriers,
@@ -14071,9 +14072,7 @@ const ShipmentForm = ({
14071
14072
  });
14072
14073
  if (errors) throw new Error(errors.map(e => e.message).join(", "));
14073
14074
  if (!shipment) throw new Error("errorMessages.unableToLoad.shipment");
14074
- const addressPreferenceIsEmpty =
14075
- // undefined means it's still loading
14076
- addressPreference !== undefined && isEmptyAddress(addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection);
14075
+ const addressPreferenceIsEmpty = !addressLoading && isEmptyAddress(addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection); // undefined means it's still loading
14077
14076
  return jsxs("form", Object.assign({
14078
14077
  id: "shipment-form",
14079
14078
  onSubmit: formLogger.capture(handleSubmit)
@@ -14472,7 +14471,7 @@ const ShipmentForm = ({
14472
14471
  }, {
14473
14472
  children: jsx(SubmitButton, Object.assign({
14474
14473
  control: form.control,
14475
- disabled: isEditShipFormToOpen,
14474
+ disabled: addressLoading || isEditShipFormToOpen || addressPreferenceIsEmpty,
14476
14475
  variant: ButtonVariant.OUTLINED
14477
14476
  }, {
14478
14477
  children: t("purchase-label:actions.calculateRates", {
@@ -15934,7 +15933,12 @@ const useAddress = ({
15934
15933
  error: parseAddressErrors,
15935
15934
  mutateAsync: parseAddress
15936
15935
  } = useParseAddress();
15937
- const [addressPreference, setAddressPreference] = useState();
15936
+ const [addressPreference, _setAddressPreference] = useState();
15937
+ const [loading, setLoading] = useState(true);
15938
+ const setAddressPreference = useCallback((...args) => {
15939
+ setLoading(false);
15940
+ _setAddressPreference(...args);
15941
+ }, [_setAddressPreference]);
15938
15942
  const toggle = useCallback(() => {
15939
15943
  let updatedSelection = undefined;
15940
15944
  setAddressPreference(prevState => {
@@ -16039,6 +16043,8 @@ const useAddress = ({
16039
16043
  // without this check it will keep reverting a one-off label's address preference back to empty for some reason
16040
16044
  !isEmptyAddress(shipment === null || shipment === void 0 ? void 0 : shipment.shipTo)) {
16041
16045
  void handleValidateAddress(shipment === null || shipment === void 0 ? void 0 : shipment.shipTo, salesOrder === null || salesOrder === void 0 ? void 0 : salesOrder.shipTo);
16046
+ } else {
16047
+ setLoading(false);
16042
16048
  }
16043
16049
  }, [addressPreference, handleValidateAddress, salesOrder === null || salesOrder === void 0 ? void 0 : salesOrder.shipTo, shipment === null || shipment === void 0 ? void 0 : shipment.shipTo]);
16044
16050
  const charsetWarning = useMemo(() => Object.keys((addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection) || {}).reduce((warning, key) => {
@@ -16060,6 +16066,7 @@ const useAddress = ({
16060
16066
  }, undefined), [addressPreference === null || addressPreference === void 0 ? void 0 : addressPreference.selection, t]);
16061
16067
  const errors = [...(validateAddressErrors !== null && validateAddressErrors !== void 0 ? validateAddressErrors : []), ...(updateShipmentErrors !== null && updateShipmentErrors !== void 0 ? updateShipmentErrors : []), ...(parseAddressErrors !== null && parseAddressErrors !== void 0 ? parseAddressErrors : [])];
16062
16068
  return {
16069
+ addressLoading: loading,
16063
16070
  addressErrors: errors.length > 0 ? errors : undefined,
16064
16071
  addressPreference,
16065
16072
  charsetWarning,
@@ -16476,6 +16483,7 @@ const useShipmentForm = ({
16476
16483
  reset: resetSalesOrderShipment
16477
16484
  } = useUpdateSalesOrderShipment();
16478
16485
  const {
16486
+ addressLoading,
16479
16487
  addressErrors,
16480
16488
  addressPreference,
16481
16489
  charsetWarning,
@@ -16526,6 +16534,7 @@ const useShipmentForm = ({
16526
16534
  scrubber: useCallback(() => "common:errorMessages.noRatesAvailable", [])
16527
16535
  });
16528
16536
  return {
16537
+ addressLoading,
16529
16538
  addressPreference,
16530
16539
  carriers,
16531
16540
  charsetWarning,
@@ -16828,13 +16837,14 @@ const getDefaultWarehouse = warehouses => {
16828
16837
  return (_a = warehouses === null || warehouses === void 0 ? void 0 : warehouses.find(w => w.isDefault)) !== null && _a !== void 0 ? _a : warehouses === null || warehouses === void 0 ? void 0 : warehouses[0];
16829
16838
  };
16830
16839
 
16831
- const useGetOrCreateShipment = shipmentId => {
16840
+ const useGetOrCreateShipment = (onShipmentUpdated, shipmentId) => {
16832
16841
  var _a, _b;
16833
16842
  const {
16834
16843
  data: warehouses
16835
16844
  } = useListWarehouses({
16836
16845
  enabled: shipmentId === undefined
16837
16846
  });
16847
+ const [shouldTriggerUpdate, setShouldTriggerUpdate] = useState(false);
16838
16848
  const createShipment = useCreateShipment();
16839
16849
  // useCreateShipment as called by this hook will only ever create one shipment at a time,
16840
16850
  // lens it for convenience
@@ -16848,9 +16858,16 @@ const useGetOrCreateShipment = shipmentId => {
16848
16858
  createShipment.mutate({
16849
16859
  warehouseId: getDefaultWarehouse(warehouses).warehouseId
16850
16860
  });
16861
+ setShouldTriggerUpdate(true);
16851
16862
  }
16852
16863
  }, [warehouses, shipmentId, createShipment, createdShipment]);
16853
16864
  const getShipment = useGetShipment(shipmentId !== null && shipmentId !== void 0 ? shipmentId : createdShipment === null || createdShipment === void 0 ? void 0 : createdShipment.shipmentId);
16865
+ useEffect(() => {
16866
+ if (shouldTriggerUpdate && getShipment.data) {
16867
+ onShipmentUpdated === null || onShipmentUpdated === void 0 ? void 0 : onShipmentUpdated(getShipment.data);
16868
+ setShouldTriggerUpdate(false);
16869
+ }
16870
+ }, [shouldTriggerUpdate, getShipment]);
16854
16871
  const errors = [...((_a = getShipment.error) !== null && _a !== void 0 ? _a : []), ...((_b = createShipment.error) !== null && _b !== void 0 ? _b : [])];
16855
16872
  return {
16856
16873
  errors: errors.length > 0 ? errors : undefined,
@@ -16869,7 +16886,7 @@ const PurchaseLabelByShipment = _a => {
16869
16886
  shipmentId
16870
16887
  } = _a,
16871
16888
  props = __rest(_a, ["onLoad", "onShipmentUpdated", "shipmentId"]);
16872
- const _b = useGetOrCreateShipment(shipmentId),
16889
+ const _b = useGetOrCreateShipment(onShipmentUpdated, shipmentId),
16873
16890
  {
16874
16891
  shipment
16875
16892
  } = _b,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shipengine/elements",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "typedoc": {
5
5
  "entryPoint": "./src/index.ts",
6
6
  "readmeFile": "../../README.md",
@@ -9,6 +9,7 @@ export type OnChangeAddressOptions = {
9
9
  };
10
10
  export type ShipmentFormMode = "browse_rates" | "select_service";
11
11
  export type ShipmentFormProps = {
12
+ addressLoading: boolean;
12
13
  addressPreference?: AddressPreference;
13
14
  carriers?: SE.Carrier[];
14
15
  charsetWarning?: CharsetWarning;
@@ -48,4 +49,4 @@ export type ShipmentFormFeatures = {
48
49
  selectService?: boolean;
49
50
  shippingPresets?: boolean;
50
51
  };
51
- export declare const ShipmentForm: ({ addressPreference, charsetWarning, carriers, customPackageTypes, errors, features, hydrateRef, insuranceAccount, isLoading, onApplyPreset, onChangeAddress, onChangeMode, onDirty, onSubmit, onSubmitParseShipTo, onToggleAddressPreferenceDisclosure, onUpdateCustoms, salesOrder, shipment, shippingPresets, warehouseId, warehouses, }: ShipmentFormProps) => import("@emotion/react/jsx-runtime").JSX.Element;
52
+ export declare const ShipmentForm: ({ addressLoading, addressPreference, charsetWarning, carriers, customPackageTypes, errors, features, hydrateRef, insuranceAccount, isLoading, onApplyPreset, onChangeAddress, onChangeMode, onDirty, onSubmit, onSubmitParseShipTo, onToggleAddressPreferenceDisclosure, onUpdateCustoms, salesOrder, shipment, shippingPresets, warehouseId, warehouses, }: ShipmentFormProps) => import("@emotion/react/jsx-runtime").JSX.Element;
@@ -9,6 +9,7 @@ export type UseAddressProps = {
9
9
  shipment?: SE.SalesOrderShipment;
10
10
  };
11
11
  export declare const useAddress: ({ compatibleCountryCodes, onChange, onValidation, salesOrder, shipment, }: UseAddressProps) => {
12
+ addressLoading: boolean;
12
13
  addressErrors: SE.CodedError[] | undefined;
13
14
  addressPreference: Templates.AddressPreference | undefined;
14
15
  charsetWarning: Templates.CharsetWarning | undefined;
@@ -13,6 +13,7 @@ export type UseShipmentFormProps = {
13
13
  shipment?: SE.SalesOrderShipment;
14
14
  };
15
15
  export declare const useShipmentForm: ({ compatibleCountryCodes, onAddressValidation, onApplyPreset, onChangeAddress, onShipmentUpdated, onSubmit, salesOrder, shipment, }: UseShipmentFormProps) => {
16
+ addressLoading: boolean;
16
17
  addressPreference: import("../../../components/templates").AddressPreference | undefined;
17
18
  carriers: SE.Carrier[] | undefined;
18
19
  charsetWarning: import("../../../components/templates").CharsetWarning | undefined;
@@ -1,6 +1,7 @@
1
- export declare const useGetOrCreateShipment: (shipmentId?: string) => {
1
+ import { SalesOrderShipment } from "@shipengine/alchemy";
2
+ export declare const useGetOrCreateShipment: (onShipmentUpdated: ((shipment: SalesOrderShipment) => void | Promise<void>) | undefined, shipmentId?: string) => {
2
3
  errors: import("@shipengine/alchemy").CodedError[] | undefined;
3
4
  isLoading: boolean;
4
- refetchShipment: <TPageData>(options?: (import("react-query").RefetchOptions & import("react-query").RefetchQueryFilters<TPageData>) | undefined) => Promise<import("react-query").QueryObserverResult<import("@shipengine/alchemy").SalesOrderShipment, import("@shipengine/alchemy").CodedError[]>>;
5
- shipment: import("@shipengine/alchemy").SalesOrderShipment | undefined;
5
+ refetchShipment: <TPageData>(options?: (import("react-query").RefetchOptions & import("react-query").RefetchQueryFilters<TPageData>) | undefined) => Promise<import("react-query").QueryObserverResult<SalesOrderShipment, import("@shipengine/alchemy").CodedError[]>>;
6
+ shipment: SalesOrderShipment | undefined;
6
7
  };