From eda1fa0dc4af8a9bc05591424bc75f88b5204b9f Mon Sep 17 00:00:00 2001 From: Brandon Lee Kitajchuk Date: Sat, 28 Aug 2021 06:20:49 -0700 Subject: [PATCH] Chore/carrier apps accounts (#23) * Scope accounts and applications to current service provider for Phone Numbers * Scope accounts to current service provider when adding or editing an Application * Implement account and application logic for add or edit Carrier form * Implement delete action for service providers --- src/components/forms/ApplicationForm.js | 2 +- src/components/forms/CarrierForm.js | 80 +++++++-- src/components/forms/PhoneNumberForm.js | 20 ++- src/components/forms/SettingsForm.js | 213 +++++++++++++++++------- 4 files changed, 234 insertions(+), 81 deletions(-) diff --git a/src/components/forms/ApplicationForm.js b/src/components/forms/ApplicationForm.js index 5c92656..241c4ff 100644 --- a/src/components/forms/ApplicationForm.js +++ b/src/components/forms/ApplicationForm.js @@ -120,7 +120,7 @@ const ApplicationForm = props => { applicationsPromise, ]); - const accounts = promiseAllValues[0].data; + const accounts = promiseAllValues[0].data.filter(a => a.service_provider_sid === currentServiceProvider); const applications = promiseAllValues[1].data; setAccounts(accounts); diff --git a/src/components/forms/CarrierForm.js b/src/components/forms/CarrierForm.js index 7ca74c5..a9fd6f9 100644 --- a/src/components/forms/CarrierForm.js +++ b/src/components/forms/CarrierForm.js @@ -5,6 +5,7 @@ import styled from "styled-components/macro"; import { Menu, Dropdown } from "antd"; import { NotificationDispatchContext } from '../../contexts/NotificationContext'; +import { ServiceProviderValueContext } from '../../contexts/ServiceProviderContext'; import Form from '../elements/Form'; import Input from '../elements/Input'; import PasswordInput from '../elements/PasswordInput'; @@ -18,7 +19,6 @@ import Loader from '../blocks/Loader'; import sortSipGateways from '../../helpers/sortSipGateways'; import Select from '../elements/Select'; import handleErrors from "../../helpers/handleErrors"; -import { ServiceProviderValueContext } from '../../contexts/ServiceProviderContext' const StyledForm = styled(Form)` @media (max-width: 978.98px) { @@ -185,6 +185,8 @@ const CarrierForm = (props) => { ]); const [ applicationValues, setApplicationValues ] = useState([]); + const [ accounts, setAccounts ] = useState([]); + const [ accountSid, setAccountSid ] = useState(''); const [ carrierSid, setCarrierSid ] = useState(''); const [ showLoader, setShowLoader ] = useState(true); @@ -220,7 +222,16 @@ const CarrierForm = (props) => { Authorization: `Bearer ${jwt}`, }, }); + const accountsPromise = axios({ + method: 'get', + baseURL: process.env.REACT_APP_API_BASE_URL, + url: '/Accounts', + headers: { + Authorization: `Bearer ${jwt}`, + }, + }); promises.push(applicationPromise); + promises.push(accountsPromise); if (type === 'edit') { const carrierPromise = axios({ @@ -248,11 +259,12 @@ const CarrierForm = (props) => { const promiseResponses = await Promise.all(promises); setApplicationValues(promiseResponses[0].data); + setAccounts(promiseResponses[1].data); if (type === 'edit') { - const carrier = promiseResponses[1].data; - const allSipGateways = promiseResponses[2].data; + const carrier = promiseResponses[2].data; + const allSipGateways = promiseResponses[3].data; if (!carrier) { isMounted = false; @@ -274,6 +286,7 @@ const CarrierForm = (props) => { setName(carrier.name || ''); setE164(carrier.e164_leading_plus === 1); setApplication(carrier.application_sid || ''); + setAccountSid(carrier.account_sid || ''); setAuthenticate(carrier.register_username ? true : false); setRegister(carrier.requires_register === 1); setUsername(carrier.register_username || ''); @@ -639,6 +652,7 @@ const CarrierForm = (props) => { name: name.trim() || null, e164_leading_plus: e164 ? 1 : 0, application_sid: application || null, + account_sid: accountSid || null, requires_register: register ? 1 : 0, register_username: username ? username.trim() : null, register_password: password ? password : null, @@ -894,29 +908,65 @@ const CarrierForm = (props) => { onChange={e => setE164(e.target.checked)} /> - + + {accountSid && ( + <> + + + + )} +
{ diff --git a/src/components/forms/PhoneNumberForm.js b/src/components/forms/PhoneNumberForm.js index 9376492..2dc92a5 100644 --- a/src/components/forms/PhoneNumberForm.js +++ b/src/components/forms/PhoneNumberForm.js @@ -2,6 +2,7 @@ import React, { useState, useEffect, useContext, useRef } from 'react'; import { useHistory } from 'react-router-dom'; import axios from 'axios'; import { NotificationDispatchContext } from '../../contexts/NotificationContext'; +import { ServiceProviderValueContext } from '../../contexts/ServiceProviderContext'; import Form from '../elements/Form'; import Input from '../elements/Input'; import Label from '../elements/Label'; @@ -16,6 +17,7 @@ const PhoneNumberForm = props => { let history = useHistory(); const dispatch = useContext(NotificationDispatchContext); + const currentServiceProvider = useContext(ServiceProviderValueContext); // Refs const refPhoneNumber = useRef(null); @@ -358,7 +360,10 @@ const PhoneNumberForm = props => { name="account" id="account" value={account} - onChange={e => setAccount(e.target.value)} + onChange={(e) => { + setAccount(e.target.value); + setApplication(''); + }} invalid={invalidAccount} ref={refAccount} > @@ -368,7 +373,7 @@ const PhoneNumberForm = props => { ) && ( )} - {accountValues.map(a => ( + {accountValues.filter(a => a.service_provider_sid === currentServiceProvider).map(a => ( - {applicationValues.map(a => ( + {applicationValues.filter((a) => { + // Map an application to a service provider through it's account_sid + const acct = accountValues.find(ac => a.account_sid === ac.account_sid); + + if (account) { + return a.account_sid === account; + } + + return acct.service_provider_sid === currentServiceProvider; + }).map(a => (