Skip to content

Commit a63f46c

Browse files
authored
Merge pull request #563 from GetStream/edited-flag
feat: edited flag for message
2 parents 73ce3d4 + 5147de9 commit a63f46c

File tree

9 files changed

+112
-21
lines changed

9 files changed

+112
-21
lines changed

package-lock.json

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

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
"@ngx-translate/core": "^13.0.0",
118118
"@ngx-translate/http-loader": "^6.0.0",
119119
"@popperjs/core": "^2.11.5",
120-
"@stream-io/stream-chat-css": "4.7.4",
120+
"@stream-io/stream-chat-css": "4.8.0",
121121
"@stream-io/transliterate": "^1.5.2",
122122
"angular-mentions": "^1.4.0",
123123
"dayjs": "^1.10.7",
@@ -126,7 +126,7 @@
126126
"ngx-popperjs": "^12.2.2",
127127
"pretty-bytes": "^5.6.0",
128128
"rxjs": "^7.1.0",
129-
"stream-chat": "^8.15.0",
129+
"stream-chat": "^8.20.0",
130130
"ts-node": "^10.2.1",
131131
"tslib": "^2.3.0",
132132
"uuidv4": "^6.2.12",

projects/stream-chat-angular/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"@angular/common": "^12.2.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
1313
"@angular/core": "^12.2.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0",
1414
"@ngx-translate/core": "^13.0.0 || ^14.0.0 || ^15.0.0",
15-
"stream-chat": "^8.15.0"
15+
"stream-chat": "^8.20.0"
1616
},
1717
"dependencies": {
1818
"angular-mentions": "^1.4.0",

projects/stream-chat-angular/src/assets/i18n/en.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,6 @@ export const en = {
117117
'This message did not meet our content guidelines':
118118
'This message did not meet our content guidelines',
119119
'Send Anyway': 'Send Anyway',
120+
Edited: 'Edited',
120121
},
121122
};

projects/stream-chat-angular/src/lib/message-list/group-styles.spec.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,14 @@ describe('getGroupStyles', () => {
131131
)
132132
).toBe('top');
133133
});
134+
135+
it('should end group if the message id edited', () => {
136+
messages[1].message_text_updated_at = new Date().toISOString();
137+
138+
expect(getGroupStyles(messages[1], messages[0], messages[2])).toBe(
139+
'bottom'
140+
);
141+
142+
expect(getGroupStyles(messages[2], messages[1], messages[3])).toBe('top');
143+
});
134144
});

