Add list of instance follows in about page

This commit is contained in:
Chocobozzz 2019-06-06 11:39:22 +02:00
parent 776ca9b1cc
commit a6dbbf0386
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
15 changed files with 165 additions and 13 deletions

View File

@ -0,0 +1,22 @@
<div class="row" myInfiniteScroller [autoInit]="true" (nearOfBottom)="onNearOfBottom()">
<div class="col-xl-6 col-md-12">
<div i18n class="subtitle">Followers</div>
<div i18n class="no-results" *ngIf="followersPagination.totalItems === 0">This instance does not have followers.</div>
<a *ngFor="let follower of followers" [href]="buildLink(follower)" target="_blank" rel="noopener noreferrer">
{{ follower }}
</a>
</div>
<div class="col-xl-6 col-md-12">
<div i18n class="subtitle">Followings</div>
<div i18n class="no-results" *ngIf="followingsPagination.totalItems === 0">This instance does not have followings.</div>
<a *ngFor="let following of followings" [href]="buildLink(following)" target="_blank" rel="noopener noreferrer">
{{ following }}
</a>
</div>
</div>

View File

@ -0,0 +1,14 @@
@import '_variables';
@import '_mixins';
.subtitle {
font-size: 18px;
font-weight: $font-semibold;
margin-bottom: 20px;
}
a {
display: block;
width: fit-content;
margin-top: 3px;
}

View File

@ -0,0 +1,103 @@
import { Component, OnInit } from '@angular/core'
import { FollowService } from '@app/shared/instance/follow.service'
import { ComponentPagination, hasMoreItems } from '@app/shared/rest/component-pagination.model'
import { Notifier } from '@app/core'
import { RestService } from '@app/shared'
import { SortMeta } from 'primeng/api'
@Component({
selector: 'my-about-follows',
templateUrl: './about-follows.component.html',
styleUrls: [ './about-follows.component.scss' ]
})
export class AboutFollowsComponent implements OnInit {
followers: string[] = []
followings: string[] = []
followersPagination: ComponentPagination = {
currentPage: 1,
itemsPerPage: 40,
totalItems: null
}
followingsPagination: ComponentPagination = {
currentPage: 1,
itemsPerPage: 40,
totalItems: null
}
sort: SortMeta = {
field: 'createdAt',
order: -1
}
constructor (
private restService: RestService,
private notifier: Notifier,
private followService: FollowService
) { }
ngOnInit () {
this.loadMoreFollowers()
this.loadMoreFollowings()
}
onNearOfBottom () {
this.onNearOfFollowersBottom()
this.onNearOfFollowingsBottom()
}
onNearOfFollowersBottom () {
if (!hasMoreItems(this.followersPagination)) return
this.followersPagination.currentPage += 1
this.loadMoreFollowers()
}
onNearOfFollowingsBottom () {
if (!hasMoreItems(this.followingsPagination)) return
this.followingsPagination.currentPage += 1
this.loadMoreFollowings()
}
buildLink (host: string) {
return window.location.protocol + '//' + host
}
private loadMoreFollowers () {
const pagination = this.restService.componentPaginationToRestPagination(this.followersPagination)
this.followService.getFollowers(pagination, this.sort)
.subscribe(
resultList => {
const newFollowers = resultList.data.map(r => r.follower.host)
this.followers = this.followers.concat(newFollowers)
this.followersPagination.totalItems = resultList.total
},
err => this.notifier.error(err.message)
)
}
private loadMoreFollowings () {
const pagination = this.restService.componentPaginationToRestPagination(this.followingsPagination)
this.followService.getFollowing(pagination, this.sort)
.subscribe(
resultList => {
const newFollowings = resultList.data.map(r => r.following.host)
this.followings = this.followings.concat(newFollowings)
this.followingsPagination.totalItems = resultList.total
},
err => this.notifier.error(err.message)
)
}
}

View File

