{"version":3,"sources":["i18n.js","utils/configuration.js","api/api.js","api/requestCard.js","components/issued-card/ConsumedTokensSummary.js","components/issued-card/IssueCardsError.js","components/issued-card/IssuedCardView.js","components/issued-card/IssuedCardsView.js","utils/promo-code-form-helpers.js","api/validateCode.js","components/token-highlighter/regex.js","components/token-highlighter/HighlightValidTokenFormats.js","components/bulk-code-input/BulkCodeEntryForm.js","components/promo-code-input/CodeValidity.js","components/bulk-code-input/BulkCodeValidityResults.js","components/bulk-code-input/BulkCodeImportController.js","components/promo-code-input/PromoCodeEntry.js","components/promo-code-input/ValidationMessages.js","components/promo-code-input/PromoCodeInputRecords.js","components/promo-code-input/PromoCodeInputForm.js","components/promo-code-input/PromoCodeInputController.js","App.js","reportWebVitals.js","index.js"],"names":["resources","en","translation","si","translationSI","i18n","use","initReactI18next","init","lng","interpolation","escapeValue","getDefaultMinimumCodesValue","a","Promise","resolve","getConfiguration","minimumCodesValue","BuildConfig","process","CODE_LENGTHS","getJson","url","headers","fetchUrl","sendHeaders","fetch","method","response","json","content","ok","reject","postJson","body","JSON","stringify","exceptionErrorResponse","transactionId","transactionErrors","results","totalAmountConsumed","remainingAfterTransaction","totalBeforeTransaction","cardsIssuedCount","issuedCards","successful","requestCard","codes","uuidv4","Codes","TransactionId","result","data","success","ConsumedTokensSummary","totalConsumed","totalRemaining","t","useTranslation","Table","size","Object","keys","map","key","withdrawn","remaining","colSpan","align","IssueCardsError","className","Alert","variant","errorCount","length","Card","Title","orderNumber","Body","error","index","Footer","IssuedCardView","referenceId","serialNumber","pin","amount","issuer","fluid","src","alt","class","IssuedCardsView","cards","count","card","i","getCodesValue","code","filter","reduce","previousValue","checkCodeValidity","reCaptcha","noResult","recaptcha","checkCodesValidity","ALPHANUMERIC_5_DIGIT_TOKEN_REGEX","tokenStrategy","contentBlock","callback","contentState","regex","matchArr","start","text","getText","exec","findWithRegex","TokenSpan","props","style","styles","codeFormat","offsetKey","children","root","editor","border","cursor","fontSize","minHeight","padding","lineHeight","color","borderRadius","margin","background","TokenHighlightEditor","onChange","value","editorRef","useRef","compositeDecorator","CompositeDecorator","strategy","component","useState","EditorState","createWithContent","ContentState","createFromText","editorState","setEditorState","useEffect","getCurrentContent","getPlainText","newState","push","onClick","current","focus","newEditorState","placeholder","ref","spellCheck","BulkCodeEntryForm","values","Form","Group","controlId","to","xmlns","width","height","viewBox","id","d","transform","fill","stroke","CodeValidity","valid","title","BulkCodeEntrySummary","items","ListGroup","match","ListGroupItem","BulkCodeValidityResults","validResults","invalidResults","hasInvalid","Tabs","defaultActiveKey","Tab","eventKey","tabClassName","validationCache","codeFormatRegex","tokenRegex","BulkCodeImportController","onAdd","bulkCodeValuesRaw","setBulkCodeValuesRaw","codesToValidate","setCodesToValidate","codeValidationResults","setCodeValidationResults","tokens","setTokens","remoteValidationCount","setRemoteValidationCount","executeRecaptcha","useGoogleReCaptcha","fetchReCaptchaToken","useCallback","getValidCodes","r","codesToQuery","reCaptchaToken","remoteQuery","validationResult","toast","warn","autoClose","bulkValidateCodes","active","spinner","tokenValues","split","x","array","indexOf","tokensToValidate","flatMap","validCodeResults","token","validatedResult","find","entry","resultsDictionary","ButtonGroup","Button","disabled","PromoCodeEntry","setValue","isValid","setIsValid","setAmount","busy","setBusy","setPromoCodeDetails","buttonClick","e","preventDefault","reCaptchaCode","validatedCode","Configuration","includes","validate","maxCodeLength","Math","max","Control","type","target","onKeyDown","maxLength","ValidationMessages","messages","message","parameters","PromoCodeInputRecords","submit","formValid","removeCode","validations","CloseButton","PromoCodeInputForm","onSubmit","initialCodes","mode","setCodes","setFormValid","handleAddNewCode","newValue","Array","newCodesRequest","n","alreadyAdded","addCodes","duplicateCodeCount","codeCount","info","hasMinimumValue","validateCodeList","Container","Row","Col","position","PromoCodeInputController","submittedCodes","submitCodes","issueCards","processing","setProcessing","config","setConfig","setInitialCodes","requestCardAsync","configurationData","configure","path","element","App","backgroundImage","href","rel","reportWebVitals","onPerfEntry","Function","then","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","reCaptchaKey","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.ef7107d4.chunk.js","sourcesContent":["import i18n from \"i18next\"\r\nimport { initReactI18next } from \"react-i18next\"\r\nimport translationSI from './translations/translation-SI.json'\r\nimport translationEN from './translations/translation-EN.json'\r\n\r\nconst resources = {\r\n en: {\r\n translation: translationEN\r\n },\r\n si: {\r\n translation: translationSI\r\n }\r\n};\r\n\r\ni18n.use(initReactI18next).init({\r\n resources,\r\n lng: \"si\",\r\n interpolation: {\r\n escapeValue: false\r\n }\r\n});\r\n\r\nexport default i18n;","/**\r\n * Minimum codes to submit\r\n */\r\nconst defaultMinimumCodeValue = 10;\r\n\r\n\r\n/**\r\n * Get the minimum code value to submit\r\n * @returns Minimum Code Value to Submit\r\n */\r\nasync function getDefaultMinimumCodesValue() {\r\n return new Promise((resolve) => {\r\n resolve(defaultMinimumCodeValue);\r\n });\r\n}\r\n\r\n/**\r\n * Get the configuration for the web app.\r\n * Currently, the values are stored internally, but could be sourced\r\n * from the API at a later date if multiple configurations are needed.\r\n * @returns Configuration Promise\r\n */\r\nasync function getConfiguration() {\r\n const minimumCodesValue = await getDefaultMinimumCodesValue();\r\n\r\n return {\r\n minimumCodesValue\r\n };\r\n}\r\n\r\n/**\r\n * Constant config for runtime that is build-specific\r\n */\r\nconst BuildConfig = {\r\n API_ROOT: process.env.REACT_APP_API_ROOT\r\n}\r\n\r\n/**\r\n * Length of codes to accept (validate) in the UI\r\n */\r\nconst CODE_LENGTHS = [5, 14];\r\n\r\nexport { getConfiguration, CODE_LENGTHS, BuildConfig }","import { BuildConfig } from '../utils/configuration'\r\n\r\nasync function getJson({ url, headers }) {\r\n const apiRoot = BuildConfig.API_ROOT;\r\n const fetchUrl = `${apiRoot}${url}`;\r\n\r\n const baseHeaders = {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n };\r\n \r\n let sendHeaders = baseHeaders;\r\n if (headers) {\r\n sendHeaders = {...sendHeaders, ...headers};\r\n }\r\n const response = await fetch(fetchUrl, {\r\n method: 'GET',\r\n headers: sendHeaders\r\n });\r\n const content = await response.json();\r\n if (response.ok) {\r\n return Promise.resolve(content);\r\n } else {\r\n return Promise.reject(content);\r\n }\r\n}\r\n\r\nasync function postJson({ url, body = \"\", headers }) {\r\n const apiRoot = BuildConfig.API_ROOT;\r\n const fetchUrl = `${apiRoot}${url}`;\r\n \r\n const baseHeaders = {\r\n 'Accept': 'application/json',\r\n 'Content-Type': 'application/json'\r\n };\r\n \r\n let sendHeaders = baseHeaders;\r\n if (headers) {\r\n sendHeaders = {...sendHeaders, ...headers};\r\n }\r\n\r\n const response = await fetch(fetchUrl, {\r\n method: 'POST',\r\n headers: sendHeaders,\r\n body: JSON.stringify(body)\r\n });\r\n const content = await response.json();\r\n if (response.ok) {\r\n return Promise.resolve(content);\r\n } else {\r\n return Promise.reject(content);\r\n }\r\n}\r\n\r\nexport { getJson, postJson }","import { postJson } from \"./api\";\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nconst exceptionErrorResponse = {\r\n transactionId: \"Unknown\",\r\n transactionErrors: [\"A server error occurred an your request could not be processed.\"],\r\n results: {},\r\n totalAmountConsumed: null,\r\n remainingAfterTransaction: null,\r\n totalBeforeTransaction: null,\r\n cardsIssuedCount: 0,\r\n issuedCards: [],\r\n successful: false\r\n};\r\n/**\r\n * \r\n * @param {Object} obj An object\r\n * @param {string[]} obj.codes A list of codes to use when requesting a card\r\n * @returns Promise\r\n */\r\nasync function requestCard({ codes }) {\r\n try {\r\n const transactionId = uuidv4();\r\n const result = await postJson({ url: '/Token/Consume', body: { Codes: codes, TransactionId: transactionId } });\r\n return result.data;\r\n } catch (err) {\r\n if (err == null || typeof (err) === 'string' || err.success == null) {\r\n return exceptionErrorResponse;\r\n }\r\n if (err.data) {\r\n return err.data;\r\n }\r\n return exceptionErrorResponse;\r\n }\r\n}\r\n\r\n\r\nexport { requestCard }","import React from \"react\";\r\nimport { Table } from \"react-bootstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nfunction ConsumedTokensSummary({ results, totalConsumed, totalRemaining }) {\r\n const { t } = useTranslation();\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {Object.keys(results).map(key => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{t('Code')}{t('Consumed')}{t('Remaining')}
{key}{results[key].withdrawn}{results[key].remaining}
{t('Totals')}:{totalConsumed}{totalRemaining}
\r\n )\r\n}\r\n\r\nexport default ConsumedTokensSummary;","import React from \"react\";\r\nimport { Alert, Card } from \"react-bootstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport ConsumedTokensSummary from \"./ConsumedTokensSummary\";\r\n\r\nfunction IssueCardsError({ transactionErrors, transactionId, results, remainingAfterTransaction, totalAmountConsumed }) {\r\n const { t } = useTranslation();\r\n\r\n return
\r\n {t('The operation was not successful')} {t('Error count:', { errorCount: transactionErrors.length })}\r\n \r\n {t('Order number', { orderNumber: transactionId })}\r\n \r\n {transactionErrors != null && transactionErrors.length > 0 ?\r\n <>\r\n

{t('Messages from card issuer:')}

\r\n
    \r\n {transactionErrors.map((error, index) => (\r\n
  • {error}
  • \r\n ))}\r\n
\r\n : null\r\n }\r\n
\r\n {results == null || Object.keys(results).length === 0 ? null :\r\n \r\n \r\n \r\n }\r\n
\r\n
\r\n}\r\n\r\nexport default IssueCardsError;","import React from 'react';\r\nimport { Container } from \"react-bootstrap\";\r\nimport { useTranslation } from 'react-i18next';\r\nimport './issued-card-view.css';\r\n\r\nfunction IssuedCardView({ referenceId, serialNumber, pin, amount, issuer }) {\r\n const { t } = useTranslation();\r\n return (\r\n
\r\n
\r\n
\r\n {t('')}\r\n
\r\n
\r\n
\r\n
{t('Serial Number')}
{serialNumber}
\r\n
{t('PIN')}
{pin}
\r\n
{t('Amount')}
{amount}
\r\n
{t('Issuer')}
{issuer}
\r\n
\r\n
{t('Card Reference Number')}: {referenceId}
\r\n
\r\n
\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default IssuedCardView;","import React from \"react\";\r\nimport { Alert, Card } from \"react-bootstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { BsCheckCircle, BsInfoCircle } from \"react-icons/bs\";\r\nimport IssuedCardView from './IssuedCardView';\r\n\r\nfunction IssuedCardsView({ cards, orderNumber }) {\r\n const { t } = useTranslation();\r\n\r\n return (\r\n
\r\n {t('Cards successfully issued', { count: cards.length })}\r\n {t('Order number', { orderNumber })}\r\n\r\n

