From 4c582cf1b6d9d9a348dd6efc6c337a0b1754bb8e Mon Sep 17 00:00:00 2001 From: Dessalines Date: Tue, 23 Jun 2020 12:52:07 -0400 Subject: [PATCH] Making sure new comments don't clear out your current textarea. - Making a better random string generator. - Doing better incoming comment checking. - Fixes #769 --- ui/src/components/comment-form.tsx | 44 ++++++++++++++++++------------ ui/src/utils.ts | 25 +++++++++++++---- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/ui/src/components/comment-form.tsx b/ui/src/components/comment-form.tsx index 24bfb7cbb..0fb7824ec 100644 --- a/ui/src/components/comment-form.tsx +++ b/ui/src/components/comment-form.tsx @@ -245,18 +245,32 @@ export class CommentForm extends Component { }); } - handleFinished() { - this.state.previewMode = false; - this.state.loading = false; - this.state.commentForm.content = ''; - this.setState(this.state); - let form: any = document.getElementById(this.formId); - form.reset(); - if (this.props.node) { - this.props.onReplyCancel(); + handleFinished(data: CommentResponse) { + let isReply = + this.props.node !== undefined && data.comment.parent_id !== null; + let xor = + +!(data.comment.parent_id !== null) ^ +(this.props.node !== undefined); + + if ( + (data.comment.creator_id == UserService.Instance.user.id && + // If its a reply, make sure parent child match + isReply && + data.comment.parent_id == this.props.node.comment.id) || + // Otherwise, check the XOR of the two + (!isReply && xor) + ) { + this.state.previewMode = false; + this.state.loading = false; + this.state.commentForm.content = ''; + this.setState(this.state); + let form: any = document.getElementById(this.formId); + form.reset(); + if (this.props.node) { + this.props.onReplyCancel(); + } + autosize.update(form); + this.setState(this.state); } - autosize.update(document.querySelector('textarea')); - this.setState(this.state); } handleCommentSubmit(i: CommentForm, event: any) { @@ -359,14 +373,10 @@ export class CommentForm extends Component { if (UserService.Instance.user) { if (res.op == UserOperation.CreateComment) { let data = res.data as CommentResponse; - if (data.comment.creator_id == UserService.Instance.user.id) { - this.handleFinished(); - } + this.handleFinished(data); } else if (res.op == UserOperation.EditComment) { let data = res.data as CommentResponse; - if (data.comment.creator_id == UserService.Instance.user.id) { - this.handleFinished(); - } + this.handleFinished(data); } } } diff --git a/ui/src/utils.ts b/ui/src/utils.ts index af54d77aa..bdb9afbd2 100644 --- a/ui/src/utils.ts +++ b/ui/src/utils.ts @@ -114,11 +114,26 @@ export const emojiPicker = new EmojiButton({ // TODO i18n }); -export function randomStr() { - return Math.random() - .toString(36) - .replace(/[^a-z]+/g, '') - .substr(2, 10); +const DEFAULT_ALPHABET = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + +function getRandomCharFromAlphabet(alphabet: string): string { + return alphabet.charAt(Math.floor(Math.random() * alphabet.length)); +} + +export function randomStr( + idDesiredLength: number = 20, + alphabet = DEFAULT_ALPHABET +): string { + /** + * Create n-long array and map it to random chars from given alphabet. + * Then join individual chars as string + */ + return Array.from({ length: idDesiredLength }) + .map(() => { + return getRandomCharFromAlphabet(alphabet); + }) + .join(''); } export function wsJsonToRes(msg: WebSocketJsonResponse): WebSocketResponse {