Skip to content

Commit d2b7eb7

Browse files
authored
Merge pull request #681 from GetStream/message-text-component
feat: create message-text component
2 parents 141e8ab + 97dfe68 commit d2b7eb7

21 files changed

+791
-476
lines changed

package-lock.json

Lines changed: 8 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
"@ctrl/ngx-emoji-mart": "^8.2.0",
113113
"@floating-ui/dom": "^1.6.3",
114114
"@ngx-translate/core": "^14.0.0",
115-
"@stream-io/stream-chat-css": "5.3.0",
115+
"@stream-io/stream-chat-css": "5.6.1",
116116
"@stream-io/transliterate": "^1.5.2",
117117
"angular-mentions": "1.4.0",
118118
"dayjs": "^1.11.10",

projects/customizations-example/src/app/app.component.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,3 +262,16 @@
262262
<div>Latest message text: {{ latestMessageText }}</div>
263263
<div>Latest message id: {{ latestMessage?.id }}</div>
264264
</ng-template>
265+
266+
<ng-template
267+
#messageText
268+
let-message="message"
269+
let-shouldTranslate="shouldTranslate"
270+
let-isQuoted="isQuoted"
271+
>
272+
<app-message-text
273+
[message]="message"
274+
[shouldTranslate]="shouldTranslate"
275+
[isQuoted]="isQuoted"
276+
></app-message-text>
277+
</ng-template>

projects/customizations-example/src/app/app.component.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
MessageActionsService,
3737
ChannelPreviewInfoContext,
3838
MessageReactionsSelectorComponent,
39+
MessageTextContext,
3940
} from 'stream-chat-angular';
4041
import { environment } from '../environments/environment';
4142

