import { Component, linkEvent } from 'inferno'; import { Prompt } from 'inferno-router'; import { Subscription } from 'rxjs'; import { retryWhen, delay, take } from 'rxjs/operators'; import { CommunityForm as CommunityFormI, UserOperation, Category, ListCategoriesResponse, CommunityResponse, WebSocketJsonResponse, } from '../interfaces'; import { WebSocketService } from '../services'; import { wsJsonToRes, capitalizeFirstLetter, toast, randomStr, setupTribute, } from '../utils'; import Tribute from 'tributejs/src/Tribute.js'; import autosize from 'autosize'; import { i18n } from '../i18next'; import { Community } from '../interfaces'; interface CommunityFormProps { community?: Community; // If a community is given, that means this is an edit onCancel?(): any; onCreate?(community: Community): any; onEdit?(community: Community): any; enableNsfw: boolean; } interface CommunityFormState { communityForm: CommunityFormI; categories: Array; loading: boolean; } export class CommunityForm extends Component< CommunityFormProps, CommunityFormState > { private id = `community-form-${randomStr()}`; private tribute: Tribute; private subscription: Subscription; private emptyState: CommunityFormState = { communityForm: { name: null, title: null, category_id: null, nsfw: false, }, categories: [], loading: false, }; constructor(props: any, context: any) { super(props, context); this.tribute = setupTribute(); this.state = this.emptyState; if (this.props.community) { this.state.communityForm = { name: this.props.community.name, title: this.props.community.title, category_id: this.props.community.category_id, description: this.props.community.description, edit_id: this.props.community.id, nsfw: this.props.community.nsfw, auth: null, }; } this.subscription = WebSocketService.Instance.subject .pipe(retryWhen(errors => errors.pipe(delay(3000), take(10)))) .subscribe( msg => this.parseMessage(msg), err => console.error(err), () => console.log('complete') ); WebSocketService.Instance.listCategories(); } componentDidMount() { var textarea: any = document.getElementById(this.id); autosize(textarea); this.tribute.attach(textarea); textarea.addEventListener('tribute-replaced', () => { this.state.communityForm.description = textarea.value; this.setState(this.state); autosize.update(textarea); }); } componentDidUpdate() { if ( !this.state.loading && (this.state.communityForm.name || this.state.communityForm.title || this.state.communityForm.description) ) { window.onbeforeunload = () => true; } else { window.onbeforeunload = undefined; } } componentWillUnmount() { this.subscription.unsubscribe(); window.onbeforeunload = null; } render() { return ( <>