import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core'; import { faAt, faUserPlus } from "@fortawesome/free-solid-svg-icons"; import { faBell, faEnvelope, faUser, faStar, faBookmark } from "@fortawesome/free-regular-svg-icons"; import { Subscription } from 'rxjs'; import { AccountWrapper } from '../../../models/account.models'; import { UserNotificationService, UserNotification } from '../../../services/user-notification.service'; import { OpenThreadEvent, ToolsService, InstanceInfo } from '../../../services/tools.service'; import { MastodonWrapperService } from '../../../services/mastodon-wrapper.service'; import { Account } from "../../../services/models/mastodon.interfaces"; import { NotificationService } from '../../../services/notification.service'; import { AccountInfo } from '../../../states/accounts.state'; import { BookmarksComponent } from './bookmarks/bookmarks.component'; import { NotificationsComponent } from './notifications/notifications.component'; import { MentionsComponent } from './mentions/mentions.component'; import { DirectMessagesComponent } from './direct-messages/direct-messages.component'; import { FavoritesComponent } from './favorites/favorites.component'; import { BrowseBase } from '../../common/browse-base'; @Component({ selector: 'app-manage-account', templateUrl: './manage-account.component.html', styleUrls: ['./manage-account.component.scss'] }) export class ManageAccountComponent extends BrowseBase { faAt = faAt; faBell = faBell; faEnvelope = faEnvelope; faUser = faUser; faStar = faStar; faUserPlus = faUserPlus; faBookmark = faBookmark; subPanel: 'account' | 'notifications' | 'mentions' | 'dm' | 'favorites' | 'bookmarks' = 'account'; hasNotifications = false; hasMentions = false; isBookmarksAvailable = false; userAccount: Account; @Input('account') set account(acc: AccountWrapper) { this._account = acc; this.checkIfBookmarksAreAvailable(); this.checkNotifications(); this.getUserUrl(acc.info); } get account(): AccountWrapper { return this._account; } private userNotificationServiceSub: Subscription; private _account: AccountWrapper; constructor( private readonly toolsService: ToolsService, private readonly mastodonService: MastodonWrapperService, private readonly notificationService: NotificationService, private readonly userNotificationService: UserNotificationService) { super(); } ngOnInit() { } ngOnDestroy(): void { this.userNotificationServiceSub.unsubscribe(); } private checkIfBookmarksAreAvailable() { this.toolsService.getInstanceInfo(this.account.info) .then((instance: InstanceInfo) => { if (instance.major >= 3 && instance.minor >= 1) { this.isBookmarksAvailable = true; } else { this.isBookmarksAvailable = false; } }) .catch(err => { this.isBookmarksAvailable = false; }); } private getUserUrl(account: AccountInfo) { this.mastodonService.retrieveAccountDetails(this.account.info) .then((acc: Account) => { this.userAccount = acc; }) .catch(err => { this.notificationService.notifyHttpError(err, this.account.info); }); } private checkNotifications() { if (this.userNotificationServiceSub) { this.userNotificationServiceSub.unsubscribe(); } this.userNotificationServiceSub = this.userNotificationService.userNotifications.subscribe((userNotifications: UserNotification[]) => { const userNotification = userNotifications.find(x => x.account.id === this.account.info.id); if (userNotification) { let settings = this.toolsService.getSettings(); let accSettings = this.toolsService.getAccountSettings(this.account.info); if (!settings.disableAvatarNotifications && !accSettings.disableAvatarNotifications) { this.hasNotifications = userNotification.hasNewNotifications; this.hasMentions = userNotification.hasNewMentions; } } }); let current = this.userNotificationService.userNotifications.value; const userNotification = current.find(x => x.account.id === this.account.info.id); if (userNotification) { let settings = this.toolsService.getSettings(); let accSettings = this.toolsService.getAccountSettings(this.account.info); if (!settings.disableAutofocus && !settings.disableAvatarNotifications && !accSettings.disableAvatarNotifications) { if (userNotification.hasNewNotifications) { this.loadSubPanel('notifications'); } else if (userNotification.hasNewMentions) { this.loadSubPanel('mentions'); } } } } @ViewChild('bookmarks') bookmarksComp:BookmarksComponent; @ViewChild('notifications') notificationsComp:NotificationsComponent; @ViewChild('mentions') mentionsComp:MentionsComponent; @ViewChild('dm') dmComp:DirectMessagesComponent; @ViewChild('favorites') favoritesComp:FavoritesComponent; loadSubPanel(subpanel: 'account' | 'notifications' | 'mentions' | 'dm' | 'favorites' | 'bookmarks'): boolean { if(this.subPanel === subpanel){ switch(subpanel){ case 'bookmarks': this.bookmarksComp.applyGoToTop(); break; case 'notifications': this.notificationsComp.applyGoToTop(); break; case 'mentions': this.mentionsComp.applyGoToTop(); break; case 'dm': this.dmComp.applyGoToTop(); break; case 'favorites': this.favoritesComp.applyGoToTop(); break; } } this.subPanel = subpanel; return false; } browseLocalAccount(): boolean { var accountName = `@${this.account.info.username}@${this.account.info.instance}`; this.browseAccountEvent.next(accountName); return false; } openLocalAccount(): boolean { window.open(this.userAccount.url, '_blank'); return false; } }