1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-01-26 15:52:20 +01:00

124 lines
4.3 KiB
TypeScript
Raw Normal View History

2021-03-10 17:15:36 +01:00
/**
* Form to set the stripe's public and private keys
*/
2021-03-31 16:03:51 +02:00
import React, { ReactNode, useEffect, useState } from 'react';
2021-03-10 17:15:36 +01:00
import { Loader } from './loader';
import { useTranslation } from 'react-i18next';
import SettingAPI from '../api/setting';
import { SettingName } from '../models/setting';
2021-03-24 17:31:50 +01:00
import { FabInput } from './fab-input';
import StripeAPI from '../api/stripe';
2021-03-10 17:15:36 +01:00
interface StripeKeysFormProps {
onValidKeys: (stripePublic: string, stripeSecret:string) => void
2021-03-10 17:15:36 +01:00
}
const stripeKeys = SettingAPI.query([SettingName.StripePublicKey, SettingName.StripeSecretKey]);
const StripeKeysFormComponent: React.FC<StripeKeysFormProps> = ({ onValidKeys }) => {
2021-03-10 17:15:36 +01:00
const { t } = useTranslation('admin');
const [publicKey, setPublicKey] = useState<string>('');
2021-03-24 17:31:50 +01:00
const [publicKeyAddOn, setPublicKeyAddOn] = useState<ReactNode>(null);
const [publicKeyAddOnClassName, setPublicKeyAddOnClassName] = useState<string>('');
2021-03-10 17:15:36 +01:00
const [secretKey, setSecretKey] = useState<string>('');
2021-03-24 17:31:50 +01:00
const [secretKeyAddOn, setSecretKeyAddOn] = useState<ReactNode>(null);
const [secretKeyAddOnClassName, setSecretKeyAddOnClassName] = useState<string>('');
2021-03-10 17:15:36 +01:00
useEffect(() => {
const keys = stripeKeys.read();
setPublicKey(keys.get(SettingName.StripePublicKey));
setSecretKey(keys.get(SettingName.StripeSecretKey));
}, []);
useEffect(() => {
const validClassName = 'key-valid';
if (publicKeyAddOnClassName === validClassName && secretKeyAddOnClassName === validClassName) {
onValidKeys(publicKey, secretKey);
}
}, [publicKeyAddOnClassName, secretKeyAddOnClassName]);
2021-03-10 17:15:36 +01:00
/**
* Send a test call to the Stripe API to check if the inputted public key is valid
*/
2021-03-30 15:56:36 +02:00
const testPublicKey = (key: string) => {
if (!key.match(/^pk_/)) {
setPublicKeyAddOn(<i className="fa fa-times" />);
setPublicKeyAddOnClassName('key-invalid');
return;
}
StripeAPI.createPIIToken(key, 'test').then(() => {
setPublicKey(key);
setPublicKeyAddOn(<i className="fa fa-check" />);
setPublicKeyAddOnClassName('key-valid');
}, reason => {
if (reason.response.status === 401) {
setPublicKeyAddOn(<i className="fa fa-times" />);
setPublicKeyAddOnClassName('key-invalid');
}
});
}
2021-03-10 17:15:36 +01:00
/**
* Send a test call to the Stripe API to check if the inputted secret key is valid
*/
2021-03-30 15:56:36 +02:00
const testSecretKey = (key: string) => {
if (!key.match(/^sk_/)) {
setSecretKeyAddOn(<i className="fa fa-times" />);
setSecretKeyAddOnClassName('key-invalid');
return;
}
StripeAPI.listAllCharges(key).then(() => {
setSecretKey(key);
setSecretKeyAddOn(<i className="fa fa-check" />);
setSecretKeyAddOnClassName('key-valid');
}, reason => {
if (reason.response.status === 401) {
setSecretKeyAddOn(<i className="fa fa-times" />);
setSecretKeyAddOnClassName('key-invalid');
}
});
2021-03-24 17:31:50 +01:00
}
2021-03-10 17:15:36 +01:00
return (
2021-03-24 17:31:50 +01:00
<div className="stripe-keys-form">
2021-03-10 17:15:36 +01:00
<div className="stripe-keys-info" dangerouslySetInnerHTML={{__html: t('app.admin.invoices.payment.stripe_keys_info_html')}} />
<form name="stripeKeysForm">
2021-03-24 17:31:50 +01:00
<div className="stripe-public-input">
<label htmlFor="stripe_public_key">{ t('app.admin.invoices.payment.public_key') } *</label>
<FabInput id="stripe_public_key"
icon={<i className="fa fa-info" />}
value={publicKey}
onChange={testPublicKey}
addOn={publicKeyAddOn}
addOnClassName={publicKeyAddOnClassName}
debounce={200}
2021-03-24 17:31:50 +01:00
required />
2021-03-10 17:15:36 +01:00
</div>
2021-03-24 17:31:50 +01:00
<div className="stripe-secret-input">
<label htmlFor="stripe_secret_key">{ t('app.admin.invoices.payment.secret_key') } *</label>
<FabInput id="stripe_secret_key"
icon={<i className="fa fa-key" />}
value={secretKey}
onChange={testSecretKey}
addOn={secretKeyAddOn}
addOnClassName={secretKeyAddOnClassName}
debounce={200}
required/>
2021-03-10 17:15:36 +01:00
</div>
</form>
</div>
);
}
export const StripeKeysForm: React.FC<StripeKeysFormProps> = ({ onValidKeys }) => {
2021-03-10 17:15:36 +01:00
return (
<Loader>
<StripeKeysFormComponent onValidKeys={onValidKeys} />
2021-03-10 17:15:36 +01:00
</Loader>
);
}