Skip to content

Commit d2da498

Browse files
committed
In progress
1 parent 947a087 commit d2da498

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1438
-21
lines changed

package-lock.json

Lines changed: 7 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
@@ -116,7 +116,7 @@
116116
"@ctrl/ngx-emoji-mart": "^8.2.0",
117117
"@floating-ui/dom": "^1.6.3",
118118
"@ngx-translate/core": "^14.0.0",
119-
"@stream-io/stream-chat-css": "5.8.0",
119+
"@stream-io/stream-chat-css": "5.12.0",
120120
"@stream-io/transliterate": "^1.5.2",
121121
"angular-mentions": "1.4.0",
122122
"dayjs": "^1.11.10",

projects/sample-app/src/app/app.component.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,7 @@
5454
<ng-template #emojiPickerTemplate let-emojiInput$="emojiInput$">
5555
<app-emoji-picker [emojiInput$]="emojiInput$"></app-emoji-picker>
5656
</ng-template>
57+
58+
<ng-template #pollTemplate let-pollId="pollId" let-messageId="messageId">
59+
<stream-poll [pollId]="pollId" [messageId]="messageId"> </stream-poll>
60+
</ng-template>

projects/sample-app/src/app/app.component.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ export class AppComponent implements AfterViewInit {
3030
@ViewChild('emojiPickerTemplate')
3131
emojiPickerTemplate!: TemplateRef<EmojiPickerContext>;
3232
@ViewChild('avatar') avatarTemplate!: TemplateRef<AvatarContext>;
33+
@ViewChild('pollTemplate') pollTemplate!: TemplateRef<{
34+
pollId: string;
35+
messageId: string;
36+
}>;
3337
theme$: Observable<string>;
3438
counter = 0;
3539

@@ -59,6 +63,7 @@ export class AppComponent implements AfterViewInit {
5963
: environment.userToken,
6064
{ timeout: 10000 }
6165
);
66+
this.chatService.chatClient.polls.registerSubscriptions();
6267
void this.channelService.init(
6368
environment.channelsFilter || {
6469
type: 'messaging',
@@ -78,6 +83,7 @@ export class AppComponent implements AfterViewInit {
7883
this.customTemplateService.emojiPickerTemplate$.next(
7984
this.emojiPickerTemplate
8085
);
86+
this.customTemplateService.pollTemplate$.next(this.pollTemplate);
8187
}
8288

8389
closeMenu(event: Event) {

projects/sample-app/src/app/app.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
StreamAutocompleteTextareaModule,
99
StreamChatModule,
1010
VoiceRecorderModule,
11+
StreamPollsModule,
1112
} from 'stream-chat-angular';
1213
import { EmojiPickerComponent } from './emoji-picker/emoji-picker.component';
1314
import { PickerModule } from '@ctrl/ngx-emoji-mart';
@@ -20,6 +21,7 @@ import { PickerModule } from '@ctrl/ngx-emoji-mart';
2021
StreamChatModule,
2122
PickerModule,
2223
VoiceRecorderModule,
24+
StreamPollsModule,
2325
StreamAutocompleteTextareaModule,
2426
],
2527
bootstrap: [AppComponent],

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,5 +133,25 @@ export const en = {
133133
'and others': 'and others',
134134
'Message was blocked by moderation policies':
135135
'Message was blocked by moderation policies',
136+
'Vote ended': 'Vote ended',
137+
'Select one': 'Select one',
138+
'Select up to {{count}}': 'Select up to {{count}}',
139+
'Select one or more': 'Select one or more',
140+
'See all options ({{count}})': 'See all options ({{count}})',
141+
'Suggest an option': 'Suggest an option',
142+
'Add a comment': 'Add a comment',
143+
'Update your comment': 'Update your comment',
144+
'View {{count}} comments': 'View {{count}} comments',
145+
'View results': 'View results',
146+
'End vote': 'End vote',
147+
'After a poll is closed, no more votes can be cast':
148+
'After a poll is closed, no more votes can be cast',
149+
'Failed to end vote': 'Failed to end vote',
150+
'Failed to cast vote': 'Failed to cast vote',
151+
Anonymous: 'Anonymous',
152+
'{{ count }} votes': '{{ count }} votes',
153+
'Show all': 'Show all',
154+
'Poll results': 'Poll results',
155+
'Error loading votes': 'Error loading votes',
136156
},
137157
};

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,12 @@ export class CustomTemplatesService {
373373
messageBlockedTemplate$ = new BehaviorSubject<
374374
TemplateRef<MessageBlockedContext> | undefined
375375
>(undefined);
376+
/**
377+
* Template to display polls inside [message component](/chat/docs/sdk/angular/components/MessageComponent/). There is no default template, but the `PollsModule` contains default components.
378+
*/
379+
pollTemplate$ = new BehaviorSubject<
380+
TemplateRef<{ pollId: string; messageId: string }> | undefined
381+
>(undefined);
376382

377383
constructor() {}
378384
}

projects/stream-chat-angular/src/lib/message-actions.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,10 @@ export class MessageActionsService {
184184
* @internal
185185
*/
186186
messageMenuOpenedFor$ = new BehaviorSubject<string | undefined>(undefined);
187+
/**
188+
* @internal
189+
*/
190+
modalOpenedForMessage = new BehaviorSubject<string | undefined>(undefined);
187191
private hasDisplayedClipboardWarning = false;
188192

189193
constructor(

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
<div
168168
class="str-chat__message-bubble str-chat-angular__message-bubble"
169169
[class.str-chat-angular__message-bubble--attachment-modal-open]="
170-
imageAttachmentModalState === 'opened'
170+
nestedModalState === 'opened'
171171
"
172172
data-testid="message-bubble"
173173
[floatUiLoose]="messageMenuFloat"
@@ -190,6 +190,19 @@
190190
></ng-container>
191191
</div>
192192
</ng-container>
193+
<ng-container
194+
*ngIf="
195+
message?.poll_id &&
196+
(customTemplatesService.pollTemplate$ | async)
197+
"
198+
>
199+
<ng-container
200+
*ngTemplateOutlet="
201+
(customTemplatesService.pollTemplate$ | async)!;
202+
context: { pollId: message?.poll_id, messageId: message?.id }
203+
"
204+
></ng-container>
205+
</ng-container>
193206
<div
194207
*ngIf="
195208
message?.text || (message?.quoted_message && hasAttachment)

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

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import {
2828
MessageTextContext,
2929
MessageBlockedContext,
3030
} from '../types';
31-
import { Observable, Subscription, take } from 'rxjs';
31+
import { Observable, pairwise, Subscription, take } from 'rxjs';
3232
import { CustomTemplatesService } from '../custom-templates.service';
3333
import { listUsers } from '../list-users';
3434
import { DateParserService } from '../date-parser.service';
@@ -81,7 +81,7 @@ export class MessageComponent
8181
isEditedFlagOpened = false;
8282
shouldDisplayTranslationNotice = false;
8383
displayedMessageTextContent: 'original' | 'translation' = 'original';
84-
imageAttachmentModalState: 'opened' | 'closed' = 'closed';
84+
nestedModalState: 'opened' | 'closed' = 'closed';
8585
shouldDisplayThreadLink = false;
8686
isSentByCurrentUser = false;
8787
readByText = '';
@@ -189,6 +189,15 @@ export class MessageComponent
189189
}
190190
})
191191
);
192+
this.subscriptions.push(
193+
this.messageActionsService.modalOpenedForMessage.subscribe(
194+
(messageId) => {
195+
if (messageId === this.message?.id) {
196+
this.nestedModalState = 'opened';
197+
}
198+
}
199+
)
200+
);
192201
}
193202

194203
ngOnChanges(changes: SimpleChanges): void {
@@ -300,6 +309,17 @@ export class MessageComponent
300309
}
301310
})
302311
);
312+
this.subscriptions.push(
313+
this.messageActionsService.modalOpenedForMessage
314+
.pipe(pairwise())
315+
.subscribe(([oldId, newId]) => {
316+
if (newId === this.message?.id) {
317+
this.nestedModalState = 'opened';
318+
} else if (oldId === this.message?.id && newId === undefined) {
319+
this.nestedModalState = 'closed';
320+
}
321+
})
322+
);
303323
}
304324

305325
ngOnDestroy(): void {
@@ -373,8 +393,7 @@ export class MessageComponent
373393
messageId: this.message?.id || '',
374394
attachments: this.message?.attachments || [],
375395
parentMessageId: this.message?.parent_id,
376-
imageModalStateChangeHandler: (state) =>
377-
(this.imageAttachmentModalState = state),
396+
imageModalStateChangeHandler: (state) => (this.nestedModalState = state),
378397
};
379398
}
380399

0 commit comments

Comments
 (0)