{t('Please find the details of your new cards below')}

\r\n\r\n
\r\n
{t('PIN Code info')}
\r\n
\r\n\r\n {cards.map((card, i) => \r\n \r\n \r\n )}\r\n
\r\n )\r\n}\r\n\r\nexport default IssuedCardsView;","/**\r\n * Get the total value of codes\r\n * @param {{ code: number, value: number|null}} codes \r\n * @returns \r\n */\r\nfunction getCodesValue(codes) {\r\n return codes.map(code => code.amount).filter(amount => amount != null).reduce((previousValue, code) => previousValue + code, 0);\r\n}\r\n/**\r\n * Validate a selection of codes and return a validation object with insight\r\n * into the results.\r\n * \r\n * @param {{codes: {valid: boolean, value: string}[], minimumCodes: number}} Codes, Minimum Codes\r\n * @returns {valid: boolean, messages: {key: string, parameters: {}}} Object containing validity and messages\r\n */\r\nfunction validateCodeList({ codes, minimumCodesValue }) {\r\n const hasMinimumValue = getCodesValue(codes) >= minimumCodesValue;\r\n const messages = [];\r\n\r\n if (!hasMinimumValue) {\r\n messages.push({ key: 'The minimum value of the codes must be', parameters: { count: minimumCodesValue } });\r\n }\r\n\r\n return {\r\n valid: hasMinimumValue,\r\n messages\r\n }\r\n}\r\n\r\nexport { validateCodeList, getCodesValue }\r\n","import { getJson, postJson } from './api'\r\n\r\n/**\r\n * Checks whether a given code is valid.\r\n * @param {string} code Code to verify\r\n * @param {string|undefined} reCaptcha reCAPTCHA code to verify\r\n * @returns Promise of result\r\n */\r\nasync function checkCodeValidity(code, reCaptcha) {\r\n const url = `/Token/Validate/${code}`;\r\n const noResult = { code, amount: null };\r\n try {\r\n const json = await getJson({ url, headers: { recaptcha: reCaptcha} });\r\n if (json.success) {\r\n return {\r\n code,\r\n amount: json.data.amount\r\n }\r\n }\r\n return noResult;\r\n }\r\n catch (err) {\r\n if (typeof (err) === 'object' && err.success == null) {\r\n // A network level, browser, or layer-level issue has occurred.\r\n throw (err);\r\n }\r\n return ({ code, amount: null });\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether a given list of codes is valid.\r\n * @param {string[]} codes Codes to verify\r\n * @param {string|undefined} reCaptcha reCAPTCHA code to verify\r\n * @returns Promise of result\r\n */\r\nasync function checkCodesValidity(codes, reCaptcha) {\r\n const url = `/Token/ValidateBulk`;\r\n try {\r\n const json = await postJson({ url, body: codes, headers: { recaptcha: reCaptcha } });\r\n if (json.success && json.data != null) {\r\n\r\n return json.data.map(result => {\r\n return {\r\n code: result.code,\r\n amount: result.amount\r\n }\r\n });\r\n }\r\n return [];\r\n }\r\n catch (err) {\r\n if (typeof (err) === 'object' && err.success == null) {\r\n // A network level, browser, or layer-level issue has occurred.\r\n throw (err);\r\n }\r\n return [];\r\n }\r\n}\r\n\r\n\r\nexport { checkCodeValidity, checkCodesValidity }","const ALPHANUMERIC_5_DIGIT_TOKEN_REGEX = /\\b[a-zA-Z0-9]{5}\\b|\\b[a-zA-Z0-9]{14}\\b/g\r\n\r\nexport { ALPHANUMERIC_5_DIGIT_TOKEN_REGEX }","import { CompositeDecorator, ContentState, Editor, EditorState } from \"draft-js\";\r\nimport 'draft-js/dist/Draft.css';\r\nimport React, { useEffect, useRef, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { ALPHANUMERIC_5_DIGIT_TOKEN_REGEX } from \"./regex\";\r\n\r\n\r\n/**\r\n * Token Matching Strategy for Editor\r\n * @param {*} contentBlock \r\n * @param {*} callback \r\n * @param {*} contentState \r\n */\r\nfunction tokenStrategy(contentBlock, callback, contentState) {\r\n findWithRegex(ALPHANUMERIC_5_DIGIT_TOKEN_REGEX, contentBlock, callback);\r\n}\r\n\r\n/**\r\n * RegEx searching for strategies\r\n * @param {*} regex \r\n * @param {*} contentBlock \r\n * @param {*} callback \r\n */\r\nfunction findWithRegex(regex, contentBlock, callback) {\r\n const text = contentBlock.getText();\r\n let matchArr, start;\r\n while ((matchArr = regex.exec(text)) !== null) {\r\n start = matchArr.index;\r\n callback(start, start + matchArr[0].length);\r\n }\r\n}\r\n\r\n/**\r\n * Custom formatted element for token matches in the UI.\r\n * @param {*} props \r\n * @returns \r\n */\r\nconst TokenSpan = (props) => {\r\n return (\r\n \r\n {props.children}\r\n \r\n );\r\n};\r\n\r\n/**\r\n * Styles for draft.js editor\r\n */\r\nconst styles = {\r\n root: {\r\n\r\n },\r\n editor: {\r\n border: '1px solid #909691',\r\n cursor: 'text',\r\n fontSize: 16,\r\n minHeight: 40,\r\n padding: 10,\r\n lineHeight: \"1.7em\"\r\n },\r\n codeFormat: {\r\n color: '#294F9F',\r\n border: \"solid 1px #E6EBF6\",\r\n borderRadius: \"20px\",\r\n padding: \"0.1em 0.35em\",\r\n margin: \"0 .1em\",\r\n background: \"#E6EBF6\"\r\n },\r\n};\r\n\r\n/**\r\n * Custom draft.js editor that highlights text matching code formats.\r\n * Uses: [\r\n * tokenStrategy: TokenSpan\r\n * ]\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction TokenHighlightEditor({ onChange, value }) {\r\n const { t } = useTranslation();\r\n const editorRef = useRef(null)\r\n\r\n const compositeDecorator = new CompositeDecorator([\r\n {\r\n strategy: tokenStrategy,\r\n component: TokenSpan,\r\n },\r\n ]);\r\n\r\n const [editorState, setEditorState] = useState(\r\n () => EditorState.createWithContent(ContentState.createFromText(value), compositeDecorator),\r\n );\r\n\r\n const onEditorChange = (newEditorState) => {\r\n onChange(newEditorState.getCurrentContent().getPlainText());\r\n setEditorState(newEditorState);\r\n };\r\n\r\n const focus = () => {\r\n editorRef.current.focus();\r\n }\r\n\r\n useEffect(() => {\r\n if (editorState.getCurrentContent().getPlainText() !== value) {\r\n const newState = EditorState.push(editorState, ContentState.createFromText(value), 'change-block-data');\r\n setEditorState(newState);\r\n }\r\n \r\n }, [value, editorState])\r\n\r\n\r\n return (\r\n
\r\n
\r\n \r\n
\r\n
\r\n );\r\n}\r\n\r\nexport default TokenHighlightEditor;","import React from \"react\";\r\nimport { Form } from \"react-bootstrap\";\r\nimport { useTranslation } from 'react-i18next';\r\nimport { Link } from \"react-router-dom\";\r\nimport TokenHighlightEditor from '../token-highlighter/HighlightValidTokenFormats';\r\n\r\n/**\r\n * Bulk Code Entry Form\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction BulkCodeEntryForm({ values, onChange }) {\r\n const { t } = useTranslation();\r\n return (\r\n
\r\n

{t('Enter codes')}

\r\n \r\n \r\n
\r\n \r\n \r\n {t('Single Code')}\r\n
\r\n
\r\n\r\n
\r\n )\r\n}\r\n\r\nexport default BulkCodeEntryForm;","import React from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { BsCheckCircle, BsXCircle } from \"react-icons/bs\";\r\n\r\n/**\r\n * Displays the code validity or an instruction icon to enter a code.\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction CodeValidity({ valid }) {\r\n const { t } = useTranslation();\r\n\r\n // No Input\r\n if (valid == null) {\r\n return \r\n }\r\n\r\n // Validated Input\r\n return valid ?\r\n :\r\n \r\n}\r\n\r\nexport default CodeValidity;","import React from \"react\";\r\nimport { ListGroup, ListGroupItem, Tab, Tabs } from \"react-bootstrap\";\r\nimport { useTranslation } from 'react-i18next';\r\nimport CodeValidity from '../promo-code-input/CodeValidity';\r\nimport './bulk-valid-code-format.css';\r\n\r\n/**\r\n * Summarize the bulk code entries.\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction BulkCodeEntrySummary({ items }) {\r\n return (\r\n {items.map((match, i) => (\r\n \r\n {match.code}\r\n
\r\n \r\n
\r\n
\r\n ))}\r\n
)\r\n}\r\n\r\n/**\r\n * Bulk Code validity results\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction BulkCodeValidityResults({ results }) {\r\n const { t } = useTranslation();\r\n\r\n const validResults = results.filter(result => result.amount != null);\r\n const invalidResults = results.filter(result => result.amount == null);\r\n const hasInvalid = invalidResults.length > 0;\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default BulkCodeValidityResults;","import React, {useCallback, useEffect, useState} from \"react\";\r\nimport { Button, ButtonGroup } from \"react-bootstrap\";\r\nimport { useTranslation } from 'react-i18next';\r\nimport LoadingOverlay from 'react-loading-overlay';\r\nimport { toast } from \"react-toastify\";\r\nimport { checkCodesValidity } from '../../api/validateCode';\r\nimport './bulk-code-import-controller.css';\r\nimport BulkCodeEntryForm from './BulkCodeEntryForm';\r\nimport BulkCodeValidityResults from './BulkCodeValidityResults';\r\nimport {useGoogleReCaptcha} from \"react-google-recaptcha-v3\";\r\nimport {ALPHANUMERIC_5_DIGIT_TOKEN_REGEX} from \"../token-highlighter/regex\";\r\n\r\n\r\n/**\r\n * Local (outside of component) cache for validation results to prevent over-querying known results during re-renders.\r\n */\r\nlet validationCache = {};\r\n\r\nconst codeFormatRegex = ALPHANUMERIC_5_DIGIT_TOKEN_REGEX;\r\nconst tokenRegex = /\\W+/;\r\n\r\n/**\r\n * Bulk Code Import Controller\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction BulkCodeImportController({ onAdd }) {\r\n const { t } = useTranslation();\r\n\r\n // State Management\r\n\r\n const [bulkCodeValuesRaw, setBulkCodeValuesRaw] = useState(\"\");\r\n const [codesToValidate, setCodesToValidate] = useState([]);\r\n const [codeValidationResults, setCodeValidationResults] = useState([]);\r\n const [tokens, setTokens] = useState([]);\r\n\r\n // Keep track of how many validations we are actually doing remotely, rather than in local JS.\r\n // Only \"possible\" codes are checked and the results are cached to prevent over-querying in bulk operations.\r\n const [remoteValidationCount, setRemoteValidationCount] = useState(0);\r\n\r\n // reCAPTCHA\r\n const { executeRecaptcha } = useGoogleReCaptcha();\r\n\r\n const RECAPTCHA_VALIDATE_CODE_ACTION_NAME = 'validateBulk';\r\n\r\n const fetchReCaptchaToken = useCallback(async () => {\r\n if (!executeRecaptcha) {\r\n return null;\r\n }\r\n return await executeRecaptcha(RECAPTCHA_VALIDATE_CODE_ACTION_NAME);\r\n }, [executeRecaptcha]);\r\n\r\n /**\r\n * Handle changes to the bulk code entry list.\r\n * - Extracts possible code matches\r\n * - Separates matched/unmatched inputs\r\n * - Sets the \"codesToValidate\" state property to a distinct list of code matches.\r\n * \r\n * Note: Codes are matched by format. A matched code does not infer validity.\r\n * \r\n * @param {string} content Raw text content of bulk code input element\r\n */\r\n function bulkCodeEntriesChangedHandler(content) {\r\n\r\n setBulkCodeValuesRaw(content);\r\n const tokenValues = content.split(tokenRegex).filter(x => x.length > 0).filter((value, index, array) => array.indexOf(value) === index);\r\n const tokensToValidate = tokenValues.flatMap(value => value.match(codeFormatRegex)).filter(result => result != null);\r\n setTokens(tokenValues);\r\n setCodesToValidate(tokensToValidate);\r\n }\r\n\r\n /**\r\n * Effect hook to capture changes to validation code list.\r\n */\r\n useEffect(() => {\r\n /**\r\n * Bulk Validate a list of codes, setting the validation results.\r\n * Internal memoization is used.\r\n * @param {string[]} codes Codes to validate.\r\n */\r\n async function bulkValidateCodes(codes) {\r\n setRemoteValidationCount(r => r + 1);\r\n\r\n const results = [];\r\n\r\n // Determine which codes we need to query\r\n const codesToQuery = [];\r\n for (let i = 0; i < codes.length; i++) {\r\n const code = codes[i];\r\n if (!validationCache[code]) {\r\n codesToQuery.push(code);\r\n }\r\n }\r\n\r\n let remoteQuery;\r\n try {\r\n \r\n \r\n // Query codes\r\n if (codesToQuery.length > 0) {\r\n const reCaptchaToken = await fetchReCaptchaToken();\r\n remoteQuery = await checkCodesValidity(codesToQuery, reCaptchaToken);\r\n } else {\r\n remoteQuery = [];\r\n }\r\n\r\n // Store remote query in validation cache\r\n for (let i = 0; i < remoteQuery.length; i++) {\r\n const code = remoteQuery[i];\r\n validationCache[code.code] = code;\r\n }\r\n\r\n // Set the results\r\n for (let i = 0; i < codes.length; i++) {\r\n const code = codes[i];\r\n const validationResult = validationCache[code];\r\n if (validationResult != null) {\r\n results.push(validationResult);\r\n }\r\n }\r\n } catch {\r\n remoteQuery = [];\r\n toast.warn(`${t('Unable to verify if codes are valid.')} ${t('Please try again in a moment.')}`, { autoClose: 5000 });\r\n }\r\n finally {\r\n setRemoteValidationCount(r => r - 1);\r\n }\r\n\r\n setCodeValidationResults(results);\r\n }\r\n\r\n if (codesToValidate.length > 0) {\r\n bulkValidateCodes(codesToValidate);\r\n }\r\n\r\n }, [codesToValidate, t])\r\n\r\n /**\r\n * Get validated codes that have a defined amount. (0 amount is included, as it is still a valid code).\r\n * @returns \r\n */\r\n function getValidCodes() {\r\n return codeValidationResults.filter(result => result.amount != null);\r\n }\r\n\r\n function resultsDictionary() {\r\n const validCodeResults = codeValidationResults.filter(result => result.amount != null)\r\n const result = tokens.map(token => {\r\n const validatedResult = validCodeResults.find(entry => entry.code === token);\r\n if (validatedResult) {\r\n return validatedResult;\r\n }\r\n return {\r\n code: token,\r\n amount: null\r\n }\r\n })\r\n return result;\r\n }\r\n\r\n /**\r\n * Add Valid Codes Handler\r\n */\r\n function addValidCodesHandler() {\r\n validationCache = {}; // Reset validation cache\r\n\r\n // Clear entries. The user has decided to add what is visible.\r\n setBulkCodeValuesRaw(\"\");\r\n setCodeValidationResults([]);\r\n setTokens([]);\r\n setCodesToValidate([]);\r\n onAdd(getValidCodes());\r\n }\r\n\r\n return (\r\n
\r\n 0}\r\n spinner\r\n text={`${t('Please wait')}...`}>\r\n\r\n \r\n \r\n \r\n \r\n \r\n\r\n \r\n
\r\n )\r\n}\r\n\r\nexport default BulkCodeImportController;","import React, {useCallback, useEffect, useState} from \"react\"\r\nimport { Container, InputGroup } from \"react-bootstrap\"\r\nimport Button from 'react-bootstrap/Button'\r\nimport Form from 'react-bootstrap/Form'\r\nimport { useTranslation } from 'react-i18next'\r\nimport { BsPlusCircle, BsThreeDots } from \"react-icons/bs\"\r\nimport { Link } from \"react-router-dom\"\r\nimport { toast } from \"react-toastify\"\r\nimport { checkCodeValidity } from '../../api/validateCode'\r\nimport * as Configuration from '../../utils/configuration'\r\nimport CodeValidity from './CodeValidity'\r\nimport {useGoogleReCaptcha} from \"react-google-recaptcha-v3\";\r\n\r\n/**\r\n * Promo Code Entry Form Element\r\n * Accepts and validates a promo code - which can be added (if valid) to a parent using { onAdd({code, amount})}\r\n * @param {{onAdd}} params \r\n * @returns \r\n */\r\nfunction PromoCodeEntry({ onAdd }) {\r\n const { t } = useTranslation();\r\n\r\n const [value, setValue] = useState(\"\");\r\n const [isValid, setIsValid] = useState(false);\r\n const [amount, setAmount] = useState(null);\r\n const [busy, setBusy] = useState(false);\r\n const { executeRecaptcha } = useGoogleReCaptcha();\r\n \r\n const RECAPTCHA_VALIDATE_CODE_ACTION_NAME = 'validateCode';\r\n\r\n const fetchReCaptchaToken = useCallback(async () => {\r\n if (!executeRecaptcha) {\r\n return null;\r\n }\r\n return await executeRecaptcha(RECAPTCHA_VALIDATE_CODE_ACTION_NAME);\r\n }, [executeRecaptcha]);\r\n\r\n\r\n useEffect(() => {\r\n /**\r\n * Validate that a code is valid asynchronously\r\n * @param {string} code Code\r\n * @returns Void Promise\r\n */\r\n async function validate(code) {\r\n try {\r\n \r\n const reCaptchaCode = await fetchReCaptchaToken();\r\n \r\n setBusy(true);\r\n const validatedCode = await checkCodeValidity(code, reCaptchaCode);\r\n if (validatedCode.amount == null) {\r\n setPromoCodeDetails({ amount: null, valid: false });\r\n return;\r\n }\r\n setPromoCodeDetails({ amount: validatedCode.amount, valid: true });\r\n } catch (err) {\r\n // We don't know if it's valid or not.\r\n toast.warn(`${t('Unable to verify if code is valid.', { code })} ${t('Please try again in a moment.')}`, { autoClose: 5000 });\r\n setPromoCodeDetails({ amount: null, valid: false });\r\n setValue(\"\");\r\n } finally {\r\n setBusy(false);\r\n }\r\n }\r\n\r\n /**\r\n * Effect Logic\r\n */\r\n\r\n if (value == null || value.length === 0 || !Configuration.CODE_LENGTHS.includes(value.length)) {\r\n setPromoCodeDetails({ amount: null, valid: false });\r\n return;\r\n }\r\n validate(value);\r\n\r\n }, [value, t, fetchReCaptchaToken]);\r\n\r\n function setPromoCodeDetails({ amount, valid }) {\r\n setIsValid(valid);\r\n setAmount(amount);\r\n }\r\n\r\n function promoCodeChanged(e) {\r\n setValue(e.target.value);\r\n }\r\n\r\n function buttonClick(e) {\r\n e.preventDefault();\r\n onAdd({ code: value, amount });\r\n setValue(\"\");\r\n }\r\n\r\n function keyDown(e) {\r\n if (e.key === \"Enter\" && isValid) {\r\n buttonClick(e);\r\n }\r\n }\r\n\r\n function codeValueValid() { return value.length > 0 ? isValid : null; }\r\n \r\n const maxCodeLength = Math.max(...Configuration.CODE_LENGTHS);\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n