@@ -95,6 +96,8 @@ export class AppComponent implements AfterViewInit {
9596
private emptyMainMessageListTemplate!: TemplateRef<void>;
9697
@ViewChild('emptyThreadMessageList')
9798
private emptyThreadMessageListTemplate!: TemplateRef<void>;
99+
@ViewChild('messageText')
100+
messageTextTemplate!: TemplateRef<MessageTextContext>;
98101

99102
constructor(
100103
private chatService: ChatClientService,
@@ -189,6 +192,9 @@ export class AppComponent implements AfterViewInit {
189192
this.customTemplatesService.emptyThreadMessageListPlaceholder$.next(
190193
this.emptyThreadMessageListTemplate
191194
);
195+
this.customTemplatesService.messageTextTemplate$.next(
196+
this.messageTextTemplate
197+
);
192198
}
193199

194200
inviteClicked(channel: Channel) {

projects/customizations-example/src/app/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { PickerModule } from '@ctrl/ngx-emoji-mart';
1212
import { MessageActionComponent } from './message-action/message-action.component';
1313
import { ThreadHeaderComponent } from './thread-header/thread-header.component';
1414
import { IconComponent } from './icon/icon.component';
15+
import { MessageTextComponent } from './message-text/message-text.component';
1516

1617
@NgModule({
1718
declarations: [
@@ -20,6 +21,7 @@ import { IconComponent } from './icon/icon.component';
2021
MessageActionComponent,
2122
ThreadHeaderComponent,
2223
IconComponent,
24+
MessageTextComponent,
2325
],
2426
imports: [
2527
BrowserModule,
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<ng-container *ngIf="isQuoted; else regularMessageText">
2+
<!-- Quoted message are clamped by default, so need there -->
3+
<stream-message-text
4+
[message]="message"
5+
[shouldTranslate]="shouldTranslate"
6+
[isQuoted]="isQuoted"
7+
></stream-message-text>
8+
</ng-container>
9+
<ng-template #regularMessageText>
10+
<div class="message-text" [class.message-text-expanded]="isExpanded" #text>
11+
<stream-message-text
12+
[message]="message"
13+
[shouldTranslate]="shouldTranslate"
14+
[isQuoted]="isQuoted"
15+
></stream-message-text>
16+
</div>
17+
<!-- 5px diff is due to Firefox issue -->
18+
<button
19+
[class.visible]="text.scrollHeight - text.clientHeight > 5 || isExpanded"
20+
(click)="isExpanded = !isExpanded"
21+
>
22+
{{ "Show" + (isExpanded ? " less" : " more") }}
23+
</button>
24+
</ng-template>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
.message-text {
2+
overflow: hidden;
3+
display: -webkit-box;
4+
-webkit-line-clamp: 5;
5+
line-clamp: 5;
6+
-webkit-box-orient: vertical;
7+
}
8+
9+
.message-text.message-text-expanded {
10+
display: block;
11+
}
12+
13+
button {
14+
display: none;
15+
16+
&.visible {
17+
display: block;
18+
}
19+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Component, Input } from '@angular/core';
2+
import { MessageResponseBase } from 'stream-chat';
3+
import { DefaultStreamChatGenerics, StreamMessage } from 'stream-chat-angular';
4+
5+
@Component({
6+
selector: 'app-message-text',
7+
templateUrl: './message-text.component.html',
8+
styleUrls: ['./message-text.component.scss'],
9+
})
10+
export class MessageTextComponent {
11+
@Input() message:
12+
| StreamMessage<DefaultStreamChatGenerics>
13+
| undefined
14+
| MessageResponseBase<DefaultStreamChatGenerics>;
15+
@Input() isQuoted: boolean = false;
16+
@Input() shouldTranslate: boolean = false;
17+
isExpanded = false;
18+
}

projects/stream-chat-angular/src/lib/custom-templates.service.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
MessageContext,
2727
MessageReactionsContext,
2828
MessageReactionsSelectorContext,
29+
MessageTextContext,
2930
ModalContext,
3031
NotificationContext,
3132
ReadStatusContext,
@@ -43,7 +44,7 @@ import {
4344
*
4445
* For code examples to the different customizations see our [customizations example application](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example), specifically the [AppComponent](https://github.com/GetStream/stream-chat-angular/tree/master/projects/customizations-example/src/app) (see [README](https://github.com/GetStream/stream-chat-angular/blob/master/README.md#customization-examples) for instructions on how to start the application).
4546
*
46-
* You can find the type definitions of the context that is provided for each template [on GitHub](https://github.com/GetStream/stream-chat-angular/blob/master/projects/stream-chat-angu)
47+
* You can find the type definitions of the context that is provided for each template [on GitHub](https://github.com/GetStream/stream-chat-angular/blob/master/projects/stream-chat-angular/src/lib/types.ts)
4748
*/
4849
@Injectable({
4950
providedIn: 'root',
@@ -358,6 +359,12 @@ export class CustomTemplatesService<
358359
customMessageMetadataInsideBubbleTemplate$ = new BehaviorSubject<
359360
TemplateRef<CustomMetadataContext> | undefined
360361
>(undefined);
362+
/**
363+
* Template to display the text content inside the [message component](/chat/docs/sdk/angular/components/MessageComponent/). The default component is [stream-message-text](/chat/docs/sdk/angular/components/MessageTextComponent/)
364+
*/
365+
messageTextTemplate$ = new BehaviorSubject<
366+
TemplateRef<MessageTextContext> | undefined
367+
>(undefined);
361368

362369
constructor() {}
363370
}

projects/stream-chat-angular/src/lib/message-input/message-input.component.html

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,28 @@
9191
[attachments]="quotedMessageAttachments"
9292
[messageId]="quotedMessage.id"
9393
></stream-attachment-list>
94-
<div
95-
class="str-chat__quoted-message-text"
96-
data-testid="quoted-message-text"
97-
[innerHTML]="
98-
quotedMessage.translation ||
99-
quotedMessage.html ||
100-
quotedMessage.text
101-
"
102-
></div>
94+
<div class="str-chat__quoted-message-text">
95+
<ng-container
96+
*ngTemplateOutlet="
97+
(customTemplatesService.messageTextTemplate$ | async) ||
98+
defaultText;
99+
context: getQuotedMessageTextContext()
100+
"
101+
></ng-container>
102+
<ng-template
103+
#defaultText
104+
let-message="message"
105+
let-isQuoted="isQuoted"
106+
let-shouldTranslate="shouldTranslate"
107+
>
108+
<stream-message-text
109+
[message]="message"
110+
[isQuoted]="isQuoted"
111+
[shouldTranslate]="shouldTranslate"
112+
data-testid="quoted-message-text"
113+
></stream-message-text>
114+
</ng-template>
115+
</div>
103116
</div>
104117
</div>
105118
<ng-template

0 commit comments

Comments
 (0)