Skip to content

Commit cd1f637

Browse files
committed
fix: messages inconsistencies
1 parent 7136ad0 commit cd1f637

File tree

11 files changed

+58
-17
lines changed

11 files changed

+58
-17
lines changed

extensions/messages/extend.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
(new Extend\ApiResource(Resource\UserResource::class))
5252
->fields(fn () => [
5353
Schema\Boolean::make('canSendAnyMessage')
54-
->get(fn (object $model, Context $context) => $context->getActor()->can('sendAnyMessage')),
54+
->get(fn (User $user, Context $context) => $user->can('sendAnyMessage')),
5555
Schema\Integer::make('messageCount')
5656
->get(function (object $model, Context $context) {
5757
return Dialog::whereVisibleTo($context->getActor())

extensions/messages/js/src/@types/shims.d.ts renamed to extensions/messages/js/@types/shims.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,9 @@ declare module 'flarum/forum/states/ComposerState' {
1919
composingMessageTo(dialog: Dialog): boolean;
2020
}
2121
}
22+
23+
declare module 'flarum/common/models/User' {
24+
export default interface User {
25+
canSendAnyMessage(): boolean;
26+
}
27+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import DialogMessage from './models/DialogMessage';
22
import Dialog from './models/Dialog';
33
import Extend from 'flarum/common/extenders';
4+
import User from 'flarum/common/models/User';
45

56
export default [
67
new Extend.Store()
78
.add('dialogs', Dialog) //
89
.add('dialog-messages', DialogMessage), //
10+
11+
new Extend.Model(User) //
12+
.attribute<boolean>('canSendAnyMessage'),
913
];

extensions/messages/js/src/forum/components/MessageStream.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,9 @@ export default class MessageStream<CustomAttrs extends IDialogStreamAttrs = IDia
106106

107107
messages.forEach((message, index) => items.push(this.messageItem(message, index)));
108108

109-
if (ReplyPlaceholder) {
109+
if (app.session.user!.canSendAnyMessage() && ReplyPlaceholder) {
110110
items.push(
111-
<div className="MessageStream-item" key="reply" /*data-index={this.attrs.state.count()}*/>
111+
<div className="MessageStream-item" key="reply">
112112
<ReplyPlaceholder
113113
discussion={this.attrs.dialog}
114114
onclick={() => {

extensions/messages/js/src/forum/components/MessagesSidebar.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ export default class MessagesSidebar<CustomAttrs extends IMessagesSidebarAttrs =
1414
items(): ItemList<Mithril.Children> {
1515
const items = super.items();
1616

17-
const canSendAnyMessage = app.session.user!.attribute<boolean>('canSendAnyMessage');
18-
1917
items.remove('newDiscussion');
2018

2119
items.add(
@@ -27,9 +25,11 @@ export default class MessagesSidebar<CustomAttrs extends IMessagesSidebarAttrs =
2725
onclick={() => {
2826
return this.newMessageAction();
2927
}}
30-
disabled={!canSendAnyMessage}
28+
disabled={!app.session.user!.canSendAnyMessage()}
3129
>
32-
{app.translator.trans('flarum-messages.forum.messages_page.new_message_button')}
30+
{app.session.user!.canSendAnyMessage()
31+
? app.translator.trans('flarum-messages.forum.messages_page.send_message_button')
32+
: app.translator.trans('flarum-messages.forum.messages_page.cannot_send_message_button')}
3333
</Button>,
3434
10
3535
);

extensions/messages/js/src/forum/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import Button from 'flarum/common/components/Button';
88
import type Dialog from '../common/models/Dialog';
99
import DialogsDropdown from './components/DialogsDropdown';
1010
import DialogListState from './states/DialogListState';
11+
import type User from 'flarum/common/models/User';
1112

1213
export { default as extend } from './extend';
1314

@@ -44,14 +45,14 @@ app.initializers.add('flarum-messages', () => {
4445
});
4546

4647
extend(HeaderSecondary.prototype, 'items', function (items) {
47-
if (app.session.user?.attribute<boolean>('canSendAnyMessage')) {
48+
if (app.session.user?.canSendAnyMessage()) {
4849
items.add('messages', <DialogsDropdown state={app.dropdownDialogs} />, 15);
4950
}
5051
});
5152

5253
// @ts-ignore
53-
extend(UserControls, 'userControls', (items, user) => {
54-
if (app.session.user?.attribute<boolean>('canSendAnyMessage')) {
54+
extend(UserControls, 'userControls', (items, user: User) => {
55+
if (app.session.user?.canSendAnyMessage()) {
5556
items.add(
5657
'sendMessage',
5758
<Button
@@ -66,6 +67,7 @@ app.initializers.add('flarum-messages', () => {
6667
.then(() => app.composer.show());
6768
});
6869
}}
70+
helperText={user.canSendAnyMessage() ? null : app.translator.trans('flarum-messages.forum.user_controls.cannot_reply_text')}
6971
>
7072
{app.translator.trans('flarum-messages.forum.user_controls.send_message_button')}
7173
</Button>

extensions/messages/locale/en.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,14 @@ flarum-messages:
4242
oldest_button: Oldest
4343

4444
messages_page:
45-
empty_text: You have no messages yet. When you send or receive messages, they
46-
will appear here.
45+
cannot_send_message_button: Can't Send a Message
46+
empty_text: No new messages
4747
hero:
4848
title: Messages
4949
subtitle: Your private conversations with other users
5050
mark_all_as_read_tooltip: Mark all as read
51-
new_message_button: Send a Message
5251
refresh_tooltip: Refresh
52+
send_message_button: Send a Message
5353
stream:
5454
load_previous_button: Load previous messages
5555
start_of_the_conversation: Start of the conversation
@@ -64,6 +64,7 @@ flarum-messages:
6464

6565
user_controls:
6666
send_message_button: Send a message
67+
cannot_reply_text: This user cannot reply
6768

6869
notifications:
6970
message_received_text: Message Received notification from {user}

framework/core/js/src/common/components/Button.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ export interface IButtonAttrs extends ComponentAttrs {
4242
* @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/button#attr-type
4343
*/
4444
type?: string;
45+
/**
46+
* Helper text. Displayed under the button label.
47+
*
48+
* Default: `null`
49+
*/
4550
}
4651

4752
/**
@@ -56,7 +61,7 @@ export interface IButtonAttrs extends ComponentAttrs {
5661
*/
5762
export default class Button<CustomAttrs extends IButtonAttrs = IButtonAttrs> extends Component<CustomAttrs> {
5863
view(vnode: Mithril.VnodeDOM<CustomAttrs, this>) {
59-
let { type, 'aria-label': ariaLabel, icon: iconName, disabled, loading, className, class: _class, ...attrs } = this.attrs;
64+
let { type, 'aria-label': ariaLabel, icon: iconName, disabled, loading, className, class: _class, helperText, ...attrs } = this.attrs;
6065

6166
// If no `type` attr provided, set to "button"
6267
type ||= 'button';
@@ -108,8 +113,17 @@ export default class Button<CustomAttrs extends IButtonAttrs = IButtonAttrs> ext
108113

109114
return [
110115
iconName && <Icon name={iconName} className="Button-icon" />,
111-
children && <span className="Button-label">{children}</span>,
116+
children && (
117+
<span className="Button-label">
118+
<span className="Button-labelText">{children}</span>
119+
{this.getButtonSubContent()}
120+
</span>
121+
),
112122
this.attrs.loading && <LoadingIndicator size="small" display="inline" />,
113123
];
114124
}
125+
126+
protected getButtonSubContent(): Mithril.Children {
127+
return this.attrs.helperText ? <span className="Button-helperText">{this.attrs.helperText}</span> : null;
128+
}
115129
}

framework/core/js/src/common/components/Dropdown.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export interface IDropdownAttrs extends ComponentAttrs {
1919
caretIcon?: string;
2020
/** The label of the dropdown toggle button. Defaults to 'Controls'. */
2121
label: Mithril.Children;
22+
/** The helper text to display under the button label. */
23+
helperText: Mithril.Children;
2224
/** The label used to describe the dropdown toggle button to assistive readers. Defaults to 'Toggle dropdown menu'. */
2325
accessibleToggleLabel?: string;
2426
/** An optional tooltip to show when hovering over the dropdown toggle button. */
@@ -157,11 +159,18 @@ export default class Dropdown<CustomAttrs extends IDropdownAttrs = IDropdownAttr
157159
getButtonContent(children: Mithril.ChildArray): Mithril.ChildArray {
158160
return [
159161
this.attrs.icon ? <Icon name={this.attrs.icon} className="Button-icon" /> : '',
160-
<span className="Button-label">{this.attrs.label}</span>,
162+
<span className="Button-label">
163+
<span className="Button-labelText">{this.attrs.label}</span>
164+
{this.getButtonSubContent()}
165+
</span>,
161166
this.attrs.caretIcon ? <Icon name={this.attrs.caretIcon} className="Button-caret" /> : '',
162167
];
163168
}
164169

170+
protected getButtonSubContent(): Mithril.Children {
171+
return this.attrs.helperText ? <span className="Button-helperText">{this.attrs.helperText}</span> : null;
172+
}
173+
165174
getMenu(items: Mithril.Vnode<any, any>[]): Mithril.Vnode<any, any> {
166175
return <ul className={'Dropdown-menu dropdown-menu ' + this.attrs.menuClassName}>{items}</ul>;
167176
}

framework/core/less/common/Button.less

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,12 @@
259259
line-height: inherit;
260260
overflow: hidden;
261261
text-overflow: ellipsis;
262+
display: flex;
263+
flex-direction: column;
264+
}
265+
.Button-helperText {
266+
font-size: 0.73rem;
267+
color: var(--muted-more-color);
262268
}
263269
.Button-icon {
264270
line-height: inherit;

0 commit comments

Comments
 (0)