@ -4,6 +4,7 @@ import { MetaGuard } from '@ngx-meta/core'
import { AboutComponent } from './about.component' import { AboutComponent } from './about.component'
import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component' import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component'
import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component' import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component'
import { AboutFollowsComponent } from '@app/+about/about-follows/about-follows.component'
const aboutRoutes: Routes = [ const aboutRoutes: Routes = [
{ {
@ -33,6 +34,15 @@ const aboutRoutes: Routes = [
title: 'About PeerTube' title: 'About PeerTube'
} }
} }
},
{
path: 'follows',
component: AboutFollowsComponent,
data: {
meta: {
title: 'About follows'
}
}
} }
] ]
} }

View File

@ -5,10 +5,12 @@
<a i18n routerLink="instance" routerLinkActive="active" class="title-page">Instance</a> <a i18n routerLink="instance" routerLinkActive="active" class="title-page">Instance</a>
<a i18n routerLink="peertube" routerLinkActive="active" class="title-page">PeerTube</a> <a i18n routerLink="peertube" routerLinkActive="active" class="title-page">PeerTube</a>
<a i18n routerLink="follows" routerLinkActive="active" class="title-page">Follows</a>
</div> </div>
</div> </div>
<div class="margin-content"> <div class="margin-content">
<router-outlet></router-outlet> <router-outlet></router-outlet>
</div> </div>
</div> </div>

View File

