FILE / Unmei/Frontend

src/pages/Character/Character.tsx

Исходный файл и его история в репозитории.
FILE 1d285fcfc3ad276e6581dfb05542cf9375b0d15a
Files
Frontend/src/pages/Character/Character.tsx
T
2020-08-18 15:48:14 +03:00

60 lines
2.1 KiB
TypeScript

import React from "react";
import {fetchChar, fetchCharNovels} from "../../api/characters";
import './Character.sass'
// @ts-ignore
import parser from 'bbcode-to-react';
import NovelItem from "../../ui/NovelItem/NovelItem";
import Loading from "../../ui/Loading";
import NotFoundError from "../NotFoundError";
type Props = {
match: { params: { charId: number } }
}
type State = {
char: CharacterType | null
novels: NovelType[]
errorCode: number
};
class Character extends React.Component<Props, State> {
state: State = {
char: null, novels: [], errorCode: 0
};
componentDidMount = () => {
const { charId } = this.props.match.params;
fetchChar(charId).then(char => {
this.setState({ char });
document.title = char.localized_name ? `${char.original_name} / ${char.localized_name}` : char.original_name;
}).catch(r => this.setState({ errorCode: r.code }));
fetchCharNovels(charId).then(novels => this.setState({ novels }));
};
render() {
const { char, novels, errorCode } = this.state;
if(errorCode === 100) return <NotFoundError/>;
if(!char) return <Loading/>;
return (
<div className={'Character'}>
<div className="Character__Main">
<div style={{ backgroundImage: `url(${char.image})` }} className="Character__Image"/>
<div className="Character__Info">
<div className="Character__Info_Name">
{char.original_name !== char.localized_name ? (
`${char.original_name} / ${char.localized_name}`
) : char.original_name}
</div>
<pre className="Character__Info_Description">{parser.toReact(char.description)}</pre>
</div>
</div>
{novels.length > 0 &&
<div className="Character__Novels">
{novels.map(novel => <NovelItem {...novel} key={novel.id} viewType='grid' />)}
</div>}
</div>
);
}
}
export default Character;