Newer
Older
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
// This file is part of Parity.
//
import React, { Component } from "react";
import { chainName$ } from "@parity/light.js";
import debounce from "lodash/debounce";
import { Header } from "fether-ui";
import light from "@parity/light.js-react";
import Health from "../Health";
import NewTokenItem from "./NewTokenItem";
import withAccount from "../utils/withAccount";
import withTokens from "../utils/withTokens";
chainName: () => chainName$({ withoutLoading: true })
state = {
db: null,
dbMap: null,
};
calculateMatches = debounce(() => {
const { db, search } = this.state;
if (search.length <= 1) {
return;
}
const matches = db
? db.filter(
({ name, symbol }) =>
name.toLowerCase().includes(search.toLowerCase()) ||
symbol.toLowerCase().includes(search.toLowerCase())
: [];
this.setState({ matches });
}, 500);
if (this.props.chainName) {
this.fetchTokensDb();
}
}
if (this.props.chainName && !prevProps.chainName) {
this.fetchTokensDb();
}
}
fetchTokensDb = async () => {
if (this.state.db) {
// Don't fetch again if it's already fetched
return;
}
// We only fetch this huge json if the user visits this NewToken page. We
// try to avoid it as much as possible. All other tokens info (used in the
// homepage) are stored in localStorage.
let db;
try {
db = await import(`../assets/tokens/${this.props.chainName}.json`);
} catch (e) {
this.setState({ db: [], dbMap: {} });
return;
}
// We create a address=>token mapping here
const dbMap = {};
db.forEach(token => (dbMap[token.address] = token));
// Commit this into the state
this.setState({ db, dbMap });
};
handleSearch = ({ target: { value } }) => {
this.setState({ search: value });
this.calculateMatches();
};
handleClear = () => {
const { matches, search } = this.state;
const displayedTokens = search ? matches : this.props.tokensArrayWithoutEth;
<a to="/tokens" className="icon -close" onClick={history.goBack}>
<div className="window_content">
<div className="box -padded">
<div className="search-form">
<input
onChange={this.handleSearch}
/>
<button
onClick={this.handleClear}
<div className="box -scroller">
<ul className="list -tokens">
<NewTokenItem key={token.address} token={token} />
<nav className="footer-nav">
<div className="footer-nav_status">