@ -6,6 +6,7 @@ import { SharedModule } from '../shared'
import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component' import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component'
import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component' import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component'
import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component' import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
import { AboutFollowsComponent } from '@app/+about/about-follows/about-follows.component'
@NgModule({ @NgModule({
imports: [ imports: [
@ -17,6 +18,7 @@ import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-a
AboutComponent, AboutComponent,
AboutInstanceComponent, AboutInstanceComponent,
AboutPeertubeComponent, AboutPeertubeComponent,
AboutFollowsComponent,
ContactAdminModalComponent ContactAdminModalComponent
], ],

View File

@ -5,7 +5,7 @@ import { TableModule } from 'primeng/table'
import { SharedModule } from '../shared' import { SharedModule } from '../shared'
import { AdminRoutingModule } from './admin-routing.module' import { AdminRoutingModule } from './admin-routing.module'
import { AdminComponent } from './admin.component' import { AdminComponent } from './admin.component'
import { FollowersListComponent, FollowingAddComponent, FollowsComponent, FollowService } from './follows' import { FollowersListComponent, FollowingAddComponent, FollowsComponent } from './follows'
import { FollowingListComponent } from './follows/following-list/following-list.component' import { FollowingListComponent } from './follows/following-list/following-list.component'
import { UserCreateComponent, UserListComponent, UserPasswordComponent, UsersComponent, UserUpdateComponent } from './users' import { UserCreateComponent, UserListComponent, UserPasswordComponent, UsersComponent, UserUpdateComponent } from './users'
import { import {
@ -66,7 +66,6 @@ import { DebugComponent, DebugService } from '@app/+admin/system/debug'
], ],
providers: [ providers: [
FollowService,
RedundancyService, RedundancyService,
JobService, JobService,
LogsService, LogsService,

View File

@ -3,7 +3,7 @@ import { ConfirmService, Notifier } from '@app/core'
import { SortMeta } from 'primeng/primeng' import { SortMeta } from 'primeng/primeng'
import { ActorFollow } from '../../../../../../shared/models/actors/follow.model' import { ActorFollow } from '../../../../../../shared/models/actors/follow.model'
import { RestPagination, RestTable } from '../../../shared' import { RestPagination, RestTable } from '../../../shared'
import { FollowService } from '../shared' import { FollowService } from '@app/shared/instance/follow.service'
import { I18n } from '@ngx-translate/i18n-polyfill' import { I18n } from '@ngx-translate/i18n-polyfill'
@Component({ @Component({

View File

@ -3,7 +3,7 @@ import { Router } from '@angular/router'
import { Notifier } from '@app/core' import { Notifier } from '@app/core'
import { ConfirmService } from '../../../core' import { ConfirmService } from '../../../core'
import { validateHost } from '../../../shared' import { validateHost } from '../../../shared'
import { FollowService } from '../shared' import { FollowService } from '@app/shared/instance/follow.service'
import { I18n } from '@ngx-translate/i18n-polyfill' import { I18n } from '@ngx-translate/i18n-polyfill'
@Component({ @Component({

View File

@ -4,7 +4,7 @@ import { SortMeta } from 'primeng/primeng'
import { ActorFollow } from '../../../../../../shared/models/actors/follow.model' import { ActorFollow } from '../../../../../../shared/models/actors/follow.model'
import { ConfirmService } from '../../../core/confirm/confirm.service' import { ConfirmService } from '../../../core/confirm/confirm.service'
import { RestPagination, RestTable } from '../../../shared' import { RestPagination, RestTable } from '../../../shared'
import { FollowService } from '../shared' import { FollowService } from '@app/shared/instance/follow.service'
import { I18n } from '@ngx-translate/i18n-polyfill' import { I18n } from '@ngx-translate/i18n-polyfill'
@Component({ @Component({

View File

@ -1,6 +1,5 @@
export * from './following-add' export * from './following-add'
export * from './followers-list' export * from './followers-list'
export * from './following-list' export * from './following-list'
export * from './shared'
export * from './follows.component' export * from './follows.component'
export * from './follows.routes' export * from './follows.routes'

View File

@ -1 +0,0 @@
export * from './follow.service'

View File

@ -3,13 +3,13 @@ import { HttpClient, HttpParams } from '@angular/common/http'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { SortMeta } from 'primeng/primeng' import { SortMeta } from 'primeng/primeng'
import { Observable } from 'rxjs' import { Observable } from 'rxjs'
import { ActorFollow, ResultList } from '../../../../../../shared' import { ActorFollow, ResultList } from '@shared/index'
import { environment } from '../../../../environments/environment' import { environment } from '../../../environments/environment'
import { RestExtractor, RestPagination, RestService } from '../../../shared' import { RestExtractor, RestPagination, RestService } from '../rest'
@Injectable() @Injectable()
export class FollowService { export class FollowService {
private static BASE_APPLICATION_URL = environment.apiUrl + '/api/v1/server' private static BASE_APPLICATION_URL = 'https://peertube2.cpy.re' + '/api/v1/server'
constructor ( constructor (
private authHttp: HttpClient, private authHttp: HttpClient,

View File

@ -85,6 +85,7 @@ import { VideoBlacklistComponent } from '@app/shared/video/modals/video-blacklis
import { VideoDownloadComponent } from '@app/shared/video/modals/video-download.component' import { VideoDownloadComponent } from '@app/shared/video/modals/video-download.component'
import { VideoReportComponent } from '@app/shared/video/modals/video-report.component' import { VideoReportComponent } from '@app/shared/video/modals/video-report.component'
import { ClipboardModule } from 'ngx-clipboard' import { ClipboardModule } from 'ngx-clipboard'
import { FollowService } from '@app/shared/instance/follow.service'
@NgModule({ @NgModule({
imports: [ imports: [
@ -271,6 +272,8 @@ import { ClipboardModule } from 'ngx-clipboard'
UserNotificationService, UserNotificationService,
FollowService,
I18n I18n
] ]
}) })

View File

@ -27,7 +27,6 @@
{{ getCurrentGroupedDateLabel(video) }} {{ getCurrentGroupedDateLabel(video) }}
</div> </div>
<my-video-miniature <my-video-miniature
[video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType" [video]="video" [user]="user" [ownerDisplayType]="ownerDisplayType"
[displayVideoActions]="displayVideoActions" [displayOptions]="displayOptions" [displayVideoActions]="displayVideoActions" [displayOptions]="displayOptions"