fixed Cannot delete Carrier, show message that there is link to LCR (#533)

* fixed Cannot delete Carrier, show message that there is link to LCR

* wip
This commit is contained in:
Hoan Luu Huu
2025-06-02 07:14:01 -04:00
committed by GitHub
parent 9ab592a898
commit 03e52e3dc5
2 changed files with 93 additions and 36 deletions
@@ -2,11 +2,11 @@ import React, { useEffect, useState } from "react";
import { P } from "@jambonz/ui-kit"; import { P } from "@jambonz/ui-kit";
import { Modal, ModalClose } from "src/components"; import { Modal, ModalClose } from "src/components";
import { getFetch } from "src/api"; import { getFetch, getLcrRoutes, getLcrs } from "src/api";
import { API_PHONE_NUMBERS } from "src/api/constants"; import { API_PHONE_NUMBERS } from "src/api/constants";
import { formatPhoneNumber, hasLength } from "src/utils"; import { formatPhoneNumber, hasLength } from "src/utils";
import type { Carrier, PhoneNumber } from "src/api/types"; import type { Carrier, Lcr, PhoneNumber } from "src/api/types";
type DeleteProps = { type DeleteProps = {
carrier: Carrier; carrier: Carrier;
@@ -20,28 +20,63 @@ export const DeleteCarrier = ({
handleSubmit, handleSubmit,
}: DeleteProps) => { }: DeleteProps) => {
const [phoneNumbers, setPhoneNumbers] = useState<PhoneNumber[]>(); const [phoneNumbers, setPhoneNumbers] = useState<PhoneNumber[]>();
const [lcrs, setLcrs] = useState<Lcr[]>();
useEffect(() => { useEffect(() => {
let ignore = false; let ignore = false;
getFetch<PhoneNumber[]>(API_PHONE_NUMBERS).then(({ json }) => { Promise.all([
getFetch<PhoneNumber[]>(API_PHONE_NUMBERS),
new Promise<Lcr[]>((resolve, reject) => {
getLcrs()
.then(({ json }) => {
Promise.all(
json.map((lcr: Lcr) =>
getLcrRoutes(lcr.lcr_sid!)
.then(({ json }) => {
if (
json.some((route) =>
route.lcr_carrier_set_entries?.some(
(entry) =>
entry.voip_carrier_sid === carrier.voip_carrier_sid,
),
)
) {
return lcr;
}
})
.catch((error) => reject(error)),
),
)
.then((lcrs) => {
resolve(lcrs as Lcr[]);
})
.catch((error) => reject(error));
})
.catch((error) => reject(error));
}),
]).then(([numbers, fetchedLcrs]) => {
if (!ignore) { if (!ignore) {
setPhoneNumbers( setPhoneNumbers(
json.filter( numbers.json.filter(
(phone) => phone.voip_carrier_sid === carrier.voip_carrier_sid, (phone) => phone.voip_carrier_sid === carrier.voip_carrier_sid,
), ),
); );
setLcrs(fetchedLcrs);
} }
}); });
return function cleanup() { return function cleanup() {
ignore = true; ignore = true;
}; };
}, []); }, [carrier.voip_carrier_sid]);
const hasBlockingDependencies = hasLength(phoneNumbers) || hasLength(lcrs);
return ( return (
<> <>
{phoneNumbers && !hasLength(phoneNumbers) && ( {phoneNumbers && lcrs && !hasBlockingDependencies && (
<Modal handleCancel={handleCancel} handleSubmit={handleSubmit}> <Modal handleCancel={handleCancel} handleSubmit={handleSubmit}>
<P> <P>
Are you sure you want to delete carrier{" "} Are you sure you want to delete carrier{" "}
@@ -49,24 +84,49 @@ export const DeleteCarrier = ({
</P> </P>
</Modal> </Modal>
)} )}
{hasLength(phoneNumbers) && ( {hasBlockingDependencies && (
<ModalClose handleClose={handleCancel}> <ModalClose handleClose={handleCancel}>
<P> <P>
In order to delete the carrier it cannot be in use by any{" "} In order to delete the carrier it cannot be in use by any{" "}
<span>Phone Numbers ({phoneNumbers.length})</span>. {hasLength(phoneNumbers) && (
<span>Phone Numbers ({phoneNumbers.length})</span>
)}
{hasLength(phoneNumbers) && hasLength(lcrs) && " or "}
{hasLength(lcrs) && (
<span>Outbound call Routings ({lcrs.length})</span>
)}
.
</P> </P>
<ul className="m">
<li> {hasLength(phoneNumbers) && (
<strong>Phone Numbers:</strong> <ul className="m">
</li> <li>
{phoneNumbers.map((phone) => { <strong>Phone Numbers:</strong>
return ( </li>
<li className="txt--teal" key={phone.phone_number_sid}> {phoneNumbers.map((phone) => {
{formatPhoneNumber(phone.number)} return (
</li> <li className="txt--teal" key={phone.phone_number_sid}>
); {formatPhoneNumber(phone.number)}
})} </li>
</ul> );
})}
</ul>
)}
{hasLength(lcrs) && (
<ul className="m">
<li>
<strong>Outbound Call Routing:</strong>
</li>
{lcrs.map((lcr) => {
return (
<li className="txt--teal" key={lcr.lcr_sid}>
{lcr.name || "Default route"}
</li>
);
})}
</ul>
)}
</ModalClose> </ModalClose>
)} )}
</> </>
@@ -82,7 +82,7 @@ export const LcrForm = ({ lcrDataMap, lcrRouteDataMap }: LcrFormProps) => {
setLocation(); setLocation();
if (currentServiceProvider) { if (currentServiceProvider) {
setApiUrl( setApiUrl(
`ServiceProviders/${currentServiceProvider.service_provider_sid}/VoipCarriers`, `ServiceProviders/${currentServiceProvider.service_provider_sid}/VoipCarriers${accountSid ? `?account_sid=${accountSid}` : ""}`,
); );
} }
}, [user, currentServiceProvider, accountSid]); }, [user, currentServiceProvider, accountSid]);
@@ -92,16 +92,8 @@ export const LcrForm = ({ lcrDataMap, lcrRouteDataMap }: LcrFormProps) => {
setAccountSid(user?.account_sid); setAccountSid(user?.account_sid);
} }
const carriersFiltered = carriers const ret = carriers
? carriers.filter((carrier) => ? carriers.map((c: Carrier, i) => {
accountSid
? carrier.account_sid === accountSid
: carrier.account_sid === null,
)
: [];
const ret = carriersFiltered
? carriersFiltered.map((c: Carrier, i) => {
if (i === 0) { if (i === 0) {
setDefaultCarrier(c.voip_carrier_sid); setDefaultCarrier(c.voip_carrier_sid);
} }
@@ -123,11 +115,16 @@ export const LcrForm = ({ lcrDataMap, lcrRouteDataMap }: LcrFormProps) => {
return ret; return ret;
}, [accountSid, carriers]); }, [accountSid, carriers]);
if (lcrDataMap && lcrDataMap.data && lcrDataMap.data !== previouseLcr) { useEffect(() => {
setLcrName(lcrDataMap.data.name || ""); if (lcrDataMap && lcrDataMap.data && lcrDataMap.data !== previouseLcr) {
setIsActive(lcrDataMap.data.is_active); setLcrName(lcrDataMap.data.name || "");
setPreviousLcr(lcrDataMap.data); setIsActive(lcrDataMap.data.is_active);
} setPreviousLcr(lcrDataMap.data);
if (lcrDataMap.data.account_sid) {
setAccountSid(lcrDataMap.data.account_sid);
}
}
}, [lcrDataMap?.data, previouseLcr]);
useMemo(() => { useMemo(() => {
let default_lcr_route_sid = ""; let default_lcr_route_sid = "";