-
-
Notifications
You must be signed in to change notification settings - Fork 866
Expand file tree
/
Copy pathDialogSection.tsx
More file actions
97 lines (83 loc) · 3.14 KB
/
DialogSection.tsx
File metadata and controls
97 lines (83 loc) · 3.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import Component, { type ComponentAttrs } from 'flarum/common/Component';
import Dialog from '../../common/models/Dialog';
import type Mithril from 'mithril';
import MessageStream from './MessageStream';
import username from 'flarum/common/helpers/username';
import MessageStreamState from '../states/MessageStreamState';
import Avatar from 'flarum/common/components/Avatar';
import Link from 'flarum/common/components/Link';
import app from 'flarum/forum/app';
import ItemList from 'flarum/common/utils/ItemList';
import Button from 'flarum/common/components/Button';
import Dropdown from 'flarum/common/components/Dropdown';
import DetailsModal from './DetailsModal';
import listItems from 'flarum/common/helpers/listItems';
export interface IDialogStreamAttrs extends ComponentAttrs {
dialog: Dialog;
}
export default class DialogSection<CustomAttrs extends IDialogStreamAttrs = IDialogStreamAttrs> extends Component<CustomAttrs> {
protected loading = false;
protected messages!: MessageStreamState;
oninit(vnode: Mithril.Vnode<CustomAttrs, this>) {
super.oninit(vnode);
this.messages = new MessageStreamState({
filter: {
dialog: this.attrs.dialog.id(),
},
sort: '-createdAt',
});
this.messages.refresh();
}
view() {
const recipient = this.attrs.dialog.recipient();
return (
<div className="DialogSection">
<div className="DialogSection-header">
<Avatar user={recipient} />
<div className="DialogSection-header-info">
{(recipient && (
<Link href={app.route.user(recipient!)}>
<h2>{username(recipient)}</h2>
</Link>
)) || <h2>{username(recipient)}</h2>}
<div className="badges">{listItems(recipient?.badges().toArray() || [])}</div>
</div>
<div className="DialogSection-header-actions">{this.actionItems().toArray()}</div>
</div>
<MessageStream dialog={this.attrs.dialog} state={this.messages} />
</div>
);
}
actionItems() {
const items = new ItemList<Mithril.Children>();
items.add(
'back',
<Button className="Button Button--icon DialogSection-back" icon="fas fa-arrow-left" onclick={this.attrs.onback}>
{app.translator.trans('flarum-messages.forum.dialog_section.back_label')}
</Button>
);
items.add(
'details',
<Dropdown
icon="fas fa-ellipsis-h"
className="DialogSection-controls"
buttonClassName="Button Button--icon"
accessibleToggleLabel={app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label')}
label={app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label')}
>
{this.controlItems().toArray()}
</Dropdown>
);
return items;
}
controlItems() {
const items = new ItemList<Mithril.Children>();
items.add(
'details',
<Button icon="fas fa-info-circle" onclick={() => app.modal.show(DetailsModal, { dialog: this.attrs.dialog })}>
{app.translator.trans('flarum-messages.forum.dialog_section.controls.details_button')}
</Button>
);
return items;
}
}