2019-03-23 01:42:57 +00:00
import { Component , linkEvent } from 'inferno' ;
import { Subscription } from "rxjs" ;
import { retryWhen , delay , take } from 'rxjs/operators' ;
2019-04-03 23:01:20 +00:00
import { CommunityForm , UserOperation , Category , ListCategoriesResponse } from '../interfaces' ;
2019-03-23 01:42:57 +00:00
import { WebSocketService , UserService } from '../services' ;
import { msgOp } from '../utils' ;
2019-03-25 03:51:27 +00:00
import { Community } from '../interfaces' ;
2019-03-23 01:42:57 +00:00
interface State {
communityForm : CommunityForm ;
2019-04-03 23:01:20 +00:00
categories : Array < Category > ;
2019-03-23 01:42:57 +00:00
}
export class CreateCommunity extends Component < any , State > {
private subscription : Subscription ;
2019-03-26 18:00:18 +00:00
private emptyState : State = {
communityForm : {
name : null ,
2019-04-03 23:01:20 +00:00
title : null ,
category_id : null
} ,
categories : [ ]
2019-03-26 18:00:18 +00:00
}
2019-03-23 01:42:57 +00:00
constructor ( props , context ) {
super ( props , context ) ;
2019-03-26 18:00:18 +00:00
this . state = this . emptyState ;
2019-04-03 23:01:20 +00:00
2019-03-23 01:42:57 +00:00
this . subscription = WebSocketService . Instance . subject
. pipe ( retryWhen ( errors = > errors . pipe ( delay ( 3000 ) , take ( 10 ) ) ) )
. subscribe (
( msg ) = > this . parseMessage ( msg ) ,
( err ) = > console . error ( err ) ,
2019-03-25 03:51:27 +00:00
( ) = > console . log ( "complete" )
2019-03-23 01:42:57 +00:00
) ;
2019-04-03 23:01:20 +00:00
WebSocketService . Instance . listCategories ( ) ;
2019-03-23 01:42:57 +00:00
}
componentWillUnmount() {
this . subscription . unsubscribe ( ) ;
}
render() {
return (
< div class = "container" >
< div class = "row" >
< div class = "col-12 col-lg-6 mb-4" >
{ this . communityForm ( ) }
< / div >
< / div >
< / div >
)
}
communityForm() {
return (
< div >
< form onSubmit = { linkEvent ( this , this . handleCreateCommunitySubmit ) } >
< h3 > Create Forum < / h3 >
< div class = "form-group row" >
< label class = "col-sm-2 col-form-label" > Name < / label >
< div class = "col-sm-10" >
2019-04-04 20:00:19 +00:00
< input type = "text" class = "form-control" value = { this . state . communityForm . name } onInput = { linkEvent ( this , this . handleCommunityNameChange ) } required minLength = { 3 } pattern = "[a-z0-9_]+" title = "lowercase, underscores, and no spaces." / >
2019-03-23 01:42:57 +00:00
< / div >
< / div >
2019-04-03 23:01:20 +00:00
< div class = "form-group row" >
< label class = "col-sm-2 col-form-label" > Title / Headline < / label >
< div class = "col-sm-10" >
< input type = "text" value = { this . state . communityForm . title } onInput = { linkEvent ( this , this . handleCommunityTitleChange ) } class = "form-control" required minLength = { 3 } / >
< / div >
< / div >
< div class = "form-group row" >
< label class = "col-sm-2 col-form-label" > Description / Sidebar < / label >
< div class = "col-sm-10" >
< textarea value = { this . state . communityForm . description } onInput = { linkEvent ( this , this . handleCommunityDescriptionChange ) } class = "form-control" rows = { 6 } / >
< / div >
< / div >
< div class = "form-group row" >
< label class = "col-sm-2 col-form-label" > Category < / label >
< div class = "col-sm-10" >
< select class = "form-control" value = { this . state . communityForm . category_id } onInput = { linkEvent ( this , this . handleCommunityCategoryChange ) } >
{ this . state . categories . map ( category = >
< option value = { category . id } > { category . name } < / option >
) }
< / select >
< / div >
< / div >
2019-03-23 01:42:57 +00:00
< div class = "form-group row" >
< div class = "col-sm-10" >
< button type = "submit" class = "btn btn-secondary" > Create < / button >
< / div >
< / div >
< / form >
< / div >
) ;
}
2019-04-03 23:01:20 +00:00
2019-03-23 01:42:57 +00:00
handleCreateCommunitySubmit ( i : CreateCommunity , event ) {
event . preventDefault ( ) ;
WebSocketService . Instance . createCommunity ( i . state . communityForm ) ;
}
handleCommunityNameChange ( i : CreateCommunity , event ) {
i . state . communityForm . name = event . target . value ;
2019-04-03 23:01:20 +00:00
i . setState ( i . state ) ;
}
handleCommunityTitleChange ( i : CreateCommunity , event ) {
i . state . communityForm . title = event . target . value ;
i . setState ( i . state ) ;
}
handleCommunityDescriptionChange ( i : CreateCommunity , event ) {
i . state . communityForm . description = event . target . value ;
i . setState ( i . state ) ;
}
handleCommunityCategoryChange ( i : CreateCommunity , event ) {
i . state . communityForm . category_id = Number ( event . target . value ) ;
i . setState ( i . state ) ;
2019-03-23 01:42:57 +00:00
}
parseMessage ( msg : any ) {
let op : UserOperation = msgOp ( msg ) ;
2019-03-25 03:51:27 +00:00
console . log ( msg ) ;
2019-03-23 01:42:57 +00:00
if ( msg . error ) {
alert ( msg . error ) ;
return ;
2019-04-03 23:01:20 +00:00
} else if ( op == UserOperation . ListCategories ) {
let res : ListCategoriesResponse = msg ;
this . state . categories = res . categories ;
this . state . communityForm . category_id = res . categories [ 0 ] . id ;
this . setState ( this . state ) ;
} else if ( op == UserOperation . CreateCommunity ) {
let community : Community = msg . community ;
this . props . history . push ( ` /community/ ${ community . id } ` ) ;
2019-03-23 01:42:57 +00:00
}
}
}