import { Component, linkEvent } from 'inferno'; import { Prompt } from 'inferno-router'; import { MarkdownTextArea } from './markdown-textarea'; import { Site, SiteForm as SiteFormI } from '../interfaces'; import { WebSocketService } from '../services'; import { capitalizeFirstLetter, randomStr } from '../utils'; import { i18n } from '../i18next'; interface SiteFormProps { site?: Site; // If a site is given, that means this is an edit onCancel?(): any; } interface SiteFormState { siteForm: SiteFormI; loading: boolean; } export class SiteForm extends Component { private id = `site-form-${randomStr()}`; private emptyState: SiteFormState = { siteForm: { enable_downvotes: true, open_registration: true, enable_nsfw: true, name: null, }, loading: false, }; constructor(props: any, context: any) { super(props, context); this.state = this.emptyState; this.handleSiteDescriptionChange = this.handleSiteDescriptionChange.bind( this ); if (this.props.site) { this.state.siteForm = { name: this.props.site.name, description: this.props.site.description, enable_downvotes: this.props.site.enable_downvotes, open_registration: this.props.site.open_registration, enable_nsfw: this.props.site.enable_nsfw, }; } } // Necessary to stop the loading componentWillReceiveProps() { this.state.loading = false; this.setState(this.state); } componentDidUpdate() { if ( !this.state.loading && !this.props.site && (this.state.siteForm.name || this.state.siteForm.description) ) { window.onbeforeunload = () => true; } else { window.onbeforeunload = undefined; } } componentWillUnmount() { window.onbeforeunload = null; } render() { return ( <>
{`${ this.props.site ? capitalizeFirstLetter(i18n.t('save')) : capitalizeFirstLetter(i18n.t('name')) } ${i18n.t('your_site')}`}
{this.props.site && ( )}
); } handleCreateSiteSubmit(i: SiteForm, event: any) { event.preventDefault(); i.state.loading = true; if (i.props.site) { WebSocketService.Instance.editSite(i.state.siteForm); } else { WebSocketService.Instance.createSite(i.state.siteForm); } i.setState(i.state); } handleSiteNameChange(i: SiteForm, event: any) { i.state.siteForm.name = event.target.value; i.setState(i.state); } handleSiteDescriptionChange(val: string) { this.state.siteForm.description = val; this.setState(this.state); } handleSiteEnableNsfwChange(i: SiteForm, event: any) { i.state.siteForm.enable_nsfw = event.target.checked; i.setState(i.state); } handleSiteOpenRegistrationChange(i: SiteForm, event: any) { i.state.siteForm.open_registration = event.target.checked; i.setState(i.state); } handleSiteEnableDownvotesChange(i: SiteForm, event: any) { i.state.siteForm.enable_downvotes = event.target.checked; i.setState(i.state); } handleCancel(i: SiteForm) { i.props.onCancel(); } }