feat: admin picked sms provider

This commit is contained in:
Rafael Taranto 2023-08-19 10:56:54 +01:00
parent 3b19caf3a7
commit f716e4202c
3 changed files with 89 additions and 1 deletions

View file

@ -25,7 +25,8 @@ function getSms (event, phone, content) {
}
function getPlugin (settings) {
const pluginCode = argv.mockSms ? 'mock-sms' : argv.telnyxSms ? 'telnyx' : 'twilio'
const smsProvider = settings.config.notifications_thirdParty_provider
const pluginCode = smsProvider ?? 'twilio'
const plugin = ph.load(ph.SMS, pluginCode)
const account = settings.accounts[pluginCode]

View file

@ -19,11 +19,19 @@ import CryptoBalanceOverrides from './sections/CryptoBalanceOverrides'
import FiatBalanceAlerts from './sections/FiatBalanceAlerts'
import FiatBalanceOverrides from './sections/FiatBalanceOverrides'
import Setup from './sections/Setup'
import ThirdPartyProvider from './sections/ThirdPartyProvider'
import TransactionAlerts from './sections/TransactionAlerts'
const GET_INFO = gql`
query getData {
config
accountsConfig {
code
display
class
cryptos
deprecated
}
machines {
name
deviceId
@ -59,6 +67,7 @@ const Notifications = ({
displayCryptoAlerts = true,
displayOverrides = true,
displayTitle = true,
displayThirdPartyProvider = true,
wizard = false
}) => {
const [section, setSection] = useState(null)
@ -86,6 +95,7 @@ const Notifications = ({
const config = fromNamespace(SCREEN_KEY)(data?.config)
const machines = data?.machines
const accountsConfig = data?.accountsConfig
const cryptoCurrencies = data?.cryptoCurrencies
const twilioAvailable = R.has('twilio', data?.accounts || {})
const mailgunAvailable = R.has('mailgun', data?.accounts || {})
@ -136,6 +146,7 @@ const Notifications = ({
setEditing,
setSection,
machines,
accountsConfig,
cryptoCurrencies,
twilioAvailable,
setSmsSetupPopup,
@ -148,6 +159,13 @@ const Notifications = ({
<>
<NotificationsCtx.Provider value={contextValue}>
{displayTitle && <TitleSection title="Notifications" />}
{displayThirdPartyProvider && (
<Section
title="Third party providers"
error={error && !section === 'thirdParty'}>
<ThirdPartyProvider section="thirdParty" />
</Section>
)}
{displaySetup && (
<Section title="Setup" error={error && !section}>
<Setup forceDisable={!!editingKey} wizard={wizard} />

View file

@ -0,0 +1,69 @@
import * as R from 'ramda'
import React, { useContext } from 'react'
import * as Yup from 'yup'
import { Table as EditableTable } from 'src/components/editableTable'
import Autocomplete from 'src/components/inputs/formik/Autocomplete'
import { toNamespace, fromNamespace } from 'src/utils/config'
import NotificationsCtx from '../NotificationsContext'
const filterClass = type => R.filter(it => it.class === type)
const ThirdPartyProvider = () => {
const { save, data: _data, error, accountsConfig } = useContext(
NotificationsCtx
)
const data = fromNamespace('thirdParty')(_data)
const filterOptions = type => filterClass(type)(accountsConfig || [])
const getDisplayName = type => it =>
R.compose(
R.prop('display'),
R.find(R.propEq('code', it))
)(filterOptions(type))
const innerSave = async value => {
const config = toNamespace('thirdParty')(value?.thirdParty[0])
await save('thirdParty', config)
}
const ThirdPartySchema = Yup.object().shape({
sms: Yup.string('The ticker must be a string').required(
'The ticker is required'
)
})
const elements = [
{
name: 'sms',
size: 'sm',
view: getDisplayName('sms'),
width: 175,
input: Autocomplete,
inputProps: {
options: filterOptions('sms'),
valueProp: 'code',
labelProp: 'display'
}
}
]
return (
<EditableTable
name="thirdParty"
initialValues={data?.thirdParty ?? { sms: 'twilio' }}
data={R.of(data || [])}
error={error?.message}
enableEdit
editWidth={174}
save={innerSave}
validationSchema={ThirdPartySchema}
elements={elements}
/>
)
}
export default ThirdPartyProvider