import React, { Component } from 'react'; import { fetchJSON } from '../http.jsx'; import torrentTableCSS from '../styles/adminTorrentTable.jsx'; class TorrentTable extends Component { constructor() { super(); this.state = { torrentResponse: [], listElements: undefined, showTable: false, filterQuery: '', sortValue: 'name', sortDesc: true, } this.UNITS = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; } componentWillReceiveProps(props) { if (props.response !== undefined && props.response !== this.state.torrentResponse) { console.log('not called', props) this.setState({ torrentResponse: props.response, showTable: true, }) } else { this.setState({ showTable: false, }) } } // BORROWED FROM GITHUB user sindresorhus // Link to repo: https://github.com/sindresorhus/pretty-bytes convertSizeToHumanSize(num) { if (!Number.isFinite(num)) { return num // throw new TypeError(`Expected a finite number, got ${typeof num}: ${num}`); } const neg = num < 0; if (neg) { num = -num; } if (num < 1) { return (neg ? '-' : '') + num + ' B'; } const exponent = Math.min(Math.floor(Math.log10(num) / 3), this.UNITS.length - 1); const numStr = Number((num / Math.pow(1000, exponent)).toPrecision(3)); const unit = this.UNITS[exponent]; return (neg ? '-' : '') + numStr + ' ' + unit; } convertHumanSizeToBytes(string) { const [numStr, unit] = string.split(' '); if (this.UNITS.indexOf(unit) === -1) { return string } const exponent = this.UNITS.indexOf(unit) * 3 return numStr * (Math.pow(10, exponent)) } sendToDownload(magnet) { const apiData = { magnet: magnet, } fetchJSON('https://apollo.kevinmidboe.com/api/v1/pirate/add', 'POST', apiData) // fetchJSON('http://localhost:31459/api/v1/pirate/add', 'POST', apiData) .then((response) => { console.log('Response, addMagnet: ', response) // TODO Display the feedback in a notification component (text, status) }) } // Updates the internal state of the query filter and updates the list to only // display names matching the query. This is real-time filtering. updateFilterQuery(event) { const query = event.target.value; let filteredByQuery = this.props.response.map((item, index) => { if (item.name.toLowerCase().indexOf(query.toLowerCase()) != -1) return item }) this.setState({ torrentResponse: filteredByQuery, filterQuery: query, }); } sortTable(col) { let direction = this.state.sortDesc; if (col === this.state.sortValue) direction = !direction; else direction = true let sortedItems = this.state.torrentResponse.sort((a,b) => { // This is so we also can sort string that only contain numbers let valueA = isNaN(a[col]) ? a[col] : parseInt(a[col]) let valueB = isNaN(b[col]) ? b[col] : parseInt(b[col]) valueA = (col == 'size') ? this.convertHumanSizeToBytes(valueA) : valueA valueB = (col == 'size') ? this.convertHumanSizeToBytes(valueB) : valueB if (direction) return valueAvalueB?-1:0; else return valueA>valueB? 1:valueA
this.updateFilterQuery(event)} value={this.state.filterQuery}/>
) } generateListElements() { let listElements = this.state.torrentResponse.map((item, index) => { if (item !== undefined) { let title = item.name let size = this.convertSizeToHumanSize(item.size) return ( { item.name } { item.uploader } { size } { item.seed } ) } }) return listElements } render() { return (
{ this.generateFilterSearch() } {this.generateListElements()}
this.sortTable('name') }> Title this.sortTable('uploader') }> Uploader this.sortTable('size') }> Size this.sortTable('seed') }> Seeds Magnet
) } } export default TorrentTable;