diff --git a/src/app/components/floating-column/manage-account/notifications/notification/notification.component.html b/src/app/components/floating-column/manage-account/notifications/notification/notification.component.html
index 59bc569c..7856a4f3 100644
--- a/src/app/components/floating-column/manage-account/notifications/notification/notification.component.html
+++ b/src/app/components/floating-column/manage-account/notifications/notification/notification.component.html
@@ -70,17 +70,29 @@
+ [statusWrapper]="notification.status"
+ [notificationAccount]="notification.account"
+ [notificationType]="notification.type"
+ [context]="'notifications'"
+ (browseAccountEvent)="browseAccount($event)"
+ (browseHashtagEvent)="browseHashtag($event)"
+ (browseThreadEvent)="browseThread($event)">
+ [statusWrapper]="notification.status"
+ [context]="'notifications'"
+ (browseAccountEvent)="browseAccount($event)"
+ (browseHashtagEvent)="browseHashtag($event)"
+ (browseThreadEvent)="browseThread($event)">
+ class="stream__status"
+ [statusWrapper]="notification.status"
+ [notificationAccount]="notification.account"
+ [notificationType]="notification.type"
+ [context]="'notifications'"
+ (browseAccountEvent)="browseAccount($event)"
+ (browseHashtagEvent)="browseHashtag($event)"
+ (browseThreadEvent)="browseThread($event)">
\ No newline at end of file
diff --git a/src/app/components/stream/status/status.component.ts b/src/app/components/stream/status/status.component.ts
index 11d4ee0c..9b670451 100644
--- a/src/app/components/stream/status/status.component.ts
+++ b/src/app/components/stream/status/status.component.ts
@@ -59,6 +59,8 @@ export class StatusComponent implements OnInit {
@Input() notificationType: 'mention' | 'reblog' | 'favourite' | 'poll' | 'update';
@Input() notificationAccount: Account;
+ @Input() context: 'home' | 'notifications' | 'public' | 'thread' | 'account';
+
private _statusWrapper: StatusWrapper;
status: Status;
@@ -98,6 +100,8 @@ export class StatusComponent implements OnInit {
// this.statusAccountName = this.emojiConverter.applyEmojis(this.displayedStatus.account.emojis, this.displayedStatus.account.display_name, EmojiTypeEnum.small);
let statusContent = this.emojiConverter.applyEmojis(this.displayedStatus.emojis, this.displayedStatus.content, EmojiTypeEnum.medium);
this.statusContent = this.ensureMentionAreDisplayed(statusContent);
+
+ this.validateFilteringStatus();
}
get statusWrapper(): StatusWrapper {
return this._statusWrapper;
@@ -123,6 +127,36 @@ export class StatusComponent implements OnInit {
if (this.statusesStateServiceSub) this.statusesStateServiceSub.unsubscribe();
}
+ private validateFilteringStatus(){
+ const filterStatus = this.displayedStatus.filtered;
+
+ if(!filterStatus || filterStatus.length === 0) return;
+
+ // if(!this.context){
+ // console.warn('this.context not found');
+ // console.warn(this.context);
+ // }
+
+ for (let filter of filterStatus) {
+ if(this.context && filter.filter.context && filter.filter.context.length > 0){
+ if(!filter.filter.context.includes(this.context)) continue;
+ }
+
+ if(filter.filter.filter_action === 'warn'){
+ this.isContentWarned = true;
+
+ let filterTxt = `FILTERED:`;
+ for(let w of filter.keyword_matches){
+ filterTxt += ` ${w}`;
+ }
+
+ this.contentWarningText = filterTxt;
+ } else if (filter.filter.filter_action === 'hide'){
+ this.hideStatus = true;
+ }
+ }
+ }
+
getAvatar(acc: Account): string {
if(this.freezeAvatarEnabled){
return acc.avatar_static;
diff --git a/src/app/components/stream/stream-notifications/stream-notifications.component.ts b/src/app/components/stream/stream-notifications/stream-notifications.component.ts
index c79b4ed2..d21186f7 100644
--- a/src/app/components/stream/stream-notifications/stream-notifications.component.ts
+++ b/src/app/components/stream/stream-notifications/stream-notifications.component.ts
@@ -122,7 +122,7 @@ export class StreamNotificationsComponent extends BrowseBase {
loadNotifications(): any {
this.account = this.toolsService.getAccountById(this.streamElement.accountId);
- this.mentionsSubscription = this.userNotificationService.userNotifications.subscribe((userNotifications: UserNotification[]) => {
+ this.mentionsSubscription = this.userNotificationService.userNotifications.subscribe((userNotifications: UserNotification[]) => {
this.loadMentions(userNotifications);
});
@@ -130,10 +130,13 @@ export class StreamNotificationsComponent extends BrowseBase {
.then((notifications: Notification[]) => {
this.isNotificationsLoading = false;
- this.notifications = notifications.map(x => {
+ let wrappedNotification= notifications.map(x => {
let cwPolicy = this.toolsService.checkContentWarning(x.status);
return new NotificationWrapper(x, this.account, cwPolicy.applyCw, cwPolicy.hide);
});
+
+ this.notifications = wrappedNotification.filter(x => x.type !== 'mention' || (x.type === 'mention' && x.status.status !== null));
+
this.lastNotificationId = this.notifications[this.notifications.length - 1].notification.id;
})
.catch(err => {
diff --git a/src/app/components/stream/stream-statuses/stream-statuses.component.html b/src/app/components/stream/stream-statuses/stream-statuses.component.html
index f839daf8..774b19e0 100644
--- a/src/app/components/stream/stream-statuses/stream-statuses.component.html
+++ b/src/app/components/stream/stream-statuses/stream-statuses.component.html
@@ -17,8 +17,11 @@
diff --git a/src/app/components/stream/stream-statuses/stream-statuses.component.ts b/src/app/components/stream/stream-statuses/stream-statuses.component.ts
index 129dc1ce..6febdabb 100644
--- a/src/app/components/stream/stream-statuses/stream-statuses.component.ts
+++ b/src/app/components/stream/stream-statuses/stream-statuses.component.ts
@@ -3,7 +3,7 @@ import { HttpErrorResponse } from '@angular/common/http';
import { Observable, Subscription } from 'rxjs';
import { Store } from '@ngxs/store';
-import { StreamElement } from '../../../states/streams.state';
+import { StreamElement, StreamTypeEnum } from '../../../states/streams.state';
import { AccountInfo } from '../../../states/accounts.state';
import { StreamingService, EventEnum, StatusUpdate } from '../../../services/streaming.service';
import { Status } from '../../../services/models/mastodon.interfaces';
@@ -20,9 +20,11 @@ import { SettingsService } from '../../../services/settings.service';
templateUrl: './stream-statuses.component.html',
styleUrls: ['./stream-statuses.component.scss']
})
-export class StreamStatusesComponent extends TimelineBase {
+export class StreamStatusesComponent extends TimelineBase {
protected _streamElement: StreamElement;
+ context: 'home' | 'notifications' | 'public' | 'thread' | 'account';
+
@Input()
set streamElement(streamElement: StreamElement) {
this._streamElement = streamElement;
@@ -32,6 +34,8 @@ export class StreamStatusesComponent extends TimelineBase {
this.hideReplies = streamElement.hideReplies;
this.load(this._streamElement);
+
+ this.setContext(this._streamElement);
}
get streamElement(): StreamElement {
return this._streamElement;
@@ -112,6 +116,24 @@ export class StreamStatusesComponent extends TimelineBase {
if (this.deleteStatusSubscription) this.deleteStatusSubscription.unsubscribe();
}
+ private setContext(streamElement: StreamElement) {
+ switch(streamElement.type){
+ case StreamTypeEnum.global:
+ case StreamTypeEnum.local:
+ case StreamTypeEnum.tag:
+ this.context = 'public';
+ break;
+ case StreamTypeEnum.personnal:
+ case StreamTypeEnum.list:
+ this.context = 'home';
+ break;
+ case StreamTypeEnum.activity:
+ case StreamTypeEnum.directmessages:
+ this.context = 'notifications';
+ break;
+ }
+ }
+
refresh(): any {
this.load(this._streamElement);
}
diff --git a/src/app/components/stream/thread/thread.component.ts b/src/app/components/stream/thread/thread.component.ts
index 076416fb..7a6a98bc 100644
--- a/src/app/components/stream/thread/thread.component.ts
+++ b/src/app/components/stream/thread/thread.component.ts
@@ -28,6 +28,8 @@ export class ThreadComponent extends BrowseBase {
hasContentWarnings = false;
private remoteStatusFetchingDisabled = false;
+ context = 'thread';
+
numNewItems: number; //html compatibility only
bufferStream: Status[] = []; //html compatibility only
streamPositionnedAtTop: boolean = true; //html compatibility only
diff --git a/src/app/components/stream/user-profile/user-profile.component.html b/src/app/components/stream/user-profile/user-profile.component.html
index c6111381..4edc7df3 100644
--- a/src/app/components/stream/user-profile/user-profile.component.html
+++ b/src/app/components/stream/user-profile/user-profile.component.html
@@ -196,16 +196,24 @@
diff --git a/src/app/services/models/mastodon.interfaces.ts b/src/app/services/models/mastodon.interfaces.ts
index 822a397e..860bf6a4 100644
--- a/src/app/services/models/mastodon.interfaces.ts
+++ b/src/app/services/models/mastodon.interfaces.ts
@@ -194,6 +194,33 @@ export interface Results {
hashtags: string[];
}
+export interface FilterKeyword {
+ id: string;
+ keyword: string;
+ whole_word: boolean;
+}
+
+export interface FilterStatus {
+ id: string;
+ status_id: string;
+}
+
+export interface Filter {
+ id: string;
+ title: string;
+ context: string[]; //home notifications public thread account
+ expires_at: string;
+ filter_action: string; //warn hide
+ keywords: FilterKeyword[];
+ statuses: FilterStatus[];
+}
+
+export interface FilterResult {
+ filter: Filter;
+ keyword_matches: string[];
+ status_matches: string[];
+}
+
export interface Status {
id: string;
uri: string;
@@ -224,6 +251,7 @@ export interface Status {
bookmarked: boolean;
card: Card;
poll: Poll;
+ filtered: FilterResult[];
pleroma: PleromaStatusInfo;
}
diff --git a/src/app/services/user-notification.service.ts b/src/app/services/user-notification.service.ts
index 6ca0fb9d..9f7701cf 100644
--- a/src/app/services/user-notification.service.ts
+++ b/src/app/services/user-notification.service.ts
@@ -60,6 +60,8 @@ export class UserNotificationService {
private startFetchingNotifications(account: AccountInfo) {
let getMentionsPromise = this.mastodonService.getNotifications(account, ['favourite', 'follow', 'reblog', 'poll', 'follow_request', 'move', 'update'], null, null, 10)
.then((notifications: Notification[]) => {
+ notifications = notifications.filter(x => x.status !== null);
+
this.processMentionsAndNotifications(account, notifications, NotificationTypeEnum.UserMention);
})
.catch(err => {