import React from 'react' import { createPortal } from 'react-dom' import api from '~utils/api' import Modal from '~components/Modal' import Overlay from '~components/Overlay' import CharacterResult from '~components/CharacterResult' import WeaponResult from '~components/WeaponResult' import SummonResult from '~components/SummonResult' import './index.scss' import PlusIcon from '~public/icons/plus.svg' interface Props { close: () => void send: (object: Character | Weapon | Summon, position: number) => any placeholderText: string fromPosition: number object: 'weapons' | 'characters' | 'summons' } interface State { query: string, results: { [key: string]: any } loading: boolean message: string totalResults: number } class SearchModal extends React.Component { searchInput: React.RefObject constructor(props: Props) { super(props) this.state = { query: '', results: {}, loading: false, message: '', totalResults: 0 } this.searchInput = React.createRef() } componentDidMount() { if (this.searchInput.current) { this.searchInput.current.focus() } } fetchResults = (query: string) => { api.search(this.props.object, query) .then((response) => { const data = response.data const totalResults = data.length this.setState({ results: data, totalResults: totalResults, loading: false }) }, (error) => { this.setState({ loading: false, message: error }) }) } inputChanged = (event: React.ChangeEvent) => { const query = event.target.value if (query.length) { this.setState({ query, loading: true, message: '' }, () => { this.fetchResults(query) }) } else { this.setState({ query, results: {}, message: '' }) } } sendData = (result: Character | Weapon | Summon) => { this.props.send(result, this.props.fromPosition) this.props.close() } renderSearchResults = () => { const { results } = this.state switch(this.props.object) { case 'weapons': return this.renderWeaponSearchResults(results) case 'summons': return this.renderSummonSearchResults(results) case 'characters': return this.renderCharacterSearchResults(results) } } renderWeaponSearchResults = (results: { [key: string]: any }) => { return (
    { results.map( (result: Weapon) => { return { this.sendData(result) }} /> })}
) } renderSummonSearchResults = (results: { [key: string]: any }) => { return (
    { results.map( (result: Summon) => { return { this.sendData(result) }} /> })}
) } renderCharacterSearchResults = (results: { [key: string]: any }) => { return (
    { results.map( (result: Character) => { return { this.sendData(result) }} /> })}
) } renderEmptyState = () => { let string = '' if (this.state.query === '') { string = `No ${this.props.object}` } else { string = `No results found for '${this.state.query}'` } return (

{string}

) } render() { const { query, loading } = this.state let content: JSX.Element if (Object.entries(this.state.results).length == 0) { content = this.renderEmptyState() } else { content = this.renderSearchResults() } return ( createPortal(
{content}
, document.body ) ) } } export default SearchModal