projects/stream-chat-angular/src/lib/message-list/group-styles.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export const getGroupStyles = (
2525
previousMessage.type === 'error' ||
2626
previousMessage.deleted_at ||
2727
previousMessage.id === lastReadMessageId ||
28+
previousMessage.message_text_updated_at ||
2829
(message.reaction_counts &&
2930
Object.keys(message.reaction_counts).length > 0);
3031

@@ -37,6 +38,7 @@ export const getGroupStyles = (
3738
nextMessage.type === 'error' ||
3839
nextMessage.deleted_at ||
3940
message.id === lastReadMessageId ||
41+
message.message_text_updated_at ||
4042
(nextMessage.reaction_counts &&
4143
Object.keys(nextMessage.reaction_counts).length > 0);
4244

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

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,15 @@
175175
class="str-chat__message-text"
176176
tabindex="0"
177177
*ngIf="message?.text || (message?.quoted_message && hasAttachment)"
178+
[class.str-chat__message-text--pointer-cursor]="
179+
(message?.status === 'failed' &&
180+
message?.errorStatusCode !== 403) ||
181+
(this.message?.type === 'error' &&
182+
this.message?.moderation_details) ||
183+
message?.message_text_updated_at
184+
"
185+
(click)="messageClicked()"
186+
(keyup.enter)="messageClicked()"
178187
>
179188
<div
180189
data-testid="inner-message"
@@ -184,8 +193,6 @@
184193
[class.str-chat__message-light-text-inner--has-attachment]="
185194
hasAttachment
186195
"
187-
(click)="unsentMessageClicked()"
188-
(keyup.enter)="unsentMessageClicked()"
189196
>
190197
<ng-container *ngTemplateOutlet="quotedMessage"></ng-container>
191198
<ng-container *ngIf="hasAttachment && message?.quoted_message">
@@ -459,9 +466,36 @@
459466
>
460467
{{ message?.user?.name ? message?.user?.name : message?.user?.id }}
461468
</span>
462-
<span data-testid="date" class="str-chat__message-simple-timestamp">
469+
<span
470+
data-testid="date"
471+
class="str-chat__message-simple-timestamp str-chat__message-simple-time"
472+
>
463473
{{ parsedDate }}
464474
</span>
475+
<ng-container *ngIf="message?.message_text_updated_at">
476+
<span
477+
data-testid="edited-flag"
478+
class="str-chat__mesage-simple-edited"
479+
translate
480+
>streamChat.Edited</span
481+
>
482+
<div
483+
data-testid="edited-timestamp"
484+
class="str-chat__message-edited-timestamp"
485+
[ngClass]="{
486+
'str-chat__message-edited-timestamp--open': isEditedFlagOpened,
487+
'str-chat__message-edited-timestamp--collapsed': !isEditedFlagOpened
488+
}"
489+
>
490+
<span translate>streamChat.Edited</span>
491+
<time
492+
dateTime="{{ message?.message_text_updated_at }}"
493+
title="{{ message?.message_text_updated_at }}"
494+
>
495+
{{ pasedEditedDate }}
496+
</time>
497+
</div>
498+
</ng-container>
465499
</div>
466500
</ng-container>
467501
</ng-template>

projects/stream-chat-angular/src/lib/message/message.component.spec.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1347,4 +1347,37 @@ describe('MessageComponent', () => {
13471347
' <a href="https://getstream.io/" class="my-special-class">https://getstream.io/</a>'
13481348
);
13491349
});
1350+
1351+
it(`shouldn't display edited flag if message wasn't edited`, () => {
1352+
expect(
1353+
nativeElement.querySelector('[data-testid="edited-flag"]')
1354+
).toBeNull();
1355+
});
1356+
1357+
it(`should display edited flag if message was edited, edited info should be collapsed`, () => {
1358+
component.message!.message_text_updated_at = new Date().toISOString();
1359+
component.ngOnChanges({ message: {} as SimpleChange });
1360+
fixture.detectChanges();
1361+
1362+
expect(
1363+
nativeElement.querySelector('[data-testid="edited-flag"]')
1364+
).not.toBeNull();
1365+
1366+
expect(
1367+
nativeElement.querySelector('[data-testid="edited-timestamp"]')
1368+
).not.toBeNull();
1369+
});
1370+
1371+
it(`should display edited flag if message was edited, display timestamp if clicked`, () => {
1372+
component.message!.message_text_updated_at = new Date().toISOString();
1373+
component.ngOnChanges({ message: {} as SimpleChange });
1374+
fixture.detectChanges();
1375+
queryMessageInner()?.click();
1376+
fixture.detectChanges();
1377+
const timestamp = nativeElement.querySelector(
1378+
'[data-testid="edited-timestamp"]'
1379+
);
1380+
1381+
expect(timestamp?.innerHTML).toContain(component.pasedEditedDate);
1382+
});
13501383
});

projects/stream-chat-angular/src/lib/message/message.component.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export class MessageComponent
9191
canReceiveReadEvents: boolean | undefined;
9292
canReactToMessage: boolean | undefined;
9393
isActionBoxOpen = false;
94+
isEditedFlagOpened = false;
9495
isReactionSelectorOpen = false;
9596
visibleMessageActionsCount = 0;
9697
messageTextParts: MessagePart[] | undefined = [];
@@ -110,6 +111,7 @@ export class MessageComponent
110111
isReadByMultipleUsers = false;
111112
isMessageDeliveredAndRead = false;
112113
parsedDate = '';
114+
pasedEditedDate = '';
113115
areOptionsVisible = false;
114116
hasAttachment = false;
115117
hasReactions = false;
@@ -194,6 +196,13 @@ export class MessageComponent
194196
this.message.created_at &&
195197
this.dateParser.parseDateTime(this.message.created_at)) ||
196198
'';
199+
this.pasedEditedDate =
200+
(this.message &&
201+
this.message.message_text_updated_at &&
202+
this.dateParser.parseDateTime(
203+
new Date(this.message.message_text_updated_at)
204+
)) ||
205+
'';
197206
this.hasAttachment =
198207
!!this.message?.attachments && !!this.message.attachments.length;
199208
this.hasReactions =
@@ -314,7 +323,7 @@ export class MessageComponent
314323
};
315324
}
316325

317-
unsentMessageClicked() {
326+
messageClicked() {
318327
if (
319328
this.message?.status === 'failed' &&
320329
this.message?.errorStatusCode !== 403
@@ -325,6 +334,8 @@ export class MessageComponent
325334
this.message?.moderation_details
326335
) {
327336
this.openMessageBouncePrompt();
337+
} else {
338+
this.isEditedFlagOpened = !this.isEditedFlagOpened;
328339
}
329340
}
330341

0 commit comments

Comments
 (0)