{t('Enter a code')}

\r\n {/*\r\n \r\n */}\r\n \r\n \r\n \r\n \r\n {t('Bulk Codes')}\r\n
\r\n
\r\n \r\n );\r\n}\r\nexport default PromoCodeEntry;","import React from \"react\";\r\nimport { Alert } from 'react-bootstrap';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport 'react-toastify/dist/ReactToastify.css';\r\nimport './promo-code-input-form.css';\r\n\r\n/**\r\n * Displays validation messages for promo code input form.\r\n * @param {object} param0 \r\n * @returns \r\n */\r\nfunction ValidationMessages({ messages, valid }) {\r\n const { t } = useTranslation();\r\n\r\n if (valid) return null;\r\n\r\n return <>\r\n {messages.map((message, i) => (\r\n

{t(message.key, message.parameters)}

\r\n ))}\r\n \r\n}\r\n\r\nexport default ValidationMessages;","import React from \"react\";\r\nimport { Button, CloseButton, Table } from 'react-bootstrap';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport 'react-toastify/dist/ReactToastify.css';\r\nimport { getCodesValue } from '../../utils/promo-code-form-helpers';\r\nimport './promo-code-input-form.css';\r\nimport ValidationMessages from './ValidationMessages';\r\n\r\n\r\n/**\r\n * Promo Code Input Records for Form, with overall form validation messages\r\n * @param {Object} param0 \r\n * @returns \r\n */\r\nfunction PromoCodeInputRecords({ codes, submit, formValid, removeCode }) {\r\n const { t } = useTranslation();\r\n\r\n\r\n const validations = ;\r\n if (codes.length === 0) {\r\n return <>{validations};\r\n }\r\n return (\r\n <>\r\n {validations}\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n {codes.map(entry => (\r\n \r\n \r\n \r\n \r\n \r\n ))}\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
{t('Code')}{t('Amount')}{t('Remove')}
{entry.code}{entry.amount} { e.preventDefault(); removeCode(entry.code); }}>{t()}
{t('Total amount')}:{getCodesValue(codes)}
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default PromoCodeInputRecords;","import React, { useEffect, useState } from \"react\";\r\nimport { Col, Container, Row } from 'react-bootstrap';\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { toast, ToastContainer } from 'react-toastify';\r\nimport 'react-toastify/dist/ReactToastify.css';\r\nimport { validateCodeList } from '../../utils/promo-code-form-helpers';\r\nimport BulkCodeImportController from \"../bulk-code-input/BulkCodeImportController\";\r\nimport './promo-code-input-form.css';\r\nimport PromoCodeEntry from './PromoCodeEntry';\r\nimport PromoCodeInputRecords from './PromoCodeInputRecords';\r\n\r\n/**\r\n * Input Form container for Promo Codes\r\n * @param {*} param0 \r\n * @returns \r\n */\r\nfunction PromoCodeInputForm({ onSubmit, minimumCodesValue, initialCodes = [], mode = 'Single' }) {\r\n const [codes, setCodes] = useState(initialCodes);\r\n const [formValid, setFormValid] = useState({ valid: false, messages: [] });\r\n const { t } = useTranslation();\r\n\r\n function submit(e) {\r\n e.preventDefault();\r\n onSubmit({ codes });\r\n }\r\n\r\n useEffect(() => {\r\n setFormValid(validateCodeList({ codes, minimumCodesValue }));\r\n }, [codes, minimumCodesValue]);\r\n\r\n function handleAddNewCode(newValue) {\r\n\r\n // TODO: Simplify\r\n if (newValue instanceof Array) {\r\n const newCodesRequest = newValue.map(n => n.code);\r\n const alreadyAdded = codes.filter(entry => newCodesRequest.includes(entry.code)).map(entry => entry.code);\r\n const addCodes = newValue.filter(entry => !alreadyAdded.includes(entry.code));\r\n\r\n setCodes([...codes, ...addCodes]);\r\n\r\n if (alreadyAdded.length > 0) {\r\n if (alreadyAdded.length > 1) {\r\n toast.warn(t('Codes have already been added', { duplicateCodeCount: alreadyAdded.length }), { autoClose: 5000 });\r\n } else {\r\n toast.error(t('Code has already been added', { code: alreadyAdded[0] }), { autoClose: 5000 });\r\n }\r\n }\r\n\r\n if (addCodes.length > 0) {\r\n toast.success(t('Codes were successfully added', { codeCount: addCodes.length }));\r\n } else {\r\n toast.info(t('No new codes were added'));\r\n }\r\n\r\n return;\r\n }\r\n\r\n const { code } = newValue;\r\n\r\n if (codes.filter(entry => entry.code === code).length > 0) {\r\n toast.error(t('Code has already been added', { code }), { autoClose: 5000 });\r\n return;\r\n }\r\n setCodes([...codes, newValue]);\r\n toast.success(t('Code was successfully added', { code }));\r\n }\r\n\r\n function removeCode(code) {\r\n setCodes(codes.filter(entry => entry.code !== code));\r\n }\r\n return (\r\n \r\n \r\n \r\n {mode !== 'Bulk' ?\r\n \r\n : \r\n }\r\n \r\n \r\n \r\n \r\n \r\n \r\n );\r\n}\r\n\r\nexport { PromoCodeInputForm };\r\n\r\n","import React, { useEffect, useState } from \"react\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { BsArrowClockwise, BsArrowLeftCircle } from \"react-icons/bs\";\r\nimport LoadingOverlay from 'react-loading-overlay';\r\nimport { Route, Routes } from \"react-router-dom\";\r\nimport { requestCard } from '../../api/requestCard';\r\nimport * as Configuration from '../../utils/configuration';\r\nimport ConsumedTokensSummary from '../issued-card/ConsumedTokensSummary';\r\nimport IssueCardsError from \"../issued-card/IssueCardsError\";\r\nimport IssuedCardsView from \"../issued-card/IssuedCardsView\";\r\nimport { PromoCodeInputForm } from \"./PromoCodeInputForm\";\r\n\r\n/**\r\n * Form Controller for Promo Code Input\r\n * @returns \r\n */\r\nfunction PromoCodeInputController() {\r\n const [submittedCodes, submitCodes] = useState([]);\r\n const [issuedCards, issueCards] = useState(null);\r\n const [processing, setProcessing] = useState(false);\r\n const [config, setConfig] = useState(null);\r\n const [initialCodes, setInitialCodes] = useState([]);\r\n\r\n const { t } = useTranslation();\r\n\r\n useEffect(() => {\r\n async function requestCardAsync({ codes }) {\r\n if (codes.length === 0) return;\r\n setProcessing(true);\r\n var result = await requestCard({ codes });\r\n issueCards(result);\r\n setProcessing(false);\r\n }\r\n if (submittedCodes.length === 0) return;\r\n\r\n requestCardAsync({ codes: submittedCodes });\r\n }, [submittedCodes]);\r\n\r\n useEffect(() => {\r\n async function configure() {\r\n const configurationData = await Configuration.getConfiguration();\r\n setConfig(configurationData);\r\n }\r\n configure();\r\n }, [])\r\n\r\n\r\n function onSubmit({ codes }) {\r\n setInitialCodes(codes);\r\n submitCodes(codes.map(code => code.code));\r\n }\r\n\r\n return (\r\n <>\r\n \r\n
\r\n {!config ?\r\n null :\r\n (!issuedCards ?\r\n <>\r\n \r\n } />\r\n } />\r\n \r\n \r\n :\r\n <>\r\n {issuedCards.successful ?\r\n <>\r\n \r\n
\r\n

{t('Token History')}

\r\n \r\n
\r\n :\r\n <>\r\n \r\n \r\n \r\n }\r\n \r\n \r\n )}\r\n\r\n
\r\n \r\n );\r\n}\r\n\r\nexport default PromoCodeInputController;","import React from 'react';\r\nimport { BrowserRouter } from \"react-router-dom\";\r\nimport { Button } from \"react-bootstrap\";\r\nimport { useTranslation } from 'react-i18next';\r\nimport { BsGlobe } from 'react-icons/bs';\r\nimport './App.css';\r\nimport FormController from './components/promo-code-input/PromoCodeInputController';\r\n\r\nfunction App() {\r\n const [t, i18n] = useTranslation();\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n
\r\n {t('Logo')}\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n

{t('Redeem Paysafecards')}

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n \r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n Prodajna mesta\r\n
\r\n \r\n
\r\n Moneta\r\n
\r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n );\r\n}\r\n\r\nexport default App;\r\n","const reportWebVitals = (onPerfEntry) => {\r\n if (onPerfEntry && onPerfEntry instanceof Function) {\r\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\r\n getCLS(onPerfEntry);\r\n getFID(onPerfEntry);\r\n getFCP(onPerfEntry);\r\n getLCP(onPerfEntry);\r\n getTTFB(onPerfEntry);\r\n });\r\n }\r\n};\r\n\r\nexport default reportWebVitals;\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport 'bootstrap/dist/css/bootstrap.min.css';\r\nimport './index.css';\r\nimport './i18n'\r\nimport App from './App';\r\nimport reportWebVitals from './reportWebVitals';\r\nimport {GoogleReCaptchaProvider} from 'react-google-recaptcha-v3';\r\n\r\nReactDOM.render(\r\n \r\n \r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n);\r\n\r\n// If you want to start measuring performance in your app, pass a function\r\n// to log results (for example: reportWebVitals(console.log))\r\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\r\nreportWebVitals();\r\n"],"sourceRoot":""}