-import { Component, OnDestroy, OnInit } from '@angular/core'
-import { ActivatedRoute, Router } from '@angular/router'
-import { AuthService, LocalStorageService, Notifier, ScopedTokensService, ScreenService, ServerService, UserService } from '@app/core'
+
+import { firstValueFrom } from 'rxjs'
+import { switchMap, tap } from 'rxjs/operators'
+import { Component } from '@angular/core'
+import { AuthService, ComponentPaginationLight, DisableForReuseHook, ScopedTokensService } from '@app/core'
import { HooksService } from '@app/core/plugins/hooks.service'
-import { immutableAssign } from '@app/helpers'
import { VideoService } from '@app/shared/shared-main'
import { UserSubscriptionService } from '@app/shared/shared-user-subscription'
-import { AbstractVideoList, OwnerDisplayType } from '@app/shared/shared-video-miniature'
-import { VideoSortField, FeedFormat } from '@shared/models'
-import { copyToClipboard } from '../../../root-helpers/utils'
-import { environment } from '../../../environments/environment'
-import { forkJoin } from 'rxjs'
+import { VideoFilters } from '@app/shared/shared-video-miniature'
+import { VideoSortField } from '@shared/models'
@Component({
selector: 'my-videos-user-subscriptions',
- styleUrls: [ '../../shared/shared-video-miniature/abstract-video-list.scss' ],
- templateUrl: '../../shared/shared-video-miniature/abstract-video-list.html'
+ templateUrl: './video-user-subscriptions.component.html'
})
-export class VideoUserSubscriptionsComponent extends AbstractVideoList implements OnInit, OnDestroy {
- titlePage: string
- sort = '-publishedAt' as VideoSortField
- ownerDisplayType: OwnerDisplayType = 'auto'
- groupByDate = true
-
- constructor (
- protected router: Router,
- protected serverService: ServerService,
- protected route: ActivatedRoute,
- protected notifier: Notifier,
- protected authService: AuthService,
- protected userService: UserService,
- protected screenService: ScreenService,
- protected storageService: LocalStorageService,
- private userSubscription: UserSubscriptionService,
- private hooks: HooksService,
- private videoService: VideoService,
- private scopedTokensService: ScopedTokensService
- ) {
- super()
+export class VideoUserSubscriptionsComponent implements DisableForReuseHook {
+ getVideosObservableFunction = this.getVideosObservable.bind(this)
+ getSyndicationItemsFunction = this.getSyndicationItems.bind(this)
- this.titlePage = $localize`Videos from your subscriptions`
+ defaultSort = '-publishedAt' as VideoSortField
- this.actions.push({
+ actions = [
+ {
routerLink: '/my-library/subscriptions',
label: $localize`Subscriptions`,
- iconName: 'cog'
- })
- }
+ iconName: 'cog' as 'cog'
+ }
+ ]
- ngOnInit () {
- super.ngOnInit()
+ titlePage = $localize`Videos from your subscriptions`
- const user = this.authService.getUser()
- let feedUrl = environment.originServerUrl
+ disabled = false
- this.scopedTokensService.getScopedTokens().subscribe(
- tokens => {
- const feeds = this.videoService.getVideoSubscriptionFeedUrls(user.account.id, tokens.feedToken)
- feedUrl = feedUrl + feeds.find((f: any) => f.format === FeedFormat.RSS).url
- },
+ private feedToken: string
- err => {
- this.notifier.error(err.message)
- }
- )
-
- this.actions.unshift({
- label: $localize`Feed`,
- iconName: 'syndication',
- justIcon: true,
- click: () => {
- copyToClipboard(feedUrl)
- this.activateCopiedMessage()
- }
- })
- }
+ constructor (
+ private authService: AuthService,
+ private userSubscription: UserSubscriptionService,
+ private hooks: HooksService,
+ private videoService: VideoService,
+ private scopedTokensService: ScopedTokensService
+ ) {
- ngOnDestroy () {
- super.ngOnDestroy()
}
- getVideosObservable (page: number) {
- const newPagination = immutableAssign(this.pagination, { currentPage: page })
+ getVideosObservable (pagination: ComponentPaginationLight, filters: VideoFilters) {
const params = {
- videoPagination: newPagination,
- sort: this.sort,
+ ...filters.toVideosAPIObject(),
+
+ videoPagination: pagination,
skipCount: true
}
)
}
- generateSyndicationList () {
- // not implemented yet
+ getSyndicationItems () {
+ return this.loadFeedToken()
+ .then(() => {
+ const user = this.authService.getUser()
+
+ return this.videoService.getVideoSubscriptionFeedUrls(user.account.id, this.feedToken)
+ })
}
- activateCopiedMessage () {
- this.notifier.success($localize`Feed URL copied`)
+ disableForReuse () {
+ this.disabled = true
+ }
+
+ enabledForReuse () {
+ this.disabled = false
+ }
+
+ private loadFeedToken () {
+ if (this.feedToken) return Promise.resolve(this.feedToken)
+
+ const obs = this.authService.userInformationLoaded
+ .pipe(
+ switchMap(() => this.scopedTokensService.getScopedTokens()),
+ tap(tokens => this.feedToken = tokens.feedToken)
+ )
+
+ return firstValueFrom(obs)
}
}