import React from 'react'; import { Route, Switch } from "react-router-dom"; import './App.sass'; import Navbar from "../Navbar/Navbar"; import Novel from "../Novel/Novel"; import User from "../User/User"; import Main from "../Main/Main" import NotFoundError from "../NotFoundError"; import { fetchCurrentUser, fetchUserSettings } from "../../api/users"; import { connect } from "react-redux"; import Character from "../Character/Character"; // @ts-ignore import parser from 'bbcode-to-react'; import SpoilerTag from "../../ui/Spoiler/SpoilerTag"; import Novels from "../Novels/Novels"; import Footer from '../Footer/Footer'; import UserNovels from '../User/Novels/UserNovels'; import ColorTag from "../../ui/Tags/ColorTag"; import ActivateAccount from "../ActivateAccount"; import AllNews from "../News/AllNews"; import Post from "../News/Post"; import AdminPanel from "../AdminPanel/AdminPanel"; import PasswordRestoreGenerate from "../PasswordRestore/PasswordRestoreGenerate"; import PasswordRestore from "../PasswordRestore/PasswordRestore"; import Users from "../Users/Users"; import { getVersion, version } from "../../api/api"; import Settings from "../User/Settings/Settings"; import { setUser } from "../../store/ducks/currentUser"; import { setSettings } from "../../store/ducks/userSettings"; type Props = { notifications: React.ReactNode[] modal: React.ReactNode setUser: SetUser setSettings: SetSettings }; type State = {} class App extends React.Component { state: State = {} constructor(props: Props) { super(props); const cachedTheme = localStorage.getItem('theme'); if(cachedTheme) document.body.setAttribute('theme', cachedTheme); const { setUser, setSettings } = props; fetchCurrentUser().then(user => { setUser(user); fetchUserSettings().then(settings => { setSettings(settings); if(settings.theme !== cachedTheme) { localStorage.setItem('theme', settings.theme); document.body.setAttribute('theme', settings.theme); } }); }).catch((err: ApiError) => { if(err.code !== 3 && err.text) console.error(err.text); }); parser.registerTag('spoiler', SpoilerTag); parser.registerTag('color', ColorTag); getVersion().then(res => { if(version !== res.version) { console.debug(`Current back-end version: ${res.version}. Clearing cache`); caches.keys().then(names => { names.forEach(name => caches.delete(name).catch(console.error)) }).then(() => { window.location.reload(); }); } }); } render() { const { modal } = this.props; const notificationWidth = window.screen.width >= 500 ? 500 : window.screen.width; return ( <>
{this.props.notifications.map((n, i) => ( {n} ))}
{modal && modal}