import { h, Component } from 'preact'; import api from 'common/api'; import { BASE_URL, NODE_ID } from 'common/constants'; import { url } from 'common/settings'; import store from 'common/store'; import AuthPanel from 'components/auth-panel'; import BlockedUsers from 'components/blocked-users'; import Comment from 'components/comment'; import Input from 'components/input'; import Preloader from 'components/preloader'; import Thread from 'components/thread'; export default class Root extends Component { constructor(props) { super(props); this.state = { loaded: false, user: {}, }; this.addComment = this.addComment.bind(this); this.onSignIn = this.onSignIn.bind(this); this.onSignOut = this.onSignOut.bind(this); this.onBlockedUsersShow = this.onBlockedUsersShow.bind(this); this.onBlockedUsersHide = this.onBlockedUsersHide.bind(this); this.onUnblockSomeone = this.onUnblockSomeone.bind(this); this.checkUrlHash = this.checkUrlHash.bind(this); } componentWillMount() { store.onUpdate('comments', comments => this.setState({ comments })); } componentDidMount() { api.getUser() .then(data => store.set('user', data)) .catch(() => store.set('user', {})) .finally(() => { api.find({ url }) .then(({ comments = [] } = {}) => store.set('comments', comments)) .catch(() => store.set('comments', [])) .finally(() => { this.setState({ loaded: true, user: store.get('user'), }); setTimeout(this.checkUrlHash); }); api.getConfig().then(config => { store.set('config', config); this.setState({ config }); }) }); } checkUrlHash() { if (window.location.hash.indexOf('#remark__comment-') === 0) { const comment = document.querySelector(window.location.hash); if (comment) { setTimeout(() => { comment.scrollIntoView(); window.scrollTo(window.scrollX, 0); // sometimes smth goes wrong and iframe scrolls; we return it here }, 500); } } } onSignOut() { api.logOut().then(() => { store.set('user', {}); this.setState({ user: {} }); }); } onSignIn(provider) { const newWindow = window.open(`${BASE_URL}/auth/${provider}/login?from=${encodeURIComponent(location.href)}`); let secondsPass = 0; const checkMsDelay = 200; const checkInterval = setInterval(() => { secondsPass += checkMsDelay; if (newWindow.location.origin === location.origin || secondsPass > 30000) { clearInterval(checkInterval); secondsPass = 0; newWindow.close(); api.getUser() .then(user => { store.set('user', user); this.setState({ user }); }) .catch(() => {}) // TODO: we need to handle it and write error to user } }, checkMsDelay); } onBlockedUsersShow() { api.getBlocked().then(bannedUsers => { this.setState({ bannedUsers, isBlockedVisible: true }); }); } onBlockedUsersHide() { // if someone was unblocked let's reload comments if (this.state.wasSomeoneUnblocked) { api.find({ url }).then(({ comments } = {}) => store.set('comments', comments)); } this.setState({ isBlockedVisible: false, wasSomeoneUnblocked: false, }); } onUnblockSomeone() { this.setState({ wasSomeoneUnblocked: true }); } addComment(data) { store.addComment(data); this.setState({ comments: store.get('comments') }); api.getComment({ id: data.id }).then(comment => { store.replaceComment(comment); this.setState({ comments: store.get('comments') }); }); } render({}, { config = {}, comments = [], user, loaded, isBlockedVisible, bannedUsers }) { if (!loaded) { return (