import { Component, linkEvent } from 'inferno'; import * as moment from 'moment'; import { endpoint } from '../env'; import { SearchParams, Results, Torrent } from '../interfaces'; import { humanFileSize, magnetLink, getFileName } from '../utils'; interface State { results: Results; searchParams: SearchParams; searching: Boolean; } export class Search extends Component { state: State = { results: { torrents: [] }, searchParams: { q: "", page: 1, type_: 'torrent' }, searching: false }; constructor(props, context) { super(props, context); } componentDidMount() { this.state.searchParams = { page: Number(this.props.match.params.page), q: this.props.match.params.q, type_: this.props.match.params.type_ } this.search(); } // Re-do search if the props have changed componentDidUpdate(lastProps, lastState, snapshot) { if (lastProps.match && lastProps.match.params !== this.props.match.params) { this.state.searchParams = { page: Number(this.props.match.params.page), q: this.props.match.params.q, type_: this.props.match.params.type_ } this.search(); } } search() { if (!!this.state.searchParams.q) { this.setState({ searching: true, results: { torrents: [] } }); this.fetchData(this.state.searchParams) .then(torrents => { if (!!torrents) { this.setState({ results: { torrents: torrents } }); } }).catch(error => { console.error('request failed', error); }).then(() => this.setState({ searching: false })); } else { this.setState({ results: { torrents: [] } }); } } fetchData(searchParams: SearchParams): Promise> { let q = encodeURI(searchParams.q); return fetch(`${endpoint}/service/search?q=${q}&page=${searchParams.page}&type_=${searchParams.type_}`) .then(data => data.json()); } render() { return (
{ this.state.searching ? this.spinner() : this.state.results.torrents[0] ? this.torrentsTable() : this.noResults() }
); } spinner() { return (
); } noResults() { return (

No Results

) } torrentsTable() { return (
{this.state.results.torrents.map(torrent => ( { !torrent.name ? ( ) : ( )} ))}
Name Size Seeds Leeches Created
{getFileName(torrent.path)} {torrent.name} {humanFileSize(torrent.size_bytes, true)} {torrent.seeders} {torrent.leechers} {moment(torrent.created_unix * 1000).fromNow()}
{this.paginator()}
); } paginator() { return ( ); } switchPage(a: { i: Search, nextPage: boolean }, event) { let newSearch = a.i.state.searchParams; newSearch.page += (a.nextPage) ? 1 : -1; a.i.props.history.push(`/search/${newSearch.type_}/${newSearch.q}/${newSearch.page}`); } }