diff --git a/server/constants.js b/server/constants.js index 0128d1b61d..38dac31ec4 100644 --- a/server/constants.js +++ b/server/constants.js @@ -54,10 +54,10 @@ subscriber.on('message', (channel, message) => { if (data.secrets) updateSecrets(data.secrets); break; case 'freezeUser': - updateFrozenUser(data, 'add'); + updateFrozenUser('add', data); break; case 'unfreezeUser': - updateFrozenUser(data, 'remove'); + updateFrozenUser('remove', data); break; case 'stop': resetAllConfig(); diff --git a/settings/configmap b/settings/configmap index 4e8675a2a4..8c8d50fd53 100644 --- a/settings/configmap +++ b/settings/configmap @@ -118,24 +118,24 @@ ENVIRONMENT_USER_HOLLAEX_CORE_IMAGE_VERSION=$ENVIRONMENT_DOCKER_IMAGE_VERSION ENVIRONMENT_USER_HOLLAEX_WEB_IMAGE_REGISTRY=bitholla/my-hollaex-web ENVIRONMENT_USER_HOLLAEX_WEB_IMAGE_VERSION=latest -ENVIRONMENT_KUBERNETES_API_CPU_LIMITS=200m +ENVIRONMENT_KUBERNETES_API_CPU_LIMITS=100m ENVIRONMENT_KUBERNETES_API_MEMORY_LIMITS=512Mi -ENVIRONMENT_KUBERNETES_API_CPU_REQUESTS=10m +ENVIRONMENT_KUBERNETES_API_CPU_REQUESTS=50m ENVIRONMENT_KUBERNETES_API_MEMORY_REQUESTS=512Mi -ENVIRONMENT_KUBERNETES_STREAM_CPU_LIMITS=200m +ENVIRONMENT_KUBERNETES_STREAM_CPU_LIMITS=100m ENVIRONMENT_KUBERNETES_STREAM_MEMORY_LIMITS=256Mi -ENVIRONMENT_KUBERNETES_STREAM_CPU_REQUESTS=10m -ENVIRONMENT_KUBERNETES_STREAM_MEMORY_REQUESTS=128Mi +ENVIRONMENT_KUBERNETES_STREAM_CPU_REQUESTS=50m +ENVIRONMENT_KUBERNETES_STREAM_MEMORY_REQUESTS=256Mi ENVIRONMENT_KUBERNETES_POSTGRESQL_CPU_LIMITS=100m -ENVIRONMENT_KUBERNETES_POSTGRESQL_MEMORY_LIMITS=200Mi -ENVIRONMENT_KUBERNETES_POSTGRESQL_CPU_REQUESTS=10m +ENVIRONMENT_KUBERNETES_POSTGRESQL_MEMORY_LIMITS=100Mi +ENVIRONMENT_KUBERNETES_POSTGRESQL_CPU_REQUESTS=100m ENVIRONMENT_KUBERNETES_POSTGRESQL_MEMORY_REQUESTS=100Mi ENVIRONMENT_KUBERNETES_REDIS_CPU_LIMITS=100m -ENVIRONMENT_KUBERNETES_REDIS_MEMORY_LIMITS=200Mi -ENVIRONMENT_KUBERNETES_REDIS_CPU_REQUESTS=10m +ENVIRONMENT_KUBERNETES_REDIS_MEMORY_LIMITS=100Mi +ENVIRONMENT_KUBERNETES_REDIS_CPU_REQUESTS=100m ENVIRONMENT_KUBERNETES_REDIS_MEMORY_REQUESTS=100Mi ENVIRONMENT_KUBERNETES_S3_BACKUP_CRONJOB_RULE='0 1 * * *' diff --git a/web/public/assets/images/terms_of_service_and_privacy_policy-tooltip.png b/web/public/assets/images/terms_of_service_and_privacy_policy-tooltip.png new file mode 100644 index 0000000000..136cff08bc Binary files /dev/null and b/web/public/assets/images/terms_of_service_and_privacy_policy-tooltip.png differ diff --git a/web/src/components/AdminForm/hoc.js b/web/src/components/AdminForm/hoc.js index b66f3ef998..f8deb3ddcc 100644 --- a/web/src/components/AdminForm/hoc.js +++ b/web/src/components/AdminForm/hoc.js @@ -17,6 +17,7 @@ const Form = (name, className = '', allowPristine = false) => { small, buttonClass = '', submitOnKeyDown = false, + disableAllFields = false, }) => { return (
{ } }} > - {fields && renderFields(fields)} + {fields && renderFields(fields, disableAllFields)} {error && (
{error} @@ -40,6 +41,7 @@ const Form = (name, className = '', allowPristine = false) => { type={buttonType ? buttonType : 'primary'} onClick={handleSubmit(onSubmit)} disabled={ + disableAllFields || (allowPristine ? false : fields && pristine) || submitting || !valid || diff --git a/web/src/components/AdminForm/utils.js b/web/src/components/AdminForm/utils.js index 1322b01ed8..a580bf1a23 100644 --- a/web/src/components/AdminForm/utils.js +++ b/web/src/components/AdminForm/utils.js @@ -13,7 +13,7 @@ import { FileField } from './FileField'; import CaptchaField from './captchaField'; import Editor from './Editor'; -const renderFields = (fields) => { +const renderFields = (fields, disableAllFields) => { return ( {Object.keys(fields).map((key) => { @@ -23,6 +23,7 @@ const renderFields = (fields) => { validate: field.validate || [], name: key, key, + ...(disableAllFields ? { disabled: true } : {}), }; let component; diff --git a/web/src/components/AppFooter/index.js b/web/src/components/AppFooter/index.js index afb6586b53..9e1c6de52d 100644 --- a/web/src/components/AppFooter/index.js +++ b/web/src/components/AppFooter/index.js @@ -1,11 +1,11 @@ import React from 'react'; import classnames from 'classnames'; import { isMobile } from 'react-device-detect'; -import STRINGS from '../../config/localizedStrings'; // import { PUBLIC_URL } from '../../config/constants'; import withConfig from 'components/ConfigProvider/withConfig'; import Image from 'components/Image'; import withEdit from 'components/EditProvider/withEdit'; +import STRINGS from 'config/localizedStrings'; const generateSectionsText = (links = {}, ICONS) => { let sectionsText = Object.keys(links) @@ -41,6 +41,7 @@ const AppFooter = ({ className, theme, constants = { description: '' }, + constants: { links = {} }, icons: ICONS, isEditMode, }) => { @@ -161,9 +162,49 @@ const AppFooter = ({
-
-
-
{STRINGS['FOOTER.FOOTER_COPYRIGHT']}
+
+
+ {!links.hide_referral_badge && ( + + {links.referral_label || 'Powered by bitHolla'} + + )} +
+
+ + | + +
+
); diff --git a/web/src/components/Form/TradeFormFields/Slider.js b/web/src/components/Form/TradeFormFields/Slider.js index 4e10bd5bba..29c0deeb25 100644 --- a/web/src/components/Form/TradeFormFields/Slider.js +++ b/web/src/components/Form/TradeFormFields/Slider.js @@ -5,17 +5,37 @@ import { Slider } from 'antd'; const marks = { 0: {}, - 25: {}, - 50: {}, - 75: {}, - 100: {}, + 25: { + label: '25%', + style: { + transform: 'translateX(-66%)', + }, + }, + 50: { + label: '50%', + style: { + transform: 'translateX(-66%)', + }, + }, + 75: { + label: '75%', + style: { + transform: 'translateX(-66%)', + }, + }, + 100: { + label: '100%', + style: { + transform: 'translateX(-66%)', + }, + }, }; const SizeSlider = (props) => { const { onClick } = props; return ( -
+
{Daily deposit max amount}: 1 -> {50,000,000} 2 -> {T} 3 -> {(Want to increase your daily limit?)} + FULL_MESSAGE_LIMIT: '{0}: {1} {2} {3}', // 0 -> {Daily deposit max amount}: 1 -> {50,000,000} 2 -> {T} 3 -> {(Want to increase your daily limit?)} }, LOGIN: { LOGIN_TO: 'Bei {0} anmelden', - CANT_LOGIN: "Sie können sich nicht anmelden?", - NO_ACCOUNT: "Sie haben noch kein Konto?", + CANT_LOGIN: 'Sie können sich nicht anmelden?', + NO_ACCOUNT: 'Sie haben noch kein Konto?', CREATE_ACCOUNT: 'Erstellen Sie hier ein Konto', - HELP: 'Hilfe' + HELP: 'Hilfe', }, FORM_FIELDS: { EMAIL_LABEL: 'E-Mail', @@ -199,7 +200,7 @@ export default { PASSWORD_LABEL: 'Passwort', PASSWORD_PLACEHOLDER: 'Geben Sie Ihr Passwort ein', PASSWORD_REPEAT_LABEL: 'Geben Sie Ihr Passwort erneut ein', - PASSWORD_REPEAT_PLACEHOLDER: 'Geben Sie Ihr Passwort erneut ein' + PASSWORD_REPEAT_PLACEHOLDER: 'Geben Sie Ihr Passwort erneut ein', }, VALIDATIONS: { OTP_LOGIN: 'OTP-Code zur Anmeldung bereitstellen', @@ -219,11 +220,12 @@ export default { MIN_VALUE: 'Wert muss {0} oder höher sein.', MAX_VALUE: 'Wert muss {0} oder niedriger sein.', INSUFFICIENT_BALANCE: 'Unzureichende Balance', - PASSWORDS_DONT_MATCH: "Passwort stimmt nicht überein", + PASSWORDS_DONT_MATCH: 'Passwort stimmt nicht überein', USER_EXIST: 'E-Mail wurde bereits registriert', - ACCEPT_TERMS: 'Sie haben den Nutzungsbedingungen und der Datenschutzrichtlinie nicht zugestimmt', + ACCEPT_TERMS: + 'Sie haben den Nutzungsbedingungen und der Datenschutzrichtlinie nicht zugestimmt', STEP: 'Ungültiger Wert, Schritt ist {0}', - ONLY_NUMBERS: 'Wert kann nur Zahlen enthalten' + ONLY_NUMBERS: 'Wert kann nur Zahlen enthalten', }, LEGAL: { PRIVACY_POLICY: { @@ -237,8 +239,8 @@ export default { 'Die Website und das Urheberrecht an allen Texten, Grafiken, Bildern, Software und allen anderen Materialien auf der Website sind Eigentum von bitHolla, einschließlich aller Marken und anderer geistiger Eigentumsrechte in Bezug auf die Materialien und den Service auf der Website. Die Materialien auf dieser Website dürfen nur für den persönlichen Gebrauch und für nicht-kommerzielle Zwecke verwendet werden.', 'Sie dürfen Auszüge der Website nur für den oben genannten Zweck auf einem Computerbildschirm anzeigen oder ausdrucken, vorausgesetzt, dass Sie alle Urheberrechts- und sonstigen Eigentumshinweise sowie alle bitHolla-Marken oder -Logos beibehalten, wie sie auf dem ersten Ausdruck oder Download angezeigt werden, ohne sie zu ändern, hinzuzufügen oder zu löschen. Sofern nicht ausdrücklich angegeben, dürfen Sie ohne die vorherige schriftliche Genehmigung von bitHolla keine Materialien der Website verändern, modifizieren, reproduzieren, verteilen oder in einem anderen kommerziellen Kontext verwenden.', 'Sie erkennen an, dass bitHolla und das bitHolla-Logo Warenzeichen von bitHolla Inc. sind. Sie dürfen diese Warenzeichen ohne Änderungen auf dem von dieser Website heruntergeladenen Material in dem oben genehmigten Umfang wiedergeben, aber Sie dürfen sie nicht anderweitig verwenden, kopieren, anpassen oder löschen.', - 'Sie dürfen unter keinen Umständen irgendwelche Rechte über oder in Bezug auf die Website erhalten (außer den Rechten zur Nutzung der Website gemäß diesen Bedingungen und anderen Bedingungen, die einen bestimmten Dienst oder Abschnitt der Website regeln) oder sich als Inhaber solcher Rechte über oder in Bezug auf die Website ausgeben.' - ] + 'Sie dürfen unter keinen Umständen irgendwelche Rechte über oder in Bezug auf die Website erhalten (außer den Rechten zur Nutzung der Website gemäß diesen Bedingungen und anderen Bedingungen, die einen bestimmten Dienst oder Abschnitt der Website regeln) oder sich als Inhaber solcher Rechte über oder in Bezug auf die Website ausgeben.', + ], }, GENERAL_TERMS: { TITLE: 'Allgemeine Geschäftsbedingungen', @@ -251,15 +253,15 @@ export default { 'Die Website und das Urheberrecht an allen Texten, Grafiken, Bildern, Software und allen anderen Materialien auf der Website sind Eigentum von bitHolla, einschließlich aller Marken und anderer geistiger Eigentumsrechte in Bezug auf die Materialien und den Service auf der Website. Die Materialien auf dieser Website dürfen nur für den persönlichen Gebrauch und für nicht-kommerzielle Zwecke verwendet werden.', 'Sie dürfen Auszüge der Website nur für den oben genannten Zweck auf einem Computerbildschirm anzeigen oder ausdrucken, vorausgesetzt, dass Sie alle Urheberrechts- und sonstigen Eigentumshinweise sowie alle bitHolla-Marken oder -Logos beibehalten, wie sie auf dem ersten Ausdruck oder Download angezeigt werden, ohne sie zu ändern, hinzuzufügen oder zu löschen. Sofern nicht ausdrücklich angegeben, dürfen Sie ohne die vorherige schriftliche Genehmigung von bitHolla keine Materialien der Website verändern, modifizieren, reproduzieren, verteilen oder in einem anderen kommerziellen Kontext verwenden.', 'Sie erkennen an, dass bitHolla und das bitHolla-Logo Warenzeichen von bitHolla Inc. sind. Sie dürfen diese Warenzeichen ohne Änderungen auf dem von dieser Website heruntergeladenen Material in dem oben genehmigten Umfang wiedergeben, aber Sie dürfen sie nicht anderweitig verwenden, kopieren, anpassen oder löschen.', - 'Sie dürfen unter keinen Umständen irgendwelche Rechte über oder in Bezug auf die Website erhalten (außer den Rechten zur Nutzung der Website gemäß diesen Bedingungen und anderen Bedingungen, die einen bestimmten Dienst oder Abschnitt der Website regeln) oder sich als Inhaber solcher Rechte über oder in Bezug auf die Website ausgeben.' - ] - } + 'Sie dürfen unter keinen Umständen irgendwelche Rechte über oder in Bezug auf die Website erhalten (außer den Rechten zur Nutzung der Website gemäß diesen Bedingungen und anderen Bedingungen, die einen bestimmten Dienst oder Abschnitt der Website regeln) oder sich als Inhaber solcher Rechte über oder in Bezug auf die Website ausgeben.', + ], + }, }, NOTIFICATIONS: { BUTTONS: { OKAY: 'Okay', START_TRADING: 'Handel beginnen', - SEE_HISTORY: 'siehe Verlauf' + SEE_HISTORY: 'siehe Verlauf', }, DEPOSITS: { TITLE_RECEIVED: '{0} Einzahlung erhalten', @@ -269,28 +271,29 @@ export default { INFORMATION_PENDING_1: 'Ihre {0} benötigen 1 Bestätigungen, bevor Sie mit dem Handel beginnen können.', INFORMATION_PENDING_2: - 'Dies kann 10-30 Minuten dauern. Wir senden eine E-Mail, sobald Ihre {0} in der Blockchain bestätigt wurde.' - } + 'Dies kann 10-30 Minuten dauern. Wir senden eine E-Mail, sobald Ihre {0} in der Blockchain bestätigt wurde.', + }, }, REFERRAL_SUCCESS: { TITLE: 'Anfrage gesendet', - BUTTON_TEXT: 'Okay' + BUTTON_TEXT: 'Okay', }, OTP_FORM: { - OTP_FORM_TITLE: 'Geben Sie Ihren Authentifizierungscode ein, um fortzufahren', + OTP_FORM_TITLE: + 'Geben Sie Ihren Authentifizierungscode ein, um fortzufahren', OTP_LABEL: 'OTP-Code', OTP_PLACEHOLDER: 'Geben Sie den Authentifizierungscode ein', OTP_TITLE: 'Authentifizierungscode', OTP_HELP: 'Hilfe', OTP_BUTTON: 'einreichen', - ERROR_INVALID: 'Ungültiger OTP-Code' + ERROR_INVALID: 'Ungültiger OTP-Code', }, QUICK_TRADE_COMPONENT: { TITLE: 'Quick', TOTAL_COST: 'Gesamtkosten', BUTTON: 'Überprüfung {0} Auftrag', INPUT: '{0} bis {1}', - TRADE_TITLE: '{0} {1}' // quick buy + TRADE_TITLE: '{0} {1}', // quick buy }, PREVIOUS_PAGE: 'vorherige Seite', NEXT_PAGE: 'nächste Seite', @@ -302,61 +305,62 @@ export default { ORDERS_PLURAL: 'orders', ORDERS_SINGULAR: 'order', HOLD_ORDERS: - 'Sie haben {0} offen {1}, was zu einem Halt von {2} {3} auf Ihrem {4} Saldo führt' + 'Sie haben {0} offen {1}, was zu einem Halt von {2} {3} auf Ihrem {4} Saldo führt', }, REQUEST_RESET_PASSWORD: { TITLE: 'Konto-Wiederherstellung', SUBTITLE: `Stellen Sie Ihr Konto unten wieder her`, SUPPORT: 'Kontaktieren Sie den Kundendienst.', - BUTTON: 'Wiederherstellungslink senden' + BUTTON: 'Wiederherstellungslink senden', }, REQUEST_RESET_PASSWORD_SUCCESS: { TITLE: 'Passwortrücksetzung gesendet', TEXT: - 'Wenn für die E-Mail-Adresse ein Konto existiert, wurde eine E-Mail mit Anweisungen zum Zurücksetzen an diese Adresse gesendet. Bitte prüfen Sie Ihre E-Mail und klicken Sie auf den Link, um das Zurücksetzen des Passworts abzuschließen.' + 'Wenn für die E-Mail-Adresse ein Konto existiert, wurde eine E-Mail mit Anweisungen zum Zurücksetzen an diese Adresse gesendet. Bitte prüfen Sie Ihre E-Mail und klicken Sie auf den Link, um das Zurücksetzen des Passworts abzuschließen.', }, RESET_PASSWORD: { TITLE: 'Neues Passwort festlegen', SUBTITLE: 'Neues Passwort festlegen', - BUTTON: 'Neues Passwort festlegen' + BUTTON: 'Neues Passwort festlegen', }, RESET_PASSWORD_SUCCESS: { TEXT_1: 'Sie haben erfolgreich ein neues Passwort eingerichtet.', - TEXT_2: 'Klicken Sie unten auf Login, um fortzufahren.' + TEXT_2: 'Klicken Sie unten auf Login, um fortzufahren.', }, SIGN_UP: { SIGNUP_TO: 'Registrieren Sie sich bei {0}', - NO_EMAIL: "Haben Sie die E-Mail nicht erhalten?", + NO_EMAIL: 'Haben Sie die E-Mail nicht erhalten?', REQUEST_EMAIL: 'Hier ein weitere E-Mail anfordern', HAVE_ACCOUNT: 'Sie haben bereits ein Konto?', GOTO_LOGIN: 'Gehen Sie zur Anmeldeseite', AFFILIATION_CODE: 'Empfehlungscode (optional)', - AFFILIATION_CODE_PLACEHOLDER:'Geben Sie Ihren Empfehlungscode ein', + AFFILIATION_CODE_PLACEHOLDER: 'Geben Sie Ihren Empfehlungscode ein', TERMS: { terms: 'Allgemeine Bedingungen', policy: 'Datenschutzrichtlinie', - text: 'Ich habe die {0} und {1} gelesen und stimme ihnen zu.' - } + text: 'Ich habe die {0} und {1} gelesen und stimme ihnen zu.', + }, }, VERIFICATION_TEXTS: { TITLE: 'E-Mail gesendet', - TEXT_1: 'Prüfen Sie Ihre E-Mail und klicken Sie auf den Link, um Ihre E-Mail zu verifizieren.', + TEXT_1: + 'Prüfen Sie Ihre E-Mail und klicken Sie auf den Link, um Ihre E-Mail zu verifizieren.', TEXT_2: - 'If you have not received any email verification and you have checked your junk mail then you can try clicking resend below.' + 'If you have not received any email verification and you have checked your junk mail then you can try clicking resend below.', }, VERIFICATION_EMAIL_REQUEST: { TITLE: 'E-Mail-Anfrage erneut senden', - BUTTON: 'E-Mail anfordern' + BUTTON: 'E-Mail anfordern', }, VERIFICATION_EMAIL_REQUEST_SUCCESS: { TITLE: 'E-Mail erneut senden', TEXT_1: - 'Wenn Sie nach einigen Minuten immer noch keine E-Mail-Bestätigung erhalten haben, kontaktieren Sie uns bitte unten.' + 'Wenn Sie nach einigen Minuten immer noch keine E-Mail-Bestätigung erhalten haben, kontaktieren Sie uns bitte unten.', }, VERIFICATION_EMAIL: { INVALID_UUID: 'Ungültiger Code', - TEXT_1: "Sie haben Ihre E-Mail erfolgreich verifiziert.", - TEXT_2: 'Sie können nun zur Anmeldung fortfahren.' + TEXT_1: 'Sie haben Ihre E-Mail erfolgreich verifiziert.', + TEXT_2: 'Sie können nun zur Anmeldung fortfahren.', }, USER_VERIFICATION: { INFO_TXT: @@ -449,14 +453,15 @@ export default { GENDER_PLACEHOLDER: 'Geben Sie an, welches Geschlecht Sie haben', GENDER_OPTIONS: { MAN: 'Männlich', - WOMAN: 'Weiblich' + WOMAN: 'Weiblich', }, NATIONALITY_LABEL: 'Nationalität', NATIONALITY_PLACEHOLDER: 'Geben Sie ein, welche Nationalität in Ihrem Ausweisdokument steht', DOB_LABEL: 'Geburtsdatum', COUNTRY_LABEL: 'Land Ihres Wohnsitzes', - COUNTRY_PLACEHOLDER: 'Wählen Sie das Land aus, in dem Sie sich derzeit befinden.', + COUNTRY_PLACEHOLDER: + 'Wählen Sie das Land aus, in dem Sie sich derzeit befinden.', CITY_LABEL: 'Stadt', CITY_PLACEHOLDER: 'Geben Sie die Stadt ein, in der Sie wohnen', ADDRESS_LABEL: 'Adresse', @@ -464,14 +469,15 @@ export default { POSTAL_CODE_LABEL: 'Postleitzahl', POSTAL_CODE_PLACEHOLDER: 'Geben Sie Ihre Postleitzahl ein', PHONE_CODE_LABEL: 'Land', - PHONE_CODE_PLACEHOLDER: 'Wählen Sie das Land, in dem Ihr Telefon angemeldet ist', + PHONE_CODE_PLACEHOLDER: + 'Wählen Sie das Land, in dem Ihr Telefon angemeldet ist', PHONE_CODE_DISPLAY: '({0}) {1}', // 0 -> (+21) 1 -> South Korea PHONE_NUMBER_LABEL: 'Telefonnummer', PHONE_NUMBER_PLACEHOLDER: 'Geben Sie Ihre Telefonnummer ein', CONNECTING_LOADING: 'Verbinden', SMS_SEND: 'SMS senden', SMS_CODE_LABEL: 'SMS-Code', - SMS_CODE_PLACEHOLDER: 'Geben Sie Ihren SMS-Code ein' + SMS_CODE_PLACEHOLDER: 'Geben Sie Ihren SMS-Code ein', }, INFORMATION: { TEXT: @@ -483,27 +489,29 @@ export default { PHONE_VERIFICATION_TXT_1: 'Erhalten Sie Echtzeit-Updates für Ein- und Auszahlungen, indem Sie Ihre Handynummer mitteilen.', PHONE_VERIFICATION_TXT_2: - 'Beweisen Sie außerdem Ihre Identität und Adresse, indem Sie Ihre LAN-Telefonnummer angeben (optional).' - } + 'Beweisen Sie außerdem Ihre Identität und Adresse, indem Sie Ihre LAN-Telefonnummer angeben (optional).', + }, }, ID_DOCUMENTS_FORM: { VALIDATIONS: { ID_TYPE: 'Bitte wählen Sie eine Art von Ausweisdokument', ID_NUMBER: 'Bitte geben Sie Ihre Dokumentennummer ein', - ISSUED_DATE: 'Bitte wählen Sie das Datum, an dem Ihr Dokument ausgestellt wurde', + ISSUED_DATE: + 'Bitte wählen Sie das Datum, an dem Ihr Dokument ausgestellt wurde', EXPIRATION_DATE: 'Bitte wählen Sie das Datum, an dem Ihr Dokument abläuft', FRONT: 'Bitte laden Sie eine Kopie Ihres Reisepasses hoch', PROOF_OF_RESIDENCY: 'Bitte laden Sie eine Kopie des Dokuments hoch, das Ihren aktuellen Wohnsitz belegt', - SELFIE_PHOTO_ID: 'Bitte laden Sie ein Selfie mit Reisepass und Notiz hoch' + SELFIE_PHOTO_ID: + 'Bitte laden Sie ein Selfie mit Reisepass und Notiz hoch', }, FORM_FIELDS: { TYPE_LABEL: 'Dokument-ID Typ', TYPE_PLACEHOLDER: 'Art des Ausweises wählen', TYPE_OPTIONS: { ID: 'ID', - PASSPORT: 'Reisepass' + PASSPORT: 'Reisepass', }, ID_NUMBER_LABEL: 'Reisepassnummer', ID_NUMBER_PLACEHOLDER: 'Geben Sie Ihre Reisepassnummer ein', @@ -519,10 +527,11 @@ export default { PASSPORT_LABEL: 'Reisepass-Dokument', PASSPORT_PLACEHOLDER: 'Fügen Sie eine Kopie Ihres Passdokuments hinzu', POR_LABEL: 'Dokument zum Nachweis Ihrer Adresse', - POR_PLACEHOLDER: 'Fügen Sie eine Kopie eines Dokuments hinzu, das Ihre Adresse belegt', + POR_PLACEHOLDER: + 'Fügen Sie eine Kopie eines Dokuments hinzu, das Ihre Adresse belegt', SELFIE_PHOTO_ID_LABEL: 'Ihr Selfie mit Reisepass und Notiz', SELFIE_PHOTO_ID_PLACEHOLDER: - 'Fügen Sie eine Kopie Ihres Selfies mit Reisepass und Notiz hinzu' + 'Fügen Sie eine Kopie Ihres Selfies mit Reisepass und Notiz hinzu', }, INFORMATION: { IDENTITY_DOCUMENT: 'Ausweisdokument', @@ -531,14 +540,16 @@ export default { TITLE: 'Bitte stellen Sie sicher, dass Ihre eingereichten Dokumente:', LIST_ITEM_1: 'HOHE QUALITÄT (Farbbilder, 300dpi Auflösung oder höher) sind.', - LIST_ITEM_2: 'VOLLSTÄNDIG SICHTBAR (Wasserzeichen sind erlaubt) sind.', - LIST_ITEM_3: 'GÜLTIG, mit deutlich sichtbarem Gültigkeitsdatum, sind.', + LIST_ITEM_2: + 'VOLLSTÄNDIG SICHTBAR (Wasserzeichen sind erlaubt) sind.', + LIST_ITEM_3: + 'GÜLTIG, mit deutlich sichtbarem Gültigkeitsdatum, sind.', WARNING_1: 'Es wird nur ein gültiger Reisepass akzeptiert; Fotos in hoher Qualität oder gescannte Bilder dieser Dokumente sind akzeptabel:', WARNING_2: 'Stellen Sie sicher, dass Sie Ihre eigenen Dokumente hochladen. Jede Verwendung von falschen oder gefälschten Dokumenten hat rechtliche Konsequenzen und führt zur sofortigen Sperrung Ihres Kontos.', WARNING_3: - 'Reichen Sie bitte nicht den Reisepass als Wohnsitznachweis ein.' + 'Reichen Sie bitte nicht den Reisepass als Wohnsitznachweis ein.', }, POR: { SECTION_1_TEXT_1: @@ -556,7 +567,7 @@ export default { SECTION_2_LIST_ITEM_3: 'Ein von der Regierung ausgestelltes Dokument (Steuererklärung, Wohnsitzbescheinigung usw.).', WARNING: - 'Wir können die Adresse auf Ihrem eingereichten Ausweisdokument nicht als gültigen Wohnsitznachweis akzeptieren.' + 'Wir können die Adresse auf Ihrem eingereichten Ausweisdokument nicht als gültigen Wohnsitznachweis akzeptieren.', }, SELFIE: { TITLE: 'Selfie mit Reisepass und Notiz', @@ -566,12 +577,12 @@ export default { INSTRUCTION_1: 'Ihr Gesicht muss deutlich sichtbar sein', INSTRUCTION_2: 'Reisepass muss deutlich lesbar sein', INSTRUCTION_3: 'Schreiben Sie den Namen des Exchange.', - INSTRUCTION_4: "Schreiben Sie das heutige Datum", + INSTRUCTION_4: 'Schreiben Sie das heutige Datum', INSTRUCTION_5: 'Unterschreiben Sie die Notiz.', WARNING: - 'Selfie mit einem anderen Reisepass mit hochgeladenem Inhalt wird abgelehnt' - } - } + 'Selfie mit einem anderen Reisepass mit hochgeladenem Inhalt wird abgelehnt', + }, + }, }, BANK_ACCOUNT_FORM: { VALIDATIONS: { @@ -581,7 +592,7 @@ export default { 'Ihre Bankkontonummer sollte weniger als 50 Ziffern haben', ACCOUNT_NUMBER_MAX_LENGTH: 'Ihre Bankkontonummer hat ein Limit von 50 Zeichen', - CARD_NUMBER: 'Ihre Kartennummer hat ein falsches Format' + CARD_NUMBER: 'Ihre Kartennummer hat ein falsches Format', }, FORM_FIELDS: { BANK_NAME_LABEL: 'Bank Name', @@ -592,20 +603,22 @@ export default { ACCOUNT_OWNER_PLACEHOLDER: 'Type the name as on your bank account', CARD_NUMBER_LABEL: 'Bankkartennummer', CARD_NUMBER_PLACEHOLDER: - 'Geben Sie die 16-stellige Nummer ein, die sich auf der Vorderseite Ihrer Bankkarte befindet' - } + 'Geben Sie die 16-stellige Nummer ein, die sich auf der Vorderseite Ihrer Bankkarte befindet', + }, }, WARNING: { - TEXT_1: 'Durch die Verifizierung Ihrer Identität können Sie Folgendes erhalten:', + TEXT_1: + 'Durch die Verifizierung Ihrer Identität können Sie Folgendes erhalten:', LIST_ITEM_1: 'Erhöhte Abhebungslimits', LIST_ITEM_2: 'Erhöhte Einzahlungslimits', - LIST_ITEM_3: 'Niedrigere Gebühren' - } + LIST_ITEM_3: 'Niedrigere Gebühren', + }, }, USER_SETTINGS: { TITLE_TEXT_1: 'Ändern Sie die Einstellungen Ihres Kontos. Von Schnittstelle, Benachrichtigungen, Benutzername und anderen Anpassungen.', - TITLE_TEXT_2: 'Wenn Sie die Einstellungen speichern, werden die Änderungen übernommen und gespeichert.', + TITLE_TEXT_2: + 'Wenn Sie die Einstellungen speichern, werden die Änderungen übernommen und gespeichert.', TITLE_NOTIFICATION: 'Benachrichtigung', TITLE_INTERFACE: 'Interface', TITLE_LANGUAGE: 'Sprache', @@ -627,30 +640,28 @@ export default { ORDER_PORTFOLIO_LABEL: 'Prozentualer Anteil des Portfolios:', NOTIFICATION_FORM: { TRADE_POPUPS: 'Handel Pop-ups', - POPUP_ORDER_CONFIRMATION: 'Vor dem Absenden von Bestellungen um Bestätigung bitten', - POPUP_ORDER_COMPLETED: 'Pop-up anzeigen, wenn die Bestellung abgeschlossen ist', + POPUP_ORDER_CONFIRMATION: + 'Vor dem Absenden von Bestellungen um Bestätigung bitten', + POPUP_ORDER_COMPLETED: + 'Pop-up anzeigen, wenn die Bestellung abgeschlossen ist', POPUP_ORDER_PARTIALLY_FILLED: - 'Pop-up anzeigen, wenn der Auftrag teilweise gefüllt ist' + 'Pop-up anzeigen, wenn der Auftrag teilweise gefüllt ist', }, - AUDIO_CUE_FORM: { // new + AUDIO_CUE_FORM: { + // new ALL_AUDIO: 'Alle Audio-Cues', PUBLIC_TRADE_AUDIO: 'Wenn ein öffentlicher Handel stattgefunden hat', - ORDERS_PARTIAL_AUDIO: - 'Wenn einer Ihrer Aufträge teilweise erfüllt ist', - ORDERS_PLACED_AUDIO: - 'Wenn eine Bestellung aufgegeben wird', - ORDERS_CANCELED_AUDIO: - 'Wenn ein Auftrag storniert wird', + ORDERS_PARTIAL_AUDIO: 'Wenn einer Ihrer Aufträge teilweise erfüllt ist', + ORDERS_PLACED_AUDIO: 'Wenn eine Bestellung aufgegeben wird', + ORDERS_CANCELED_AUDIO: 'Wenn ein Auftrag storniert wird', ORDERS_COMPLETED_AUDIO: 'Wenn einer Ihrer Aufträge vollständig gefüllt ist', CLICK_AMOUNTS_AUDIO: 'Wenn Sie Beträge und Preise im Auftragsbuch anklicken', - GET_QUICK_TRADE_AUDIO: - 'Wenn Sie ein Angebot für das Protrading einholen', + GET_QUICK_TRADE_AUDIO: 'Wenn Sie ein Angebot für das Protrading einholen', SUCCESS_QUICK_TRADE_AUDIO: 'Wenn ein erfolgreicher Quick-Trade stattfindet', - QUICK_TRADE_TIMEOUT_AUDIO: - 'Wenn Quick-Trade-Timeout ', + QUICK_TRADE_TIMEOUT_AUDIO: 'Wenn Quick-Trade-Timeout ', }, RISK_MANAGEMENT: { INFO_TEXT: @@ -660,8 +671,8 @@ export default { TOMAN_ASSET: 'Ungefährer Wert', ADJUST: '(PROZENTSATZ ANPASSEN)', ACTIVATE_RISK_MANAGMENT: 'Aktivieren Sie das Risikomanagement', - WARNING_POP_UP: 'Warn-Pop-ups' - } + WARNING_POP_UP: 'Warn-Pop-ups', + }, }, TRANSACTION_HISTORY: { TITLE: 'Verlauf', @@ -671,7 +682,7 @@ export default { TEXT_DOWNLOAD: 'DOWNLOAD-HISTORIE', TRADES: 'Trades', DEPOSITS: 'Einzahlungen', - WITHDRAWALS: 'Abhebungen' + WITHDRAWALS: 'Abhebungen', }, ACCOUNT_SECURITY: { OTP: { @@ -680,11 +691,11 @@ export default { OTP_DISABLED: 'BITTE SCHALTEN SIE DIE 2FA FUNKTION EIN', ENABLED_TEXTS: { TEXT_1: 'OTP bei der Anmeldung verlangen', - TEXT_2: 'OTP beim Abheben von Geldern verlangen' + TEXT_2: 'OTP beim Abheben von Geldern verlangen', }, DIALOG: { SUCCESS: 'Sie haben das OTP erfolgreich aktiviert', - REVOKE: 'Sie haben Ihr OTP erfolgreich widerrufen' + REVOKE: 'Sie haben Ihr OTP erfolgreich widerrufen', }, CONTENT: { TITLE: 'Aktivieren der Zwei-Faktor-Authentifizierung', @@ -700,55 +711,59 @@ export default { WARNING: 'Wir empfehlen Ihnen dringend, die 2-Faktor-Authentifizierung (2FA) einzurichten. Dadurch wird die Sicherheit Ihrer Gelder erheblich erhöht.', ENABLE: 'Aktivieren der Zwei-Faktoren-Authentifizierung', - DISABLE: 'Zwei-Faktor-Authentifizierung deaktivieren' + DISABLE: 'Zwei-Faktor-Authentifizierung deaktivieren', }, FORM: { - PLACEHOLDER: 'Geben Sie Ihr von Google Authenticator bereitgestelltes OTP ein.', - BUTTON: '2FA aktivieren' - } + PLACEHOLDER: + 'Geben Sie Ihr von Google Authenticator bereitgestelltes OTP ein.', + BUTTON: '2FA aktivieren', + }, }, CHANGE_PASSWORD: { TITLE: 'Passwort ändern', ACTIVE: 'AKTIV', DIALOG: { - SUCCESS: 'Sie haben Ihr Passwort erfolgreich geändert' + SUCCESS: 'Sie haben Ihr Passwort erfolgreich geändert', }, FORM: { BUTTON: 'Passwort ändern', CURRENT_PASSWORD: { label: 'Aktuelles Passwort', - placeholder: 'Geben Sie Ihr aktuelles Passwort ein' + placeholder: 'Geben Sie Ihr aktuelles Passwort ein', }, NEW_PASSWORD: { label: 'Neues Passwort', - placeholder: 'Geben Sie ein neues Passwort ein' + placeholder: 'Geben Sie ein neues Passwort ein', }, NEW_PASSWORD_REPEAT: { label: 'Neues Passwort bestätigen', - placeholder: 'Geben Sie Ihr neues Passwort erneut ein' - } - } - } + placeholder: 'Geben Sie Ihr neues Passwort erneut ein', + }, + }, + }, }, CURRENCY: 'Währung', TYPE: 'Typ', TYPES_VALUES: { market: 'Markt', - limit: 'Limit' + limit: 'Limit', }, TYPES: [ { value: 'market', label: 'Markt' }, // DO NOT CHANGE value, ONLY TRANSLATE label - { value: 'limit', label: 'Limit' } // DO NOT CHANGE value, ONLY TRANSLATE label + { value: 'limit', label: 'Limit' }, // DO NOT CHANGE value, ONLY TRANSLATE label ], SIDE: 'Seite', SIDES_VALUES: { buy: 'kaufen', - sell: 'verkaufen' + sell: 'verkaufen', }, - SIDES: [{ value: 'buy', label: 'kaufen' }, { value: 'sell', label: 'verkaufen' }], // DO NOT CHANGE value, ONLY TRANSLATE label + SIDES: [ + { value: 'buy', label: 'kaufen' }, + { value: 'sell', label: 'verkaufen' }, + ], // DO NOT CHANGE value, ONLY TRANSLATE label DEFAULT_TOGGLE_OPTIONS: [ { value: true, label: 'an' }, // DO NOT CHANGE value, ONLY TRANSLATE label - { value: false, label: 'aus' } // DO NOT CHANGE value, ONLY TRANSLATE label + { value: false, label: 'aus' }, // DO NOT CHANGE value, ONLY TRANSLATE label ], SIZE: 'Größe', PRICE: 'Preis', @@ -794,7 +809,7 @@ export default { h: 'Hoch', l: 'Tief', c: 'Schließen', - v: 'Volumen' + v: 'Volumen', }, QUICK_TRADE: 'Quick trade', PRO_TRADE: 'Pro trade', @@ -825,8 +840,7 @@ export default { WITHDRAWALS_FORM_AMOUNT_LABEL: '{0} abzuhebender Betrag', WITHDRAWALS_FORM_AMOUNT_PLACEHOLDER: 'Geben Sie den Betrag von {0} ein, den Sie abheben möchten', - WITHDRAWALS_FORM_FEE_COMMON_LABEL: - 'Transaktionsgebühr', + WITHDRAWALS_FORM_FEE_COMMON_LABEL: 'Transaktionsgebühr', WITHDRAWALS_FORM_FEE_FIAT_LABEL: 'Bankabhebungsgebühr', WITHDRAWALS_FORM_FEE_PLACEHOLDER: 'Geben Sie den Betrag von {0} ein, den Sie als Gebühr für die Transaktion verwenden möchten', @@ -852,15 +866,18 @@ export default { DEPOSIT_VERIFICATION_WARNING_INFORMATION: 'Dies ist die ID des Vorgangs: "{0}", bitte teilen Sie uns diese ID mit, damit wir Ihnen helfen können.', DEPOSIT_VERIFICATION_SUCCESS: 'Zahlung verifiziert', - DEPOSIT_VERIFICATION_ERROR: 'Es ist ein Fehler bei der Verifizierung der Einzahlung aufgetreten.', - DEPOSIT_VERIFICATION_ERROR_VERIFIED: 'Die Einzahlung wurde bereits verifiziert', + DEPOSIT_VERIFICATION_ERROR: + 'Es ist ein Fehler bei der Verifizierung der Einzahlung aufgetreten.', + DEPOSIT_VERIFICATION_ERROR_VERIFIED: + 'Die Einzahlung wurde bereits verifiziert', DEPOSIT_VERIFICATION_ERROR_STATUS: 'Ungültiger Status', DEPOSIT_VERIFICATION_ERROR_USER_MATCH: 'Die Karte, mit der Sie die Einzahlung vorgenommen haben, ist nicht dieselbe wie Ihre registrierte Karte. Daher wird Ihre Einzahlung abgelehnt und Ihr Geld wird in weniger als einer Stunde zurückerstattet.', QUOTE_MESSAGE: 'Sie gehen zu {0} {1} {2} für {3} {4}', QUOTE_BUTTON: 'Akzeptieren', QUOTE_REVIEW: 'Überprüfen', - QUOTE_COUNTDOWN_MESSAGE: 'Sie haben {0} Sekunden, um den Handel durchzuführen', + QUOTE_COUNTDOWN_MESSAGE: + 'Sie haben {0} Sekunden, um den Handel durchzuführen', QUOTE_EXPIRED_TOKEN: 'Der Quote-Token ist abgelaufen.', QUOTE_SUCCESS_REVIEW_TITLE: 'Quick Trade', QUOTE_SUCCESS_REVIEW_MESSAGE: 'Sie haben erfolgreich {0} {1} {2} für {3} {4}', // you have successfully buy 1 btc from x toman @@ -879,14 +896,17 @@ export default { BASE_MESSAGE_3: 'Täglicher Abhebungs-Maximalbetragt', BASE_INCREASE_LIMIT: 'Erhöhen Sie Ihr Tageslimit', CONFIRM_VIA_EMAIL: 'Bestätigen Sie per E-Mail', - CONFIRM_VIA_EMAIL_1: 'Wir haben Ihnen eine Bestätigungs-E-Mail zur Abhebung geschickt.', + CONFIRM_VIA_EMAIL_1: + 'Wir haben Ihnen eine Bestätigungs-E-Mail zur Abhebung geschickt.', CONFIRM_VIA_EMAIL_2: 'Um den Abhebungsvorgang abzuschließen, bestätigen Sie bitte', - CONFIRM_VIA_EMAIL_3: 'die Abhebung über Ihre E-Mail innerhalb von 5 Minuten.', - WITHDRAW_CONFIRM_SUCCESS_1: 'Ihre Abhebungsanfrage ist bestätigt. Sie wird in Kürze bearbeitet.', + CONFIRM_VIA_EMAIL_3: + 'die Abhebung über Ihre E-Mail innerhalb von 5 Minuten.', + WITHDRAW_CONFIRM_SUCCESS_1: + 'Ihre Abhebungsanfrage ist bestätigt. Sie wird in Kürze bearbeitet.', WITHDRAW_CONFIRM_SUCCESS_2: 'Um Ihren Abhebungsstatus zu sehen, besuchen Sie bitte Ihre Abhebungs-Historienseite', - GO_WITHDRAWAL_HISTORY: 'Zur Abhebungsverlaufsseite gehen' + GO_WITHDRAWAL_HISTORY: 'Zur Abhebungsverlaufsseite gehen', }, WALLET_BUTTON_BASE_DEPOSIT: 'einzahlen', WALLET_BUTTON_BASE_WITHDRAW: 'abheben', @@ -925,8 +945,7 @@ export default { LOGOUT_ERROR_TOKEN_EXPIRED: 'Token ist abgelaufen', LOGOUT_ERROR_LOGIN_AGAIN: 'Erneut anmelden', // ip doesnt match LOGOUT_ERROR_INVALID_TOKEN: 'Ungültiges Token', - LOGOUT_ERROR_INACTIVE: - 'Sie wurden abgemeldet, weil Sie inaktiv waren', + LOGOUT_ERROR_INACTIVE: 'Sie wurden abgemeldet, weil Sie inaktiv waren', ORDER_ENTRY_BUTTON: '{0} {1}', // 0 -> buy/sell 1 -> btc/.. QUICK_TRADE_OUT_OF_LIMITS: 'Auftragsgröße ist außerhalb der Grenzen', QUICK_TRADE_TOKEN_USED: 'Token wurde verwendet', @@ -971,12 +990,12 @@ export default { SETTINGS_ORDERPOPUP_LABEL: 'Pop-up zur Auftragsbestätigung anzeigen', SETTINGS_ORDERPOPUP_OPTIONS: [ { value: false, label: 'NEIN' }, // DO NOT CHANGE value, ONLY TRANSLATE label - { value: true, label: 'Ja' } // DO NOT CHANGE value, ONLY TRANSLATE label + { value: true, label: 'Ja' }, // DO NOT CHANGE value, ONLY TRANSLATE label ], SETTINGS_THEME_LABEL: 'User Interface Theme', // TODO set right labels // ToDo SETTINGS_THEME_OPTIONS: [ { value: 'white', label: 'Weiß' }, // DO NOT CHANGE value, ONLY TRANSLATE label - { value: 'dark', label: 'Dunkel' } // DO NOT CHANGE value, ONLY TRANSLATE label + { value: 'dark', label: 'Dunkel' }, // DO NOT CHANGE value, ONLY TRANSLATE label ], SETTING_BUTTON: 'speichern', STRING_WITH_PARENTHESIS: '{0} ({1})', @@ -996,7 +1015,7 @@ export default { ACTIVE: 'Aktiv', INACTIVE: 'Inaktiv', INVALID_LEVEL: - 'Sie müssen Ihre Verifizierungsstufe erhöhen, um Zugriff auf diese Funktion zu haben' // TODO + 'Sie müssen Ihre Verifizierungsstufe erhöhen, um Zugriff auf diese Funktion zu haben', // TODO }, DEVELOPERS_TOKENS_POPUP: { GENERATE_TITLE: 'API-Schlüssel generieren', @@ -1014,7 +1033,7 @@ export default { CREATED_TITLE: 'Kopieren Sie Ihren API-Schlüssel', CREATED_TEXT_1: 'Bitte kopieren Sie Ihren API-Schlüssel, da dieser in Zukunft nicht mehr erreichbar sein wird.', - CREATED_TEXT_2: 'Halten Sie Ihren Schlüssel privat.' + CREATED_TEXT_2: 'Halten Sie Ihren Schlüssel privat.', }, DEVELOPERS_TOKENS_TABLE: { NAME: 'Name', @@ -1023,7 +1042,7 @@ export default { CREATED: 'Erstelltes Datum', REVOKE: 'Widerrufen', REVOKED: 'Widerrufen', - REVOKE_TOOLTIP: 'Sie müssen 2FA aktivieren, um das Token zu widerrufen' // TODO + REVOKE_TOOLTIP: 'Sie müssen 2FA aktivieren, um das Token zu widerrufen', // TODO }, CHAT: { CHAT_TEXT: 'Chat', @@ -1035,11 +1054,12 @@ export default { CHAT_MESSAGE_BOX_PLACEHOLDER: 'Mitteilungen', SIGN_UP_CHAT: 'Zum Chatten anmelden', JOIN_CHAT: 'Benutzername für den Chat festlegen', - TROLLBOX: 'Trollbox ({0})' // new + TROLLBOX: 'Trollbox ({0})', // new }, INVALID_USERNAME: 'Der Benutzername muss zwischen 3 und 15 Zeichen lang sein. Enthält nur Kleinbuchstaben, Zahlen und Unterstrich', - USERNAME_TAKEN: 'Dieser Benutzername ist bereits vergeben. Bitte versuchen Sie einen anderen.', + USERNAME_TAKEN: + 'Dieser Benutzername ist bereits vergeben. Bitte versuchen Sie einen anderen.', USERNAME_LABEL: 'Benutzername (wird für den Chat verwendet)', USERNAME_PLACEHOLDER: 'Benutzername', TAB_USERNAME: 'Benutzername', @@ -1063,7 +1083,7 @@ export default { LABEL_PAIR_MAKER_FEE: '{0} Maker Gebühr', LABEL_PAIR_TAKER_FEE: '{0} Taker Gebühr', UNLIMITED: 'Unbegrenzt', - BLOCKED: '0' + BLOCKED: '0', }, WALLET_ADDRESS_TITLE: 'Geldbörse {0} generieren', WALLET_ADDRESS_GENERATE: 'Erzeugen', @@ -1119,7 +1139,8 @@ export default { VIEW_FEE_STRUCTURE: 'Gebührenstruktur und Limits anzeigen', UPGRADE_ACCOUNT: 'Konto aktualisieren', ACTIVE_2FA_SECURITY: 'Aktive 2FA-Sicherheit', - ACCOUNT_ASSETS_TXT_1: 'Angezeigt wird eine Übersicht über alle Ihre Assets.', + ACCOUNT_ASSETS_TXT_1: + 'Angezeigt wird eine Übersicht über alle Ihre Assets.', ACCOUNT_ASSETS_TXT_2: 'Das Halten einer großen Menge an Vermögenswerten berechtigt Sie zu einem Konto-Upgrade, das ein einzigartiges Abzeichen und niedrigere Handelsgebühren beinhaltet.', TRADING_VOLUME_TXT_1: @@ -1194,15 +1215,21 @@ export default { TRADE_OVER_BTC: 'Handel über {0} BTC Wert', // new XHT_IN_WALLET: '{0} XHT in der Geldbörse', // new REWARDS_BONUS: 'Belohnungen und Prämien', // new - COMPLETE_TASK_DESC: 'Erfüllen Sie Aufgaben und verdienen Sie Prämien im Wert von über 10.000 $.', // new + COMPLETE_TASK_DESC: + 'Erfüllen Sie Aufgaben und verdienen Sie Prämien im Wert von über 10.000 $.', // new TASKS: 'Aufgaben', // new - MAKE_FIRST_DEPOSIT: 'Machen Sie Ihre erste Einzahlung und erhalten Sie 1 XHT', // new - BUY_FIRST_XHT: 'Kaufen Sie Ihr ersten XHT und erhalten Sie einen Bonus von 5 XHT', // new + MAKE_FIRST_DEPOSIT: + 'Machen Sie Ihre erste Einzahlung und erhalten Sie 1 XHT', // new + BUY_FIRST_XHT: + 'Kaufen Sie Ihr ersten XHT und erhalten Sie einen Bonus von 5 XHT', // new COMPLETE_ACC_VERIFICATION: 'Schließen Sie die Kontoverifizierung ab und erhalten Sie einen 20 XHT-Bonus', // new - INVITE_USER: 'Laden Sie Benutzer ein und genießen Sie Provisionen aus deren Handel', // new - JOIN_HAP: 'Werden Sie Mitglied bei HAP und verdienen Sie 10% für jedes verkaufte HollaEx Kit', // new - EARN_RUNNING_EXCHANGE: 'Verdienen Sie passives Einkommen durch den Betrieb Ihrer eigenen Exchange.', // new + INVITE_USER: + 'Laden Sie Benutzer ein und genießen Sie Provisionen aus deren Handel', // new + JOIN_HAP: + 'Werden Sie Mitglied bei HAP und verdienen Sie 10% für jedes verkaufte HollaEx Kit', // new + EARN_RUNNING_EXCHANGE: + 'Verdienen Sie passives Einkommen durch den Betrieb Ihrer eigenen Exchange.', // new XHT_WAVE_AUCTION: 'XHT-Wellen-Auktionsdaten', // new XHT_WAVE_DESC_1: 'Die Verteilung des HollaEx-Tokens (XHT) erfolgt über eine Wave-Auktion.', // new @@ -1214,17 +1241,19 @@ export default { LEARN_MORE_WAVE_AUCTION: 'Erfahren Sie mehr über die Wave Auktion', // new WAVE_NUMBER: 'Wellennummer', // new DISCOUNT: '( {0}% Rabatt )', // new - MY_FEES_LIMITS: ' Meine Gebühren und Limits' // new + MY_FEES_LIMITS: ' Meine Gebühren und Limits', // new }, REFERRAL_LINK: { TITLE: 'Freunde einladen', // new INFO_TEXT: 'Empfehlen Sie Ihre Freunde, indem Sie diesen Link weitergeben und erhalten Sie Vorteile, wenn Sie andere Personen einladen.', - COPY_FIELD_LABEL: 'Teilen Sie den untenstehenden Link mit Freunden und verdienen Sie Provisionen:', // new + COPY_FIELD_LABEL: + 'Teilen Sie den untenstehenden Link mit Freunden und verdienen Sie Provisionen:', // new REFERRED_USER_COUT: 'Sie haben {0} Benutzer empfohlen.', // new COPY_LINK_BUTTON: 'EMPFEHLUNGSLINK KOPIEREN', // new XHT_TITLE: 'MEINE REFERRALS', // new - XHT_INFO_TEXT: 'Verdienen Sie Provisionen, indem Sie Ihre Freunde einladen.', // new + XHT_INFO_TEXT: + 'Verdienen Sie Provisionen, indem Sie Ihre Freunde einladen.', // new XHT_INFO_TEXT_1: 'Provisionen werden periodisch an Ihre Geldbörse gezahlt', // new APPLICATION_TXT: 'Um ein HollaEx-Kit-Vertriebspartner zu werden, füllen Sie bitte einen Antrag aus.', // new @@ -1232,7 +1261,7 @@ export default { PENDING_REFERRAL: 'Ausstehende Kommissionen:', // new EARN_REFERRAL: 'Verdiente Provisionen:', // new XHT_COUNT: '{0} XHT', // new - APPLY_BUTTON: 'ANWENDEN' // new + APPLY_BUTTON: 'ANWENDEN', // new }, STAKE_TOKEN: { TITLE: 'Staken von HollaEx Token', // new @@ -1242,7 +1271,7 @@ export default { 'Sie können Ihre HollaEx-Token auf ähnliche Weise sichern und XHT verdienen, die während der Wave-Auktion nicht verkauft werden.', // new INFO_TXT3: 'Gehen Sie einfach auf dash.bitholla.com und sichern Sie sich noch heute Ihren eigenen Exchange und verdienen Sie kostenlos XHT', // new - BUTTON_TXT: 'FINDEN SIE MEHR' // new + BUTTON_TXT: 'FINDEN SIE MEHR', // new }, TERMS_OF_SERVICES: { // new @@ -1257,14 +1286,16 @@ export default { 'Zahlen Sie Geld in Ihre Geldbörse ein, um HollaEx Token (XHT) zu erhalten', READ_FAG: 'Lesen Sie HollaEx FAQ hier: {0}', READ_DOCUMENTATION: 'Lesen Sie das HollaEx Whitepaper hier: {0}', - READ_WAVES: 'Regeln für die kommende öffentliche Wellenauktion im Dezember{0}', // new + READ_WAVES: + 'Regeln für die kommende öffentliche Wellenauktion im Dezember{0}', // new DOWNLOAD_BUY_XHT: 'Laden Sie die PDF-Datei herunter, um eine visuelle Schritt-für-Schritt-Anleitung zu sehen {0}', HOW_TO_BUY: 'wie man HollaEx Token (XHT) kauft', PUBLIC_SALES: 'Öffentliche Wellen-Auktion', // new CONTACT_US: 'Für weitere Informationen und bei Problemen können Sie uns gerne eine E-Mail an {0} senden.', - VISUAL_STEP: 'Sehen Sie eine visuelle Schritt-für-Schritt-Anleitung auf {0}', // new + VISUAL_STEP: + 'Sehen Sie eine visuelle Schritt-für-Schritt-Anleitung auf {0}', // new WARNING_TXT: 'Wir werden Ihre Anfrage prüfen und Ihnen weitere Anweisungen für den Zugang zur XIV Exchange per E-Mail zusenden.', // new WARNING_TXT1: @@ -1275,7 +1306,7 @@ export default { XHT_TITLE: 'XHT', //new XHT_TRADE_TXT_1: 'Anmelden, um Ihre letzten Trades zu sehen', //new XHT_TRADE_TXT_2: 'Sie können {0}, um Ihren letzten Handelsverlauf zu sehen', //new - LOGIN_HERE: 'hier anmelden' + LOGIN_HERE: 'hier anmelden', }, WAVES: { // new @@ -1283,7 +1314,7 @@ export default { NEXT_WAVE: 'Nächste Welle', WAVE_AMOUNT: 'Menge in Welle', FLOOR: 'Etage', - LAST_WAVE: 'Letzte Wellee' + LAST_WAVE: 'Letzte Wellee', }, TYPES_OF_POSTS: { // new @@ -1291,12 +1322,13 @@ export default { ANNOUNCEMEN: 'Ankündigung', SYSTEM_UPDATE: 'System-Update', LAST_WAVE: 'Letzte Welle', - ANNOUNCEMENT_TXT: 'Kostenloses XHT wird an alle Geldbörsen verteilt, die sich für diese Funktion qualifizieren.', + ANNOUNCEMENT_TXT: + 'Kostenloses XHT wird an alle Geldbörsen verteilt, die sich für diese Funktion qualifizieren.', SYSTEM_UPDATE_TIME: 'Zeit: 12:31 PM, 19. Dezember 2019 ', SYSTEM_UPDATE_DURATION: '1 Stunde', LAST_WAVE_AMOUNT: '100, 213 XHT', LAST_WAVE_REDISTRIBUTED: ' 11, 211', - LAST_WAVE_TIME: ' 12: 31 PM, 19. Dezember 2019' + LAST_WAVE_TIME: ' 12: 31 PM, 19. Dezember 2019', }, USER_LEVEL: 'User Level', // new LIMIT_AMOUNT: 'Grenzwertbetrag', // new @@ -1326,10 +1358,11 @@ export default { 'Verdienen Sie XHT mit dem HAP-Programm, indem Sie Ihre Freunde in den Exchange einladen. {0}.', DEFAULT_ANNOUNCEMENT: 'In diesem Bereich werden Ihre öffentlichen Ankündigungen für den Exchange angezeigt!', - ANNOUNCEMENT_TXT_2: 'Kostenloses XHT wird an alle Geldbörsen verteilt, die {0}.', + ANNOUNCEMENT_TXT_2: + 'Kostenloses XHT wird an alle Geldbörsen verteilt, die {0}.', LEARN_MORE: 'Mehr erfahren', - APPLY_TODAY: 'Heute bewerben' // new + APPLY_TODAY: 'Heute bewerben', // new }, OPEN_WALLET: 'Offener Geldbeutel', // new - AGO: 'ago' // new + AGO: 'ago', // new }; diff --git a/web/src/config/lang/en.js b/web/src/config/lang/en.js index b66abb0edb..c9e45ba9e7 100644 --- a/web/src/config/lang/en.js +++ b/web/src/config/lang/en.js @@ -81,7 +81,8 @@ const nestedContent = { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', + TERMS_OF_SERVICE: 'Terms of Service', + PRIVACY_POLICY: 'Privacy Policy', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', @@ -973,6 +974,7 @@ const nestedContent = { LOGOUT_ERROR_INACTIVE: 'You have been logged out because you have been inactive', ORDER_ENTRY_BUTTON: '{0} {1}', // 0 -> buy/sell 1 -> btc/.. + ORDER_ENTRY_ADVANCED: 'Advanced', QUICK_TRADE_OUT_OF_LIMITS: 'Order size is out of the limits', QUICK_TRADE_TOKEN_USED: 'Token has been used', QUICK_TRADE_QUOTE_EXPIRED: 'Quote has expired', diff --git a/web/src/config/lang/es.js b/web/src/config/lang/es.js index c5caf45f59..a29347a7e3 100644 --- a/web/src/config/lang/es.js +++ b/web/src/config/lang/es.js @@ -78,7 +78,6 @@ export default { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', @@ -680,7 +679,8 @@ export default { WITHDRAWALS: 'Retiros', }, ACCOUNT_SECURITY: { - TITLE_TEXT:'Adjust the security settings for your account. From Two-factor authentication, password, API keys and other security related functions.', + TITLE_TEXT: + 'Adjust the security settings for your account. From Two-factor authentication, password, API keys and other security related functions.', OTP: { TITLE: 'Autenticación de dos factores', OTP_ENABLED: 'habilitar otp', @@ -710,7 +710,8 @@ export default { DISABLE: 'Desactivar la autenticación de dos factores', SECRET_1: 'Enter yor secret key', SECRET_2: 'Please enter your secret key to confirm you wrote it down.', - SECRET_3: 'This secret key will help you recover your account if you lost access to your phone.', + SECRET_3: + 'This secret key will help you recover your account if you lost access to your phone.', INPUT_1: 'Secret Key', TITLE_2: 'Enter One-Time Password (OTP)', @@ -796,7 +797,7 @@ export default { ], // DO NOT CHANGE value, ONLY TRANSLATE label DEFAULT_TOGGLE_OPTIONS: [ { value: true, label: 'Sí' }, // DO NOT CHANGE value, ONLY TRANSLATE label - { value: false, label: 'No' } // DO NOT CHANGE value, ONLY TRANSLATE label + { value: false, label: 'No' }, // DO NOT CHANGE value, ONLY TRANSLATE label ], SIZE: 'Cantidad', PRICE: 'Precio', @@ -872,8 +873,7 @@ export default { WITHDRAWALS_FORM_AMOUNT_LABEL: 'Cantidad de {0} para retirar', WITHDRAWALS_FORM_AMOUNT_PLACEHOLDER: 'Type the amount of {0} you wish to withdraw', - WITHDRAWALS_FORM_FEE_COMMON_LABEL: - 'Tarifa de Transacción', + WITHDRAWALS_FORM_FEE_COMMON_LABEL: 'Tarifa de Transacción', WITHDRAWALS_FORM_FEE_FIAT_LABEL: 'Bank withdrawal fee', WITHDRAWALS_FORM_FEE_PLACEHOLDER: 'Type the amount of {0} you wish to use in the fee of the transaction', @@ -1023,7 +1023,7 @@ export default { SETTINGS_ORDERPOPUP_LABEL: 'Display order confirmation popup', SETTINGS_ORDERPOPUP_OPTIONS: [ { value: false, label: 'NO' }, // DO NOT CHANGE value, ONLY TRANSLATE label - { value: true, label: 'Si' } // DO NOT CHANGE value, ONLY TRANSLATE label + { value: true, label: 'Si' }, // DO NOT CHANGE value, ONLY TRANSLATE label ], SETTINGS_THEME_LABEL: 'Tema de Interface de Usuario', // TODO set right labels // ToDo SETTINGS_THEME_OPTIONS: [ diff --git a/web/src/config/lang/fa.js b/web/src/config/lang/fa.js index de0053a91e..f7de0d48a2 100644 --- a/web/src/config/lang/fa.js +++ b/web/src/config/lang/fa.js @@ -81,7 +81,6 @@ const nestedContent = { FOOTER: { FOOTER_LEGAL: ['با افتخار توسعه داده شده در سئول ، کره جنوبی'], FOOTER_LANGUAGE_TEXT: 'زبان', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'درباره', SECTION_1_LINK_1: 'درباره ما', @@ -652,7 +651,8 @@ const nestedContent = { WITHDRAWALS: 'برداشت ها', }, ACCOUNT_SECURITY: { - TITLE_TEXT:'Adjust the security settings for your account. From Two-factor authentication, password, API keys and other security related functions.', + TITLE_TEXT: + 'Adjust the security settings for your account. From Two-factor authentication, password, API keys and other security related functions.', OTP: { TITLE: 'رمز یکبار مصرف', OTP_ENABLED: 'رمز یکبار مصرف را فعال کنید', @@ -682,7 +682,8 @@ const nestedContent = { DISABLE: 'غیر فعال کردن رمز یکبار مصرف', SECRET_1: 'Enter yor secret key', SECRET_2: 'Please enter your secret key to confirm you wrote it down.', - SECRET_3: 'This secret key will help you recover your account if you lost access to your phone.', + SECRET_3: + 'This secret key will help you recover your account if you lost access to your phone.', INPUT_1: 'Secret Key', TITLE_2: 'Enter One-Time Password (OTP)', diff --git a/web/src/config/lang/fr.js b/web/src/config/lang/fr.js index 8d333fc0d0..08411bce21 100644 --- a/web/src/config/lang/fr.js +++ b/web/src/config/lang/fr.js @@ -78,7 +78,6 @@ export default { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUES', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: ' À PROPOS', SECTION_1_LINK_1: 'NOTRE HISTOIRE', @@ -688,7 +687,8 @@ export default { WITHDRAWALS: 'Retraits', }, ACCOUNT_SECURITY: { - TITLE_TEXT:'Adjust the security settings for your account. From Two-factor authentication, password, API keys and other security related functions.', + TITLE_TEXT: + 'Adjust the security settings for your account. From Two-factor authentication, password, API keys and other security related functions.', OTP: { TITLE: 'Authentification à deux facteurs', OTP_ENABLED: 'otp activé', @@ -713,12 +713,13 @@ export default { MESSAGE_5: 'Manuellement', INPUT: 'Entrez votre One-Time Password (OTP)', WARNING: - 'Nous vous recommandons vivement de configurer l\'authentification à 2 facteurs (2FA). Cela augmentera considérablement la sécurité de vos fonds.', - ENABLE: 'Activer l\'authentification à deux facteurs ', - DISABLE: 'Désactiver l\'authentification à deux facteurs', + "Nous vous recommandons vivement de configurer l'authentification à 2 facteurs (2FA). Cela augmentera considérablement la sécurité de vos fonds.", + ENABLE: "Activer l'authentification à deux facteurs ", + DISABLE: "Désactiver l'authentification à deux facteurs", SECRET_1: 'Enter yor secret key', SECRET_2: 'Please enter your secret key to confirm you wrote it down.', - SECRET_3: 'This secret key will help you recover your account if you lost access to your phone.', + SECRET_3: + 'This secret key will help you recover your account if you lost access to your phone.', INPUT_1: 'Secret Key', TITLE_2: 'Enter One-Time Password (OTP)', diff --git a/web/src/config/lang/id.js b/web/src/config/lang/id.js index eafb1dedbc..661c9ba6a8 100644 --- a/web/src/config/lang/id.js +++ b/web/src/config/lang/id.js @@ -79,7 +79,6 @@ export default { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', diff --git a/web/src/config/lang/ja.js b/web/src/config/lang/ja.js index 9b335f147f..4e927721e4 100644 --- a/web/src/config/lang/ja.js +++ b/web/src/config/lang/ja.js @@ -78,7 +78,6 @@ export default { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', diff --git a/web/src/config/lang/ko.js b/web/src/config/lang/ko.js index 417794be5f..a0b2f1e6ef 100644 --- a/web/src/config/lang/ko.js +++ b/web/src/config/lang/ko.js @@ -79,7 +79,6 @@ const nestedContent = { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', diff --git a/web/src/config/lang/vi.js b/web/src/config/lang/vi.js index 9655fba70d..81c1697e30 100644 --- a/web/src/config/lang/vi.js +++ b/web/src/config/lang/vi.js @@ -79,7 +79,6 @@ export default { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', diff --git a/web/src/config/lang/zh.js b/web/src/config/lang/zh.js index 309f5f1f43..d83c12b584 100644 --- a/web/src/config/lang/zh.js +++ b/web/src/config/lang/zh.js @@ -75,7 +75,6 @@ export default { FOOTER: { FOOTER_LEGAL: ['Proudly made in Seoul, South Korea', 'bitHolla Inc.'], FOOTER_LANGUAGE_TEXT: 'LANGUAGE', - FOOTER_COPYRIGHT: 'Powered by bitHolla', SECTIONS: { SECTION_1_TITLE: 'ABOUT', SECTION_1_LINK_1: 'About Us', diff --git a/web/src/containers/Admin/General/Description.js b/web/src/containers/Admin/General/Description.js index 302e66ad47..11137cea02 100644 --- a/web/src/containers/Admin/General/Description.js +++ b/web/src/containers/Admin/General/Description.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; -import { Tooltip } from 'antd'; +import { connect } from 'react-redux'; +import { Tooltip, Button } from 'antd'; import { QuestionCircleOutlined } from '@ant-design/icons'; import { AdminHocForm } from '../../../components'; @@ -7,9 +8,20 @@ import { STATIC_ICONS } from 'config/icons'; const DescriptionForm = AdminHocForm('DescriptionForm'); const FooterTextForm = AdminHocForm('FooterDescriptionForm'); +const ReferralBadgeForm = AdminHocForm('ReferralBadgeForm'); class Description extends Component { handleImg = (type) => { + if (type === 'referral_badge') { + return ( + referral badge + ); + } + return type === 'description' ? ( @@ -70,17 +85,72 @@ class Description extends Component {
-

Small text often used for copywrite or other business data

+

Add a link to your Terms of Service and Privacy Policy

+
+
+

+ Referral Badge{' '} + + + +

+
+

+ Edit the referral badge in the bottom left corner. This space can be + repurposed for copyright or other business related data. +

+ + {collateral_level === 'zero' && ( +
+
+
Fully rebrand your platform
+
+ Replace the badge with your own branding. +
+
+ +
+ )} + +
); } } -export default Description; +const mapStateToProps = (store) => ({ + constants: store.app.constants, +}); + +export default connect(mapStateToProps)(Description); diff --git a/web/src/containers/Admin/General/index.css b/web/src/containers/Admin/General/index.css index 3010dae5fe..a07263f589 100644 --- a/web/src/containers/Admin/General/index.css +++ b/web/src/containers/Admin/General/index.css @@ -296,10 +296,14 @@ h2, right: 8px; bottom: 3px; } -.description_footer { +.referral_badge_note { bottom: 60px; right: 7px; } +.description_footer { + bottom: 42px; + right: 4px; +} .custom-form-wrapper { display: flex; margin: 1.5rem 0rem; diff --git a/web/src/containers/Admin/General/index.js b/web/src/containers/Admin/General/index.js index 083b774aec..e9d812982b 100644 --- a/web/src/containers/Admin/General/index.js +++ b/web/src/containers/Admin/General/index.js @@ -287,6 +287,26 @@ class General extends Component { this.handleSubmitGeneral(formValues); }; + handleSubmitReferralBadge = (formProps) => { + this.handleSubmitGeneral({ + kit: { + links: { + ...formProps, + }, + }, + }); + }; + + handleSubmitTOSlinks = (formProps) => { + this.handleSubmitGeneral({ + kit: { + links: { + ...formProps, + }, + }, + }); + }; + handleSubmitHelpDesk = (formProps) => { this.handleSubmitGeneral({ kit: { @@ -709,8 +729,19 @@ class General extends Component { descriptionFields={generalFields.section_5} descriptionInitialValues={{ description: kit.description }} footerFields={generalFields.section_6} - footerInitialValues={{ description: kit.footer_description }} + ReferralBadgeFields={generalFields.section_8} + ReferralBadgeInitialValues={{ + hide_referral_badge: initialLinkValues.hide_referral_badge, + referral_label: initialLinkValues.referral_label, + referral_link: initialLinkValues.referral_link, + }} + footerInitialValues={{ + terms: initialLinkValues.terms, + privacy: initialLinkValues.privacy, + }} handleSubmitDescription={this.handleSubmitName} + handleSubmitFooterText={this.handleSubmitTOSlinks} + handleSubmitReferralBadge={this.handleSubmitReferralBadge} />
diff --git a/web/src/containers/Admin/General/utils.js b/web/src/containers/Admin/General/utils.js index 154ada501f..3879595af7 100644 --- a/web/src/containers/Admin/General/utils.js +++ b/web/src/containers/Admin/General/utils.js @@ -63,11 +63,15 @@ export const getGeneralFields = (coins) => ({ }, }, section_6: { - footer_description: { - type: 'textarea', - label: 'Small text', - placeholder: 'Write your small text filler', - validate: [validateRequired], + terms: { + type: 'input', + label: 'Terms of service link', + placeholder: 'https://', + }, + privacy: { + type: 'input', + label: 'Privacy policy link', + placeholder: 'https://', }, }, section_7: { @@ -77,4 +81,20 @@ export const getGeneralFields = (coins) => ({ placeholder: 'http://', }, }, + section_8: { + hide_referral_badge: { + type: 'checkbox', + label: 'Hide referral badge', + }, + referral_label: { + type: 'input', + label: 'Text label', + placeholder: 'Powered by bitHolla', + }, + referral_link: { + type: 'input', + label: 'Link', + placeholder: 'https://bitholla.com/', + }, + }, }); diff --git a/web/src/containers/App/App.js b/web/src/containers/App/App.js index 0d15cbbc25..94e31a5fcb 100644 --- a/web/src/containers/App/App.js +++ b/web/src/containers/App/App.js @@ -284,7 +284,7 @@ class App extends Component { }; renderDialogContent = ({ type, data }, prices = {}) => { - const { icons: ICONS } = this.props; + const { icons: ICONS, config_level } = this.props; switch (type) { case NOTIFICATIONS.ORDERS: case NOTIFICATIONS.TRADES: @@ -357,6 +357,7 @@ class App extends Component { case FEES_STRUCTURE_AND_LIMITS: return ( console.error(err)); + + this.props.requestTiers(); }; getUserDetails = () => { @@ -728,6 +731,7 @@ const mapDispatchToProps = (dispatch) => ({ setInfo: bindActionCreators(setInfo, dispatch), getMe: bindActionCreators(getMe, dispatch), setPlugins: bindActionCreators(setPlugins, dispatch), + requestTiers: bindActionCreators(requestTiers, dispatch), }); export default connect(mapStateToProps, mapDispatchToProps)(Container); diff --git a/web/src/containers/App/index.js b/web/src/containers/App/index.js index 1b01b0c819..556d09d6b0 100644 --- a/web/src/containers/App/index.js +++ b/web/src/containers/App/index.js @@ -60,6 +60,7 @@ const mapStateToProps = (store) => ({ info: store.app.info, enabledPlugins: store.app.enabledPlugins, features: store.app.features, + config_level: store.app.config_level, }); const mapDispatchToProps = (dispatch) => ({ diff --git a/web/src/containers/Summary/components/FeesAndLimits.js b/web/src/containers/Summary/components/FeesAndLimits.js index 78edca095e..20913ea0b3 100644 --- a/web/src/containers/Summary/components/FeesAndLimits.js +++ b/web/src/containers/Summary/components/FeesAndLimits.js @@ -15,6 +15,7 @@ const FeesAndLimits = ({ pairs, constants = {}, icons: ICONS, + tiers, }) => { const { verification_level, discount = 0 } = data; const LEVEL_OF_ACCOUNT = STRINGS.formatString( @@ -65,7 +66,7 @@ const FeesAndLimits = ({
- +
diff --git a/web/src/containers/Summary/components/FeesBlock.js b/web/src/containers/Summary/components/FeesBlock.js index a8c604c884..3277f2ee9b 100644 --- a/web/src/containers/Summary/components/FeesBlock.js +++ b/web/src/containers/Summary/components/FeesBlock.js @@ -6,10 +6,11 @@ import { formatPercentage } from '../../../utils/currency'; import { DEFAULT_COIN_DATA } from '../../../config/constants'; import { EditWrapper } from 'components'; -const getMakerRow = (pairs, coins, pair, level, index, discount) => { - const { pair_base, pair_2, maker_fees, taker_fees } = pairs[pair]; - const makersFee = maker_fees ? maker_fees[level] : 0; - const takersFee = taker_fees ? taker_fees[level] : 0; +const getMakerRow = (pairs, coins, pair, level, index, discount, tiers) => { + const { pair_base, pair_2 } = pairs[pair]; + const { fees: { maker, taker } = {} } = tiers[level] || {}; + const makersFee = maker ? maker[pair] : 0; + const takersFee = taker ? taker[pair] : 0; const pairBase = coins[pair_base] || DEFAULT_COIN_DATA; const pairTwo = coins[pair_2] || DEFAULT_COIN_DATA; const makersData = discount @@ -57,16 +58,18 @@ const getMakerRow = (pairs, coins, pair, level, index, discount) => { // ); // }; -const getRows = (pairs, level, coins, discount) => { +const getRows = (pairs, level, coins, discount, tiers) => { const rowData = []; Object.keys(pairs).map((pair, index) => { - rowData.push(getMakerRow(pairs, coins, pair, level, index, discount)); + rowData.push( + getMakerRow(pairs, coins, pair, level, index, discount, tiers) + ); return ''; }); return rowData; }; -const FeesBlock = ({ pairs, coins, level, discount }) => { +const FeesBlock = ({ pairs, coins, level, discount, tiers }) => { return (
@@ -97,7 +100,7 @@ const FeesBlock = ({ pairs, coins, level, discount }) => { - {getRows(pairs, level, coins, discount)} + {getRows(pairs, level, coins, discount, tiers)}
diff --git a/web/src/containers/Summary/components/LimitsBlock.js b/web/src/containers/Summary/components/LimitsBlock.js index 2a9c1b65f7..006691090f 100644 --- a/web/src/containers/Summary/components/LimitsBlock.js +++ b/web/src/containers/Summary/components/LimitsBlock.js @@ -26,14 +26,11 @@ const getLimitValue = (limit, increment_unit) => { } }; -const getDepositRow = (currency, index, coins, level) => { - const { - symbol = '', - fullname, - deposit_limits = {}, - withdrawal_limits = {}, - increment_unit, - } = coins[currency] || DEFAULT_COIN_DATA; +const getDepositRow = (currency, index, coins, level, tier) => { + const { symbol = '', fullname, increment_unit } = + coins[currency] || DEFAULT_COIN_DATA; + + const { deposit_limit, withdrawal_limit } = tier[level] || {}; // const format = currency === BASE_CURRENCY ? formatBaseAmount : formatBtcAmount; return ( @@ -44,10 +41,10 @@ const getDepositRow = (currency, index, coins, level) => { - {getLimitValue(deposit_limits[level], increment_unit)} + {getLimitValue(deposit_limit, increment_unit)} - {getLimitValue(withdrawal_limits[level], increment_unit)} + {getLimitValue(withdrawal_limit, increment_unit)} ); @@ -64,15 +61,15 @@ const getDepositRow = (currency, index, coins, level) => { // ); // }; -const getRows = (coins, level) => { +const getRows = (coins, level, tiers) => { const rowData = []; Object.keys(coins).forEach((currency, index) => { - rowData.push(getDepositRow(currency, index, coins, level)); + rowData.push(getDepositRow(currency, index, coins, level, tiers)); }); return rowData; }; -const LimitsBlock = ({ level, coins }) => { +const LimitsBlock = ({ level, coins, tiers }) => { return (
@@ -103,7 +100,7 @@ const LimitsBlock = ({ level, coins }) => { - {getRows(coins, level)} + {getRows(coins, level, tiers)}
diff --git a/web/src/containers/Summary/index.js b/web/src/containers/Summary/index.js index a976c9078c..e950d70b58 100644 --- a/web/src/containers/Summary/index.js +++ b/web/src/containers/Summary/index.js @@ -21,7 +21,6 @@ import { logoutconfirm, setNotification, NOTIFICATIONS, - requestTiers, } from '../../actions/appActions'; import { BASE_CURRENCY, @@ -47,7 +46,6 @@ class Summary extends Component { if (user.id) { this.setCurrentTradeAccount(user); this.props.getUserReferralCount(); - this.props.requestTiers(); } if (tradeVolumes.fetched) { let lastMonthVolume = getLastMonthVolume( @@ -324,7 +322,6 @@ const mapDispatchToProps = (dispatch) => ({ ), setNotification: bindActionCreators(setNotification, dispatch), getUserReferralCount: bindActionCreators(getUserReferralCount, dispatch), - requestTiers: bindActionCreators(requestTiers, dispatch), }); export default connect(mapStateToProps, mapDispatchToProps)(Summary); diff --git a/web/src/containers/Trade/_TradeContainer.scss b/web/src/containers/Trade/_TradeContainer.scss index 5981435674..7b181794d5 100644 --- a/web/src/containers/Trade/_TradeContainer.scss +++ b/web/src/containers/Trade/_TradeContainer.scss @@ -8,7 +8,7 @@ .trade-main_content { flex: 6; min-height: 25vh; - max-height: 67vh; + max-height: 78vh; } .trade-tabs_content { diff --git a/web/src/containers/Trade/components/OrderEntry.js b/web/src/containers/Trade/components/OrderEntry.js index 1fa1b0b1eb..d9a33f6498 100644 --- a/web/src/containers/Trade/components/OrderEntry.js +++ b/web/src/containers/Trade/components/OrderEntry.js @@ -412,7 +412,15 @@ class OrderEntry extends Component { className="pointer text-uppercase blue-link" onClick={() => this.setMax()} > - {balance[`${side === 'buy' ? pair_2 : pair_base}_available`]}{' '} + {side === 'buy' + ? formatToCurrency( + balance[`${pair_2}_available`], + increment_price + ) + : formatToCurrency( + balance[`${pair_base}_available`], + increment_size + )}{' '} {side === 'buy' ? pair_2.toUpperCase() : pair_base.toUpperCase()} diff --git a/web/src/containers/Trade/components/OrderEntryForm.js b/web/src/containers/Trade/components/OrderEntryForm.js index 25bb4422d8..4e8c756c81 100644 --- a/web/src/containers/Trade/components/OrderEntryForm.js +++ b/web/src/containers/Trade/components/OrderEntryForm.js @@ -1,4 +1,5 @@ import React from 'react'; +import { Collapse } from 'antd'; import classnames from 'classnames'; import { connect } from 'react-redux'; import { reduxForm, formValueSelector } from 'redux-form'; @@ -51,6 +52,8 @@ const Form = ({ }) => { const fields = getFields(formValues, type, orderType); const errorText = error || outsideFormError; + const hasPostOnly = + Object.entries(fields).filter(([key]) => key === 'postOnly').length !== 0; return (
- {Object.entries(fields).map(renderFields)} + {Object.entries(fields) + .filter(([key]) => key !== 'postOnly') + .map(renderFields)} + {hasPostOnly && ( + + + {STRINGS['ORDER_ENTRY_ADVANCED']} + + } + key="1" + > + {Object.entries(fields) + .filter(([key]) => key === 'postOnly') + .map(renderFields)} + + + )} {errorText && (
{errorText} @@ -80,7 +102,7 @@ const Form = ({ currencyName ).join(' ')} disabled={submitting || !valid || !!errorText || !isLoggedIn()} - className={classnames('trade_order_entry-form-action')} + className={classnames('trade_order_entry-form-action', 'mb-1')} />
diff --git a/web/src/containers/Trade/components/_OrderEntry.scss b/web/src/containers/Trade/components/_OrderEntry.scss index 4e4a876047..4ad1897b50 100644 --- a/web/src/containers/Trade/components/_OrderEntry.scss +++ b/web/src/containers/Trade/components/_OrderEntry.scss @@ -105,7 +105,16 @@ } .trade_order_entry-form_fields-wrapper { - margin-bottom: 0.5rem !important; + margin-bottom: 0.2rem !important; + .ant-collapse-header { + text-align: right; + color: $colors-black; + padding: 0; + font-size: $font-size-mobile-txt; + } + .ant-collapse-content-box { + padding: 0; + } } } diff --git a/web/src/containers/TransactionsHistory/_TransactionsHistory.scss b/web/src/containers/TransactionsHistory/_TransactionsHistory.scss index 1101bed94b..7a41c93394 100644 --- a/web/src/containers/TransactionsHistory/_TransactionsHistory.scss +++ b/web/src/containers/TransactionsHistory/_TransactionsHistory.scss @@ -57,6 +57,31 @@ background-color: $history-color-buy; color: $buy-bids-text; } + + &.fullfilled .cell-wrapper { + border: 1px solid $colors-main-border; + margin: 0; + padding: 1px; + min-width: 5rem; + max-width: 7rem; + + > .cell_value-wrapper { + padding: 0 0.15rem; + position: relative; + width: 100%; + color: $trade-fill-indicator-text; + z-index: 2; + + .cell_value-bar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + background-color: $trade-fill-indicator; + z-index: -1; + } + } + } } .amount_text { diff --git a/web/src/containers/TransactionsHistory/index.js b/web/src/containers/TransactionsHistory/index.js index 110fcd30ad..c1ddffe8e7 100644 --- a/web/src/containers/TransactionsHistory/index.js +++ b/web/src/containers/TransactionsHistory/index.js @@ -25,6 +25,7 @@ import { } from '../../components'; import { FLEX_CENTER_CLASSES, BASE_CURRENCY } from '../../config/constants'; import { + generateOrderHistoryHeaders, generateTradeHeaders, generateTradeHeadersMobile, generateDepositsHeaders, @@ -162,8 +163,8 @@ class TransactionsHistory extends Component { this.setState({ headers: { orders: isMobile - ? generateTradeHeadersMobile(symbol, pairs, coins, discount) - : generateTradeHeaders(symbol, pairs, coins, discount, prices), + ? generateOrderHistoryHeaders(symbol, pairs, coins, discount) + : generateOrderHistoryHeaders(symbol, pairs, coins, discount, prices), trades: isMobile ? generateTradeHeadersMobile(symbol, pairs, coins, discount) : generateTradeHeaders(symbol, pairs, coins, discount, prices), @@ -342,7 +343,7 @@ class TransactionsHistory extends Component { case 0: props.stringId = 'ORDER_HISTORY'; props.title = `${STRINGS['ORDER_HISTORY']}`; - props.headers = headers.trades; + props.headers = headers.orders; props.data = orders; props.filename = `order-history-${moment().unix()}`; props.withIcon = false; diff --git a/web/src/containers/TransactionsHistory/utils.js b/web/src/containers/TransactionsHistory/utils.js index e48c559a58..11cb56a489 100644 --- a/web/src/containers/TransactionsHistory/utils.js +++ b/web/src/containers/TransactionsHistory/utils.js @@ -15,14 +15,14 @@ import { DEFAULT_COIN_DATA, } from '../../config/constants'; import { getFormatTimestamp, isBlockchainTx } from '../../utils/utils'; -import { formatToCurrency } from '../../utils/currency'; +import { formatToCurrency, formatBaseAmount } from 'utils/currency'; notification.config({ placement: 'topLeft', duration: 3, }); -const calculateFeeAmount = ( +/*const calculateFeeAmount = ( fee = 0, quick = false, price = 1, @@ -40,7 +40,7 @@ const calculateFeeAmount = ( feeAmount = mathjs.chain(amount).multiply(fee).divide(100).done(); } return feeAmount; -}; +};*/ const calculateAmount = (isQuick = false, price, size) => { if (isQuick) { @@ -58,9 +58,9 @@ const calculatePrice = (isQuick = false, price, size) => { return price; }; -export const generateTradeHeaders = ( +export const generateOrderHistoryHeaders = ( symbol, - pairs, + pairs = {}, coins, discount, prices = {} @@ -224,17 +224,202 @@ export const generateTradeHeaders = ( }, }, { - stringId: 'AMOUNT_IN', - label: `${STRINGS['AMOUNT_IN']} ${BASE_CURRENCY.toUpperCase()}`, - key: 'amount-in', + label: '', + key: 'status', + renderCell: ({ size = 0, filled = 0 }, key, index) => { + const fullfilled = formatBaseAmount( + mathjs.chain(filled).divide(size).multiply(100).done() + ); + return ( + +
+
+ {STRINGS.formatString(STRINGS['FULLFILLED'], fullfilled)} + +
+
+ + ); + }, + }, + { + label: STRINGS['STATUS'], + key: 'status', + exportToCsv: ({ status }) => status, + renderCell: ({ status }, key, index) => { + return ( + + {status} + + ); + }, + }, + { + stringId: 'FEE,NO_FEE', + label: STRINGS['FEE'], + key: 'fee', + exportToCsv: ({ fee = 0, fee_coin = '' }) => `${fee} ${fee_coin}`, + renderCell: ({ fee = 0, fee_coin = '' }, key, index) => ( + + {STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency(fee, 0, true), + fee_coin.toUpperCase() + )} + + ), + }, + { + stringId: 'TIME', + label: STRINGS['TIME'], + key: 'updated_at', + className: isMobile ? 'text-center' : '', + exportToCsv: ({ updated_at = '' }) => updated_at, + renderCell: ({ updated_at = '' }, key, index) => { + return ( + + {getFormatTimestamp(updated_at)} + + ); + }, + }, + ]; +}; + +export const generateTradeHeaders = ( + symbol, + pairs, + coins, + discount, + prices = {} +) => { + return [ + { + stringId: 'PAIR', + label: STRINGS['PAIR'], + key: 'pair', + exportToCsv: ({ symbol }) => symbol.toUpperCase(), + renderCell: ({ symbol }, key, index) => { + return ( + + {symbol} + + ); + }, + }, + { + stringId: 'TYPE', + label: STRINGS['TYPE'], + key: 'side', + exportToCsv: ({ side = '' }) => side, + renderCell: ({ side = '' }, key, index) => { + return ( + +
+ {STRINGS[`SIDES_VALUES.${side}`]} +
+ + ); + }, + }, + { + stringId: 'SIZE', + label: STRINGS['SIZE'], + key: 'size', + exportToCsv: ({ size = 0, ...data }) => { + if (pairs[data.symbol]) { + const { pair_base, increment_size } = pairs[data.symbol]; + const { min, ...rest } = + coins[pair_base || BASE_CURRENCY] || DEFAULT_COIN_DATA; + const shortName = rest.symbol.toUpperCase(); + return STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency(size, increment_size), + shortName + ).join(''); + } else { + return size; + } + }, + renderCell: ({ size = 0, ...data }, key, index) => { + if (pairs[data.symbol]) { + const { pair_base, increment_size } = pairs[data.symbol]; + const { min, ...rest } = + coins[pair_base || BASE_CURRENCY] || DEFAULT_COIN_DATA; + const shortName = rest.symbol.toUpperCase(); + return ( + + {STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency(size, increment_size), + shortName + )} + + ); + } else { + return {size}; + } + }, + }, + { + stringId: 'PRICE', + label: STRINGS['PRICE'], + key: 'price', exportToCsv: ({ price = 0, size = 0, quick, symbol }) => { if (pairs[symbol]) { - const { increment_price, pair_base } = pairs[symbol]; - const { min, ...rest } = coins[BASE_CURRENCY] || DEFAULT_COIN_DATA; + const { pair_2, increment_price } = pairs[symbol]; + const { min, ...rest } = + coins[pair_2 || BASE_CURRENCY] || DEFAULT_COIN_DATA; return STRINGS.formatString( CURRENCY_PRICE_FORMAT, formatToCurrency( - calculateAmount(quick, prices[pair_base] || 0, size), + calculatePrice(quick, price, size), + increment_price + ), + rest.symbol.toUpperCase() + ).join(''); + } else { + return calculatePrice(quick, price, size); + } + }, + renderCell: ({ price = 0, size = 0, quick, symbol }, key, index) => { + if (pairs[symbol]) { + const { pair_2, increment_price } = pairs[symbol]; + const { min, ...rest } = + coins[pair_2 || BASE_CURRENCY] || DEFAULT_COIN_DATA; + return ( + + {STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency( + calculatePrice(quick, price, size), + increment_price + ), + rest.symbol.toUpperCase() + )} + + ); + } else { + return {calculatePrice(quick, price, size)}; + } + }, + }, + { + stringId: 'AMOUNT', + label: STRINGS['AMOUNT'], + key: 'amount', + exportToCsv: ({ price = 0, size = 0, quick, symbol }) => { + if (pairs[symbol]) { + const { pair_2, increment_price } = pairs[symbol]; + const { min, ...rest } = + coins[pair_2 || BASE_CURRENCY] || DEFAULT_COIN_DATA; + return STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency( + calculateAmount(quick, price, size), increment_price ), rest.symbol.toUpperCase() @@ -245,14 +430,15 @@ export const generateTradeHeaders = ( }, renderCell: ({ price = 0, size = 0, quick, symbol }, key, index) => { if (pairs[symbol]) { - const { increment_price, pair_base } = pairs[symbol]; - const { min, ...rest } = coins[BASE_CURRENCY] || DEFAULT_COIN_DATA; + const { pair_2, increment_price } = pairs[symbol]; + const { min, ...rest } = + coins[pair_2 || BASE_CURRENCY] || DEFAULT_COIN_DATA; return ( {STRINGS.formatString( CURRENCY_PRICE_FORMAT, formatToCurrency( - calculateAmount(quick, prices[pair_base] || 0, size), + calculateAmount(quick, price, size), increment_price ), rest.symbol.toUpperCase() @@ -268,59 +454,65 @@ export const generateTradeHeaders = ( } }, }, - { - stringId: 'FEE,NO_FEE', - label: STRINGS['FEE'], - key: 'fee', - exportToCsv: ({ fee = 0, price = 0, size = 0, quick, symbol, side }) => { - let feeData = discount ? fee - (fee * discount) / 100 : fee; - if (!feeData) { - return calculateFeeAmount(feeData); - } + /* { + stringId: 'AMOUNT_IN', + label: `${STRINGS['AMOUNT_IN']} ${BASE_CURRENCY.toUpperCase()}`, + key: 'amount-in', + exportToCsv: ({ price = 0, size = 0, quick, symbol }) => { if (pairs[symbol]) { - const { pair_base, pair_2 } = pairs[symbol]; - const pair = side === 'buy' ? pair_base : pair_2; - const { min, ...rest } = - coins[pair || BASE_CURRENCY] || DEFAULT_COIN_DATA; + const { increment_price, pair_base } = pairs[symbol]; + const { min, ...rest } = coins[BASE_CURRENCY] || DEFAULT_COIN_DATA; return STRINGS.formatString( CURRENCY_PRICE_FORMAT, formatToCurrency( - calculateFeeAmount(feeData, quick, price, size, side), - min + calculateAmount(quick, prices[pair_base] || 0, size), + increment_price ), rest.symbol.toUpperCase() ).join(''); } else { - calculateFeeAmount(feeData, quick, price, size, side); + return calculateAmount(quick, price, size); } }, - renderCell: ({ fee, price, size, quick, symbol, side }, key, index) => { - let feeData = discount ? fee - (fee * discount) / 100 : fee; - if (!feeData) { - return {calculateFeeAmount(feeData)}; - } + renderCell: ({ price = 0, size = 0, quick, symbol }, key, index) => { if (pairs[symbol]) { - const { pair_base, pair_2 } = pairs[symbol]; - const pair = side === 'buy' ? pair_base : pair_2; - const { min, ...rest } = - coins[pair || BASE_CURRENCY] || DEFAULT_COIN_DATA; + const { increment_price, pair_base } = pairs[symbol]; + const { min, ...rest } = coins[BASE_CURRENCY] || DEFAULT_COIN_DATA; return ( {STRINGS.formatString( CURRENCY_PRICE_FORMAT, formatToCurrency( - calculateFeeAmount(feeData, quick, price, size, side), - min, - true + calculateAmount(quick, prices[pair_base] || 0, size), + increment_price ), rest.symbol.toUpperCase() )} ); } else { - calculateFeeAmount(feeData, quick, price, size, side); + return ( + + {formatToCurrency(calculateAmount(quick, price, size), 0.0001)} + + ); } }, + },*/ + { + stringId: 'FEE,NO_FEE', + label: STRINGS['FEE'], + key: 'fee', + exportToCsv: ({ fee = 0, fee_coin = '' }) => `${fee} ${fee_coin}`, + renderCell: ({ fee = 0, fee_coin = '' }, key, index) => ( + + {STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency(fee, 0, true), + fee_coin.toUpperCase() + )} + + ), }, { stringId: 'TIME', @@ -438,31 +630,16 @@ export const generateWithdrawalsHeaders = ( stringId: 'FEE,NO_FEE', label: STRINGS['FEE'], key: 'fee', - exportToCsv: ({ fee = 0 }) => fee, - renderCell: ({ fee, price, size, currency }, key, index) => { - const data = coins[currency] || DEFAULT_COIN_DATA; - if (fee === 0) { - return {calculateFeeAmount(fee)}; - } - return ( - // STRINGS[`${currency.toUpperCase()}_PRICE_FORMAT`] - // ? - - {STRINGS.formatString( - CURRENCY_PRICE_FORMAT, - fee, - data.symbol.toUpperCase() - )} - /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ /*: {fee}*/ - // : {fee} - /*: {fee}*/ - /*: {fee}*/ - /*: {fee}*/ - /*: {fee}*/ - /*: {fee}*/ - /*: {fee}*/ - /*: {fee}*/); - }, + exportToCsv: ({ fee = 0, fee_coin = '' }) => `${fee} ${fee_coin}`, + renderCell: ({ fee = 0, fee_coin = '' }, key, index) => ( + + {STRINGS.formatString( + CURRENCY_PRICE_FORMAT, + formatToCurrency(fee, 0, true), + fee_coin.toUpperCase() + )} + + ), }, { stringId: 'TIME', diff --git a/web/src/index.css b/web/src/index.css index 38ead05c49..22b1d4f94d 100644 --- a/web/src/index.css +++ b/web/src/index.css @@ -1441,6 +1441,26 @@ table th { background-color: var(--trading_buying-related-elements); color: var(--calculated_trading_buying-related-text); } +.cell_box-type.fullfilled .cell-wrapper { + border: 1px solid var(--calculated_important-border); + margin: 0; + padding: 1px; + min-width: 5rem; + max-width: 7rem; } + .cell_box-type.fullfilled .cell-wrapper > .cell_value-wrapper { + padding: 0 0.15rem; + position: relative; + width: 100%; + color: var(--labels_secondary-inactive-label-text-graphics); + z-index: 2; } + .cell_box-type.fullfilled .cell-wrapper > .cell_value-wrapper .cell_value-bar { + position: absolute; + left: 0; + top: 0; + bottom: 0; + background-color: var(--calculated_specials_highlight-box); + z-index: -1; } + .amount_text .positive { color: var(--specials_checks-okay-done); } @@ -1512,7 +1532,7 @@ table th { .trade-container .trade-col_main_wrapper .trade-main_content { flex: 6; min-height: 25vh; - max-height: 67vh; } + max-height: 78vh; } .trade-container .trade-col_main_wrapper .trade-tabs_content { flex: 3; height: 30vh; } @@ -1787,7 +1807,14 @@ table th { .trade_order_entry-wrapper.order_side-selector-sell .trade_order_entry-form_inputs-wrapper .form-error { margin: 0.5rem 0; } .trade_order_entry-wrapper.order_side-selector-sell .trade_order_entry-form_fields-wrapper { - margin-bottom: 0.5rem !important; } + margin-bottom: 0.2rem !important; } + .trade_order_entry-wrapper.order_side-selector-sell .trade_order_entry-form_fields-wrapper .ant-collapse-header { + text-align: right; + color: var(--labels_secondary-inactive-label-text-graphics); + padding: 0; + font-size: 12px; } + .trade_order_entry-wrapper.order_side-selector-sell .trade_order_entry-form_fields-wrapper .ant-collapse-content-box { + padding: 0; } .trade_order_entry-wrapper.order_side-selector-buy { flex: 1; @@ -1848,7 +1875,14 @@ table th { .trade_order_entry-wrapper.order_side-selector-buy .trade_order_entry-form_inputs-wrapper .form-error { margin: 0.5rem 0; } .trade_order_entry-wrapper.order_side-selector-buy .trade_order_entry-form_fields-wrapper { - margin-bottom: 0.5rem !important; } + margin-bottom: 0.2rem !important; } + .trade_order_entry-wrapper.order_side-selector-buy .trade_order_entry-form_fields-wrapper .ant-collapse-header { + text-align: right; + color: var(--labels_secondary-inactive-label-text-graphics); + padding: 0; + font-size: 12px; } + .trade_order_entry-wrapper.order_side-selector-buy .trade_order_entry-form_fields-wrapper .ant-collapse-content-box { + padding: 0; } .risky-trade-wrapper { width: 32rem; } @@ -6091,6 +6125,15 @@ table th { width: 35% !important; transform: translateY(1.4rem); } +.ant-slider-mark-text { + color: var(--labels_secondary-inactive-label-text-graphics); + font-family: 'Open Sans' !important; + font-size: 0.9rem !important; } + +.ant-slider-mark-text-active { + color: var(--labels_important-active-labels-text-graphics); + font-weight: bold; } + .exir-button { width: 100%; font-size: 0.9rem;