mirror of https://gitlab.com/ecentrics/concordia
Apostolos Fanakis
4 years ago
6 changed files with 226 additions and 2 deletions
@ -0,0 +1,166 @@ |
|||
import React, { |
|||
useCallback, useContext, useEffect, useState, |
|||
} from 'react'; |
|||
import { |
|||
Button, Container, Form, Icon, Input, TextArea, |
|||
} from 'semantic-ui-react'; |
|||
import { useTranslation } from 'react-i18next'; |
|||
import { useHistory } from 'react-router'; |
|||
import { useSelector } from 'react-redux'; |
|||
import AppContext from '../../../components/AppContext'; |
|||
import './styles.css'; |
|||
|
|||
const TopicCreate = (props) => { |
|||
const { account } = props; |
|||
|
|||
const { |
|||
drizzle: { |
|||
contracts: { |
|||
Forum: { |
|||
methods: { createTopic }, |
|||
}, |
|||
}, |
|||
}, |
|||
} = useContext(AppContext.Context); |
|||
|
|||
const orbit = useSelector((state) => state.orbit); |
|||
const transactionStack = useSelector((state) => state.transactionStack); |
|||
const transactions = useSelector((state) => state.transactions); |
|||
|
|||
const [subjectInput, setSubjectInput] = useState(''); |
|||
const [messageInput, setMessageInput] = useState(''); |
|||
const [topicSubjectInputEmptySubmit, setTopicSubjectInputEmptySubmit] = useState(false); |
|||
const [topicMessageInputEmptySubmit, setTopicMessageInputEmptySubmit] = useState(false); |
|||
const [createTopicCacheSendStackId, setCreateTopicCacheSendStackId] = useState(''); |
|||
const [posting, setPosting] = useState(false); |
|||
|
|||
const history = useHistory(); |
|||
const { t } = useTranslation(); |
|||
|
|||
const handleSubjectInputChange = useCallback((event) => { |
|||
if (posting) { |
|||
return; |
|||
} |
|||
|
|||
switch (event.target.name) { |
|||
case 'subjectInput': |
|||
setSubjectInput(event.target.value); |
|||
break; |
|||
case 'messageInput': |
|||
setMessageInput(event.target.value); |
|||
break; |
|||
default: |
|||
break; |
|||
} |
|||
}, [posting]); |
|||
|
|||
useEffect(() => { |
|||
if (posting && transactionStack && transactionStack[createTopicCacheSendStackId] |
|||
&& transactions[transactionStack[createTopicCacheSendStackId]]) { |
|||
if (transactions[transactionStack[createTopicCacheSendStackId]].status === 'error') { |
|||
setPosting(false); |
|||
} else if (transactions[transactionStack[createTopicCacheSendStackId]].status === 'success') { |
|||
const { |
|||
receipt: { |
|||
events: { |
|||
TopicCreated: { |
|||
returnValues: { |
|||
topicID: topicId, |
|||
postID: postId, |
|||
}, |
|||
}, |
|||
}, |
|||
}, |
|||
} = transactions[transactionStack[createTopicCacheSendStackId]]; |
|||
|
|||
// Promise.all( |
|||
// orbit.topicsDB |
|||
// .put(topicId, { subject: subjectInput }), |
|||
// orbit.postsDB |
|||
// .put(postId, { |
|||
// subject: subjectInput, |
|||
// content: messageInput, |
|||
// }), |
|||
// ).then((value) => { |
|||
// console.log(value); |
|||
// history.push('/'); |
|||
// }) |
|||
// .catch((reason) => console.log(reason)); |
|||
} |
|||
} |
|||
}, [ |
|||
transactions, transactionStack, history, posting, createTopicCacheSendStackId, orbit, subjectInput, messageInput, |
|||
]); |
|||
|
|||
const validateAndPost = useCallback(() => { |
|||
if (subjectInput === '') { |
|||
setTopicSubjectInputEmptySubmit(true); |
|||
return; |
|||
} |
|||
|
|||
if (messageInput === '') { |
|||
setTopicMessageInputEmptySubmit(true); |
|||
return; |
|||
} |
|||
|
|||
setPosting(true); |
|||
setCreateTopicCacheSendStackId(createTopic.cacheSend(...[], { from: account })); |
|||
}, [account, createTopic, messageInput, subjectInput]); |
|||
|
|||
return ( |
|||
<Container> |
|||
<Form loading={posting}> |
|||
<Form.Field required> |
|||
<label htmlFor="form-topic-create-field-subject"> |
|||
{t('topic.create.form.subject.field.label')} |
|||
</label> |
|||
<Input |
|||
id="form-topic-create-field-subject" |
|||
placeholder={t('topic.create.form.subject.field.placeholder')} |
|||
name="subjectInput" |
|||
className="form-input" |
|||
error={topicSubjectInputEmptySubmit} |
|||
value={subjectInput} |
|||
onChange={handleSubjectInputChange} |
|||
/> |
|||
</Form.Field> |
|||
<Form.Field required> |
|||
<label htmlFor="form-topic-create-field-message"> |
|||
{t('topic.create.form.message.field.label')} |
|||
</label> |
|||
<TextArea |
|||
id="form-topic-create-field-message" |
|||
name="messageInput" |
|||
className={topicMessageInputEmptySubmit |
|||
? 'form-textarea-required' |
|||
: ''} |
|||
value={messageInput} |
|||
placeholder={t('topic.create.form.message.field.placeholder')} |
|||
rows={5} |
|||
autoheight="true" |
|||
onChange={handleSubjectInputChange} |
|||
/> |
|||
</Form.Field> |
|||
<Form.Group> |
|||
<Form.Button |
|||
animated |
|||
key="form-topic-create-button-submit" |
|||
type="button" |
|||
color="green" |
|||
disabled={posting} |
|||
onClick={validateAndPost} |
|||
> |
|||
<Button.Content visible> |
|||
{t('topic.create.form.post.button')} |
|||
</Button.Content> |
|||
<Button.Content hidden> |
|||
<Icon name="send" /> |
|||
</Button.Content> |
|||
</Form.Button> |
|||
</Form.Group> |
|||
</Form> |
|||
</Container> |
|||
); |
|||
}; |
|||
|
|||
export default TopicCreate; |
@ -0,0 +1,6 @@ |
|||
.form-textarea-required { |
|||
color: rgb(159, 58, 56) !important; |
|||
outline-color: rgb(159, 58, 56) !important; |
|||
border-color: rgb(224, 180, 180) !important; |
|||
background-color: rgb(255, 246, 246) !important; |
|||
} |
@ -0,0 +1,18 @@ |
|||
import React from 'react'; |
|||
import PropTypes from 'prop-types'; |
|||
|
|||
const TopicView = (props) => { |
|||
const { topicId } = props; |
|||
|
|||
return ( |
|||
<div> |
|||
TODO |
|||
</div> |
|||
); |
|||
}; |
|||
|
|||
TopicView.propTypes = { |
|||
topicId: PropTypes.number, |
|||
}; |
|||
|
|||
export default TopicView; |
@ -0,0 +1,19 @@ |
|||
import React from 'react'; |
|||
import { useRouteMatch } from 'react-router'; |
|||
import TopicCreate from './TopicCreate'; |
|||
import TopicView from './TopicView'; |
|||
|
|||
const Topic = () => { |
|||
const match = useRouteMatch(); |
|||
const { id: topicId } = match.params; |
|||
|
|||
return topicId === 'new' |
|||
? ( |
|||
<TopicCreate /> |
|||
) |
|||
: ( |
|||
<TopicView topicId={topicId} /> |
|||
); |
|||
}; |
|||
|
|||
export default Topic; |
Loading…
Reference in new issue