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 => {