Skip to content

Commit

Permalink
Add validation, alert and update processReservedTokens file
Browse files Browse the repository at this point in the history
  • Loading branch information
Mariano Aguero committed Sep 28, 2018
1 parent 3fff6c3 commit 721c54e
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 4 deletions.
14 changes: 11 additions & 3 deletions src/components/Common/ReservedTokensInputBlock.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ import {
reservedTokensImported,
noMoreReservedSlotAvailableCSV,
clearingReservedTokens,
noMoreReservedSlotAvailable
noMoreReservedSlotAvailable,
reservedTokenErrorImportingCSV
} from '../../utils/alerts'
import processReservedTokens from '../../utils/processReservedTokens'
import { processReservedTokens, errorsCsv } from '../../utils/processReservedTokens'
import logdown from 'logdown'
import { downloadFile } from '../../utils/utils'

Expand Down Expand Up @@ -175,6 +176,13 @@ export class ReservedTokensInputBlock extends Component {
Papa.parse(file, {
skipEmptyLines: true,
complete: results => {
const { data } = results
const { errorRowLength, errorAddress } = errorsCsv(data)

if ((errorRowLength && errorRowLength.length > 0) || (errorAddress && errorAddress.length > 0)) {
return reservedTokenErrorImportingCSV(errorRowLength, errorAddress)
}

const { called, reservedTokenLengthError } = processReservedTokens(
{
rows: results.data,
Expand Down Expand Up @@ -298,7 +306,7 @@ export class ReservedTokensInputBlock extends Component {
</div>
</Dropzone>
<div
className="sw-ReservedTokensListControls_Button sw-ReservedTokensListControls_Button-uploadcsv m-r-0"
className="sw-ReservedTokensListControls_Button sw-ReservedTokensListControls_Button-downloadcsv m-r-0"
onClick={this.downloadCSV}
>
Download CSV template
Expand Down
38 changes: 38 additions & 0 deletions src/utils/alerts.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import sweetAlert2 from 'sweetalert2'
import { weiToGwei } from './utils'
import { DEPLOYMENT_VALUES, LIMIT_RESERVED_ADDRESSES, LIMIT_WHITELISTED_ADDRESSES } from './constants'

export function noMetaMaskAlert(cb) {
sweetAlert2({
title: 'Warning',
Expand Down Expand Up @@ -271,6 +272,43 @@ export function whitelistImported(count) {
})
}

export function reservedTokenErrorImportingCSV(lines, address) {
let message = 'There was an error importing the file.'

if (lines && lines.length > 0) {
const messageHeader = `<div class="text-left">The following lines have an erroneous amount of columns: </div>`

let list = '<ul class="text-left">'
for (let error of lines) {
const { line, columns } = error
const columnLabel = columns > 1 ? 'columns' : 'column'
let item = `<li>The line number ${line} have ${columns} ${columnLabel}, must have 3 columns</li>`
list = `${list}${item}`
}
list = `${list}</ul>`
message = `${messageHeader} ${list}`
}

if (address && address.length > 0) {
const messageHeader = `<div class="text-left">The following address are wrong: </div>`

let list = '<ul class="text-left">'
for (let error of address) {
const { line, address } = error
let item = `<li>The line number ${line} has an incorrect address: ${address}</li>`
list = `${list}${item}`
}
list = `${list}</ul>`
message = `${message} ${messageHeader} ${list}`
}

return sweetAlert2({
title: 'Error importing the file',
html: message,
type: 'error'
})
}

export function reservedTokensImported(count) {
return sweetAlert2({
title: 'Reserved tokens imported',
Expand Down
33 changes: 32 additions & 1 deletion src/utils/processReservedTokens.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { composeValidators, isAddress, isDecimalPlacesNotGreaterThan, isPositive, isRequired } from './validations'
import { reservedTokenStore } from '../stores'
import logdown from 'logdown'
import Web3 from 'web3'

const logger = logdown('TW:processReservedTokens')

Expand All @@ -14,7 +15,7 @@ const logger = logdown('TW:processReservedTokens')
* @param {Function} cb The function to be called with each valid item
* @returns {Object} Object with a `called` property, indicating the number of times the callback was called
*/
export default function({ rows, decimals }, cb) {
export const processReservedTokens = ({ rows, decimals }, cb) => {
let called = 0
let reservedTokenLengthError = false
for (let row of rows) {
Expand Down Expand Up @@ -61,3 +62,33 @@ export default function({ rows, decimals }, cb) {
reservedTokenLengthError: reservedTokenLengthError
}
}

export const errorsCsv = data => {
let errorRowLength = []
let errorAddress = []

for (let i = 0; i < data.length; i++) {
const row = data[i]

if (row.length < 3) {
const errorRow = {
line: i + 1,
columns: row.length
}
errorRowLength.push(errorRow)
}

if (row[0] && !Web3.utils.isAddress(row[0])) {
const errorRow = {
line: i + 1,
address: row[0]
}
errorAddress.push(errorRow)
}
}

return {
errorRowLength: errorRowLength,
errorAddress: errorAddress
}
}

0 comments on commit 721c54e

Please sign in to comment.