Skip to content

Commit

Permalink
Merge pull request #469 from GetStream/empty-avatar
Browse files Browse the repository at this point in the history
feat: display empty div for not visible avatars
  • Loading branch information
szuperaz authored Sep 15, 2023
2 parents 5fb9916 + 614e2c4 commit b81d55d
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,20 @@
[initialsType]="initialsType"
></stream-avatar>
</ng-template>
<ng-container
*ngTemplateOutlet="
(customTemplatesService.avatarTemplate$ | async) || defaultAvatar;
context: context
"
></ng-container>
<ng-container *ngIf="isVisible; else emptyPlaceholder">
<ng-container
*ngTemplateOutlet="
(customTemplatesService.avatarTemplate$ | async) || defaultAvatar;
context: context
"
></ng-container>
</ng-container>
<ng-template #emptyPlaceholder>
<div
class="str-chat__avatar"
[ngStyle]="{
width: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')',
height: 'calc(var(--str-chat__spacing-px, 1px) * ' + size + ')'
}"
></div>
</ng-template>
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
import { Component, Input, OnChanges } from '@angular/core';
import {
AfterViewInit,
ChangeDetectorRef,
Component,
ElementRef,
Input,
OnChanges,
OnDestroy,
} from '@angular/core';
import { Channel, User } from 'stream-chat';
import { CustomTemplatesService } from '../custom-templates.service';
import {
Expand All @@ -16,7 +24,9 @@ import {
templateUrl: './avatar-placeholder.component.html',
styles: [],
})
export class AvatarPlaceholderComponent implements OnChanges {
export class AvatarPlaceholderComponent
implements OnChanges, AfterViewInit, OnDestroy
{
/**
* An optional name of the image, used for fallback image or image title (if `imageUrl` is provided)
*/
Expand Down Expand Up @@ -61,7 +71,34 @@ export class AvatarPlaceholderComponent implements OnChanges {
type: undefined,
initialsType: undefined,
};
constructor(public customTemplatesService: CustomTemplatesService) {}
isVisible = true;
private mutationObserver?: MutationObserver;
constructor(
public customTemplatesService: CustomTemplatesService,
private hostElement: ElementRef<HTMLElement>,
private cdRef: ChangeDetectorRef
) {}

ngAfterViewInit(): void {
if (this.location !== 'message-sender') {
this.isVisible = true;
this.cdRef.detectChanges();
return;
}
this.checkIfVisible();
const elementToObserve =
this.hostElement.nativeElement.parentElement?.parentElement
?.parentElement;
if (!elementToObserve) {
return;
}
this.mutationObserver = new MutationObserver(() => {
this.checkIfVisible();
});
this.mutationObserver.observe(elementToObserve, {
attributeFilter: ['class'],
});
}

ngOnChanges(): void {
this.context = {
Expand All @@ -75,4 +112,19 @@ export class AvatarPlaceholderComponent implements OnChanges {
initialsType: this.initialsType,
};
}

ngOnDestroy(): void {
this.mutationObserver?.disconnect();
}

private checkIfVisible() {
const isVisible =
getComputedStyle(this.hostElement.nativeElement).getPropertyValue(
'visibility'
) === 'visible';
if (isVisible !== this.isVisible) {
this.isVisible = isVisible;
this.cdRef.detectChanges();
}
}
}

0 comments on commit b81d55d

Please sign in to comment.