import { useQuery, useMutation } from '@apollo/react-hooks' import gql from 'graphql-tag' import * as R from 'ramda' import React, { useState } from 'react' import Modal from 'src/components/Modal' import TitleSection from 'src/components/layout/TitleSection' import { P } from 'src/components/typography' import FormRenderer from 'src/pages/Services/FormRenderer' import twilioSchema from 'src/pages/Services/schemas/twilio' import { fromNamespace, toNamespace, namespaces } from 'src/utils/config' import Section from '../../components/layout/Section' import mailgunSchema from '../Services/schemas/mailgun' import NotificationsCtx from './NotificationsContext' import CryptoBalanceAlerts from './sections/CryptoBalanceAlerts' 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 numberOfCassettes numberOfRecyclers } cryptoCurrencies { code display } accounts } ` const SAVE_CONFIG = gql` mutation Save($config: JSONObject) { saveConfig(config: $config) } ` const SAVE_ACCOUNT = gql` mutation Save($accounts: JSONObject) { saveAccounts(accounts: $accounts) } ` const FIELDS_WIDTH = 130 const Notifications = ({ name: SCREEN_KEY, displaySetup = true, displayTransactionAlerts = true, displayFiatAlerts = true, displayCryptoAlerts = true, displayOverrides = true, displayTitle = true, displayThirdPartyProvider = true, wizard = false }) => { const [section, setSection] = useState(null) const [error, setError] = useState(null) const [editingKey, setEditingKey] = useState(null) const [smsSetupPopup, setSmsSetupPopup] = useState(false) const [emailSetupPopup, setEmailSetupPopup] = useState(false) const { data, loading } = useQuery(GET_INFO) const [saveConfig] = useMutation(SAVE_CONFIG, { refetchQueries: ['getData'], onCompleted: () => setEditingKey(null), onError: error => setError(error) }) const [saveAccount] = useMutation(SAVE_ACCOUNT, { onCompleted: () => { setSmsSetupPopup(false) setEmailSetupPopup(false) }, refetchQueries: ['getData'], onError: error => setError(error) }) 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 || {}) const currency = R.path(['fiatCurrency'])( fromNamespace(namespaces.LOCALE)(data?.config) ) const save = R.curry((section, rawConfig) => { const config = toNamespace(SCREEN_KEY)(rawConfig) setSection(section) setError(null) return saveConfig({ variables: { config } }) }) const setEditing = (key, state) => { if (!state) { setError(null) } setEditingKey(state ? key : null) } const twilioSave = it => { setError(null) return saveAccount({ variables: { accounts: { twilio: it } } }).then(() => R.compose(save(null), toNamespace('sms'))({ active: true })) } const mailgunSave = it => { setError(null) return saveAccount({ variables: { accounts: { mailgun: it } } }).then(() => R.compose(save(null), toNamespace('email'))({ active: true })) } const isEditing = key => editingKey === key const isDisabled = key => editingKey && editingKey !== key const contextValue = { save, error, editingKey, data: config, currency, isEditing, isDisabled, setEditing, setSection, machines, accountsConfig, cryptoCurrencies, twilioAvailable, setSmsSetupPopup, mailgunAvailable, setEmailSetupPopup } return ( !loading && ( <> {displayTitle && } {displayThirdPartyProvider && (
)} {displaySetup && (
)} {displayTransactionAlerts && (
)} {displayFiatAlerts && (
{displayOverrides && ( )}
)} {displayCryptoAlerts && (
{displayOverrides && ( )}
)}
{smsSetupPopup && ( setSmsSetupPopup(false)} open={true}>

In order for the SMS notifications to work, you'll first need to configure Twilio.

)} {emailSetupPopup && ( setEmailSetupPopup(false)} open={true}>

In order for the mail notifications to work, you'll first need to configure Mailgun.

)} ) ) } export default Notifications