]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - client/src/app/shared/shared-abuse-list/abuse-message-modal.component.ts
Bumped to version v5.2.1
[github/Chocobozzz/PeerTube.git] / client / src / app / shared / shared-abuse-list / abuse-message-modal.component.ts
CommitLineData
66357162
C
1import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'
2import { AuthService, HtmlRendererService, Notifier } from '@app/core'
5c5bcea2 3import { FormReactive, FormReactiveService } from '@app/shared/shared-forms'
441e453a
C
4import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
42b40636 6import { logger } from '@root-helpers/logger'
441e453a 7import { AbuseMessage, UserAbuse } from '@shared/models'
7ed1edbb 8import { ABUSE_MESSAGE_VALIDATOR } from '../form-validators/abuse-validators'
94148c90 9import { AbuseService } from '../shared-moderation'
441e453a
C
10
11@Component({
12 selector: 'my-abuse-message-modal',
13 templateUrl: './abuse-message-modal.component.html',
14 styleUrls: [ './abuse-message-modal.component.scss' ]
15})
16export class AbuseMessageModalComponent extends FormReactive implements OnInit {
17 @ViewChild('modal', { static: true }) modal: NgbModal
441e453a 18
94148c90
C
19 @Input() isAdminView: boolean
20
441e453a
C
21 @Output() countMessagesUpdated = new EventEmitter<{ abuseId: number, countMessages: number }>()
22
d573926e 23 abuseMessages: (AbuseMessage & { messageHtml: string })[] = []
441e453a
C
24 textareaMessage: string
25 sendingMessage = false
94148c90 26 noResults = false
441e453a
C
27
28 private openedModal: NgbModalRef
29 private abuse: UserAbuse
30
31 constructor (
5c5bcea2 32 protected formReactiveService: FormReactiveService,
441e453a 33 private modalService: NgbModal,
d573926e 34 private htmlRenderer: HtmlRendererService,
441e453a
C
35 private auth: AuthService,
36 private notifier: Notifier,
441e453a
C
37 private abuseService: AbuseService
38 ) {
39 super()
40 }
41
42 ngOnInit () {
43 this.buildForm({
7ed1edbb 44 message: ABUSE_MESSAGE_VALIDATOR
441e453a
C
45 })
46 }
47
48 openModal (abuse: UserAbuse) {
49 this.abuse = abuse
50
51 this.openedModal = this.modalService.open(this.modal, { centered: true })
52
53 this.loadMessages()
54 }
55
56 hide () {
57 this.abuseMessages = []
58 this.openedModal.close()
59 }
60
61 addMessage () {
62 this.sendingMessage = true
63
64 this.abuseService.addAbuseMessage(this.abuse, this.form.value['message'])
1378c0d3
C
65 .subscribe({
66 next: () => {
441e453a
C
67 this.form.reset()
68 this.sendingMessage = false
69 this.countMessagesUpdated.emit({ abuseId: this.abuse.id, countMessages: this.abuseMessages.length + 1 })
70
71 this.loadMessages()
72 },
73
1378c0d3 74 error: err => {
441e453a 75 this.sendingMessage = false
42b40636 76 logger.error(err)
441e453a
C
77 this.notifier.error('Sorry but you cannot send this message. Please retry later')
78 }
1378c0d3 79 })
441e453a
C
80 }
81
82 deleteMessage (abuseMessage: AbuseMessage) {
83 this.abuseService.deleteAbuseMessage(this.abuse, abuseMessage)
1378c0d3
C
84 .subscribe({
85 next: () => {
441e453a
C
86 this.countMessagesUpdated.emit({ abuseId: this.abuse.id, countMessages: this.abuseMessages.length - 1 })
87
88 this.abuseMessages = this.abuseMessages.filter(m => m.id !== abuseMessage.id)
89 },
90
1378c0d3
C
91 error: err => this.notifier.error(err.message)
92 })
441e453a
C
93 }
94
95 isMessageByMe (abuseMessage: AbuseMessage) {
96 return this.auth.getUser().account.id === abuseMessage.account.id
97 }
98
94148c90
C
99 getPlaceholderMessage () {
100 if (this.isAdminView) {
66357162 101 return $localize`Add a message to communicate with the reporter`
94148c90
C
102 }
103
66357162 104 return $localize`Add a message to communicate with the moderation team`
94148c90
C
105 }
106
441e453a
C
107 private loadMessages () {
108 this.abuseService.listAbuseMessages(this.abuse)
1378c0d3
C
109 .subscribe({
110 next: async res => {
d573926e
C
111 this.abuseMessages = []
112
113 for (const m of res.data) {
114 this.abuseMessages.push(Object.assign(m, {
115 messageHtml: await this.htmlRenderer.convertToBr(m.message)
116 }))
117 }
118
94148c90 119 this.noResults = this.abuseMessages.length === 0
441e453a
C
120
121 setTimeout(() => {
d573926e
C
122 // Don't use ViewChild: it is not supported inside a ng-template
123 const messagesBlock = document.querySelector('.messages')
124 messagesBlock.scroll(0, messagesBlock.scrollHeight)
441e453a
C
125 })
126 },
127
1378c0d3
C
128 error: err => this.notifier.error(err.message)
129 })
441e453a
C
130 }
131
132}