Add support button in channel page
This commit is contained in:
parent
900f782081
commit
100d9ce23b
|
@ -7,6 +7,11 @@
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<my-subscribe-button *ngIf="!isManageable()" #subscribeButton [videoChannels]="[videoChannel]"></my-subscribe-button>
|
<my-subscribe-button *ngIf="!isManageable()" #subscribeButton [videoChannels]="[videoChannel]"></my-subscribe-button>
|
||||||
|
|
||||||
|
<button *ngIf="videoChannel.support" (click)="showSupportModal()" class="support-button peertube-button orange-button-inverted">
|
||||||
|
<my-global-icon iconName="support" aria-hidden="true"></my-global-icon>
|
||||||
|
<span class="icon-text" i18n>Support</span>
|
||||||
|
</button>
|
||||||
</ng-template>
|
</ng-template>
|
||||||
|
|
||||||
<ng-template #ownerTemplate>
|
<ng-template #ownerTemplate>
|
||||||
|
@ -112,3 +117,5 @@
|
||||||
|
|
||||||
<router-outlet></router-outlet>
|
<router-outlet></router-outlet>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<my-support-modal #supportModal [videoChannel]="videoChannel"></my-support-modal>
|
||||||
|
|
|
@ -36,6 +36,10 @@
|
||||||
@include avatar-row-responsive(var(--myChannelImgMargin), var(--myGreyChannelFontSize));
|
@include avatar-row-responsive(var(--myChannelImgMargin), var(--myGreyChannelFontSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.support-button {
|
||||||
|
@include button-with-icon(21px, 0, -1px);
|
||||||
|
}
|
||||||
|
|
||||||
.channel-description {
|
.channel-description {
|
||||||
grid-column: 1;
|
grid-column: 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core'
|
||||||
import { ActivatedRoute } from '@angular/router'
|
import { ActivatedRoute } from '@angular/router'
|
||||||
import { AuthService, MarkdownService, Notifier, RestExtractor, ScreenService } from '@app/core'
|
import { AuthService, MarkdownService, Notifier, RestExtractor, ScreenService } from '@app/core'
|
||||||
import { ListOverflowItem, VideoChannel, VideoChannelService, VideoService } from '@app/shared/shared-main'
|
import { ListOverflowItem, VideoChannel, VideoChannelService, VideoService } from '@app/shared/shared-main'
|
||||||
|
import { SupportModalComponent } from '@app/shared/shared-support-modal'
|
||||||
import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription'
|
import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription'
|
||||||
import { HttpStatusCode } from '@shared/core-utils/miscs/http-error-codes'
|
import { HttpStatusCode } from '@shared/core-utils/miscs/http-error-codes'
|
||||||
|
|
||||||
|
@ -14,6 +15,7 @@ import { HttpStatusCode } from '@shared/core-utils/miscs/http-error-codes'
|
||||||
})
|
})
|
||||||
export class VideoChannelsComponent implements OnInit, OnDestroy {
|
export class VideoChannelsComponent implements OnInit, OnDestroy {
|
||||||
@ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
|
@ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
|
||||||
|
@ViewChild('supportModal') supportModal: SupportModalComponent
|
||||||
|
|
||||||
videoChannel: VideoChannel
|
videoChannel: VideoChannel
|
||||||
hotkeys: Hotkey[]
|
hotkeys: Hotkey[]
|
||||||
|
@ -101,6 +103,10 @@ export class VideoChannelsComponent implements OnInit, OnDestroy {
|
||||||
this.notifier.success($localize`Username copied`)
|
this.notifier.success($localize`Username copied`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showSupportModal () {
|
||||||
|
this.supportModal.show()
|
||||||
|
}
|
||||||
|
|
||||||
private loadChannelVideosCount () {
|
private loadChannelVideosCount () {
|
||||||
this.videoService.getVideoChannelVideos({
|
this.videoService.getVideoChannelVideos({
|
||||||
videoChannel: this.videoChannel,
|
videoChannel: this.videoChannel,
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { NgModule } from '@angular/core'
|
||||||
import { SharedFormModule } from '@app/shared/shared-forms'
|
import { SharedFormModule } from '@app/shared/shared-forms'
|
||||||
import { SharedGlobalIconModule } from '@app/shared/shared-icons'
|
import { SharedGlobalIconModule } from '@app/shared/shared-icons'
|
||||||
import { SharedMainModule } from '@app/shared/shared-main'
|
import { SharedMainModule } from '@app/shared/shared-main'
|
||||||
|
import { SharedSupportModal } from '@app/shared/shared-support-modal'
|
||||||
import { SharedUserSubscriptionModule } from '@app/shared/shared-user-subscription'
|
import { SharedUserSubscriptionModule } from '@app/shared/shared-user-subscription'
|
||||||
import { SharedVideoMiniatureModule } from '@app/shared/shared-video-miniature'
|
import { SharedVideoMiniatureModule } from '@app/shared/shared-video-miniature'
|
||||||
import { SharedVideoPlaylistModule } from '@app/shared/shared-video-playlist'
|
import { SharedVideoPlaylistModule } from '@app/shared/shared-video-playlist'
|
||||||
|
@ -19,7 +20,8 @@ import { VideoChannelsComponent } from './video-channels.component'
|
||||||
SharedVideoPlaylistModule,
|
SharedVideoPlaylistModule,
|
||||||
SharedVideoMiniatureModule,
|
SharedVideoMiniatureModule,
|
||||||
SharedUserSubscriptionModule,
|
SharedUserSubscriptionModule,
|
||||||
SharedGlobalIconModule
|
SharedGlobalIconModule,
|
||||||
|
SharedSupportModal
|
||||||
],
|
],
|
||||||
|
|
||||||
declarations: [
|
declarations: [
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
import { Component, Input, ViewChild } from '@angular/core'
|
|
||||||
import { MarkdownService } from '@app/core'
|
|
||||||
import { VideoDetails } from '@app/shared/shared-main'
|
|
||||||
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'my-video-support',
|
|
||||||
templateUrl: './video-support.component.html',
|
|
||||||
styleUrls: [ './video-support.component.scss' ]
|
|
||||||
})
|
|
||||||
export class VideoSupportComponent {
|
|
||||||
@Input() video: VideoDetails = null
|
|
||||||
|
|
||||||
@ViewChild('modal', { static: true }) modal: NgbModal
|
|
||||||
|
|
||||||
videoHTMLSupport = ''
|
|
||||||
|
|
||||||
constructor (
|
|
||||||
private markdownService: MarkdownService,
|
|
||||||
private modalService: NgbModal
|
|
||||||
) { }
|
|
||||||
|
|
||||||
show () {
|
|
||||||
const modalRef = this.modalService.open(this.modal, { centered: true })
|
|
||||||
|
|
||||||
this.markdownService.enhancedMarkdownToHTML(this.video.support)
|
|
||||||
.then(r => this.videoHTMLSupport = r)
|
|
||||||
|
|
||||||
return modalRef
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -313,6 +313,6 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ng-container *ngIf="video !== null">
|
<ng-container *ngIf="video !== null">
|
||||||
<my-video-support #videoSupportModal [video]="video"></my-video-support>
|
<my-support-modal #supportModal [video]="video"></my-support-modal>
|
||||||
<my-video-share #videoShareModal [video]="video" [videoCaptions]="videoCaptions" [playlist]="playlist"></my-video-share>
|
<my-video-share #videoShareModal [video]="video" [videoCaptions]="videoCaptions" [playlist]="playlist"></my-video-share>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
|
|
|
@ -21,6 +21,7 @@ import { RedirectService } from '@app/core/routing/redirect.service'
|
||||||
import { isXPercentInViewport, scrollToTop } from '@app/helpers'
|
import { isXPercentInViewport, scrollToTop } from '@app/helpers'
|
||||||
import { Video, VideoCaptionService, VideoDetails, VideoService } from '@app/shared/shared-main'
|
import { Video, VideoCaptionService, VideoDetails, VideoService } from '@app/shared/shared-main'
|
||||||
import { VideoShareComponent } from '@app/shared/shared-share-modal'
|
import { VideoShareComponent } from '@app/shared/shared-share-modal'
|
||||||
|
import { SupportModalComponent } from '@app/shared/shared-support-modal'
|
||||||
import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription'
|
import { SubscribeButtonComponent } from '@app/shared/shared-user-subscription'
|
||||||
import { VideoActionsDisplayType, VideoDownloadComponent } from '@app/shared/shared-video-miniature'
|
import { VideoActionsDisplayType, VideoDownloadComponent } from '@app/shared/shared-video-miniature'
|
||||||
import { VideoPlaylist, VideoPlaylistService } from '@app/shared/shared-video-playlist'
|
import { VideoPlaylist, VideoPlaylistService } from '@app/shared/shared-video-playlist'
|
||||||
|
@ -39,7 +40,6 @@ import {
|
||||||
} from '../../../assets/player/peertube-player-manager'
|
} from '../../../assets/player/peertube-player-manager'
|
||||||
import { isWebRTCDisabled, timeToInt } from '../../../assets/player/utils'
|
import { isWebRTCDisabled, timeToInt } from '../../../assets/player/utils'
|
||||||
import { environment } from '../../../environments/environment'
|
import { environment } from '../../../environments/environment'
|
||||||
import { VideoSupportComponent } from './modal/video-support.component'
|
|
||||||
import { VideoWatchPlaylistComponent } from './video-watch-playlist.component'
|
import { VideoWatchPlaylistComponent } from './video-watch-playlist.component'
|
||||||
|
|
||||||
type URLOptions = CustomizationOptions & { playerMode: PlayerMode }
|
type URLOptions = CustomizationOptions & { playerMode: PlayerMode }
|
||||||
|
@ -54,7 +54,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
@ViewChild('videoWatchPlaylist', { static: true }) videoWatchPlaylist: VideoWatchPlaylistComponent
|
@ViewChild('videoWatchPlaylist', { static: true }) videoWatchPlaylist: VideoWatchPlaylistComponent
|
||||||
@ViewChild('videoShareModal') videoShareModal: VideoShareComponent
|
@ViewChild('videoShareModal') videoShareModal: VideoShareComponent
|
||||||
@ViewChild('videoSupportModal') videoSupportModal: VideoSupportComponent
|
@ViewChild('supportModal') supportModal: SupportModalComponent
|
||||||
@ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
|
@ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
|
||||||
@ViewChild('videoDownloadModal') videoDownloadModal: VideoDownloadComponent
|
@ViewChild('videoDownloadModal') videoDownloadModal: VideoDownloadComponent
|
||||||
|
|
||||||
|
@ -282,7 +282,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
this.pausePlayer()
|
this.pausePlayer()
|
||||||
|
|
||||||
const modalRef = this.videoSupportModal.show()
|
const modalRef = this.supportModal.show()
|
||||||
|
|
||||||
modalRef.result.then(() => {
|
modalRef.result.then(() => {
|
||||||
if (isVideoPlaying) {
|
if (isVideoPlaying) {
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { SharedGlobalIconModule } from '@app/shared/shared-icons'
|
||||||
import { SharedMainModule } from '@app/shared/shared-main'
|
import { SharedMainModule } from '@app/shared/shared-main'
|
||||||
import { SharedModerationModule } from '@app/shared/shared-moderation'
|
import { SharedModerationModule } from '@app/shared/shared-moderation'
|
||||||
import { SharedShareModal } from '@app/shared/shared-share-modal'
|
import { SharedShareModal } from '@app/shared/shared-share-modal'
|
||||||
|
import { SharedSupportModal } from '@app/shared/shared-support-modal'
|
||||||
import { SharedUserSubscriptionModule } from '@app/shared/shared-user-subscription'
|
import { SharedUserSubscriptionModule } from '@app/shared/shared-user-subscription'
|
||||||
import { SharedVideoModule } from '@app/shared/shared-video'
|
import { SharedVideoModule } from '@app/shared/shared-video'
|
||||||
import { SharedVideoCommentModule } from '@app/shared/shared-video-comment'
|
import { SharedVideoCommentModule } from '@app/shared/shared-video-comment'
|
||||||
|
@ -13,7 +14,6 @@ import { VideoCommentService } from '../../shared/shared-video-comment/video-com
|
||||||
import { VideoCommentAddComponent } from './comment/video-comment-add.component'
|
import { VideoCommentAddComponent } from './comment/video-comment-add.component'
|
||||||
import { VideoCommentComponent } from './comment/video-comment.component'
|
import { VideoCommentComponent } from './comment/video-comment.component'
|
||||||
import { VideoCommentsComponent } from './comment/video-comments.component'
|
import { VideoCommentsComponent } from './comment/video-comments.component'
|
||||||
import { VideoSupportComponent } from './modal/video-support.component'
|
|
||||||
import { RecommendationsModule } from './recommendations/recommendations.module'
|
import { RecommendationsModule } from './recommendations/recommendations.module'
|
||||||
import { TimestampRouteTransformerDirective } from './timestamp-route-transformer.directive'
|
import { TimestampRouteTransformerDirective } from './timestamp-route-transformer.directive'
|
||||||
import { VideoWatchPlaylistComponent } from './video-watch-playlist.component'
|
import { VideoWatchPlaylistComponent } from './video-watch-playlist.component'
|
||||||
|
@ -34,14 +34,14 @@ import { VideoWatchComponent } from './video-watch.component'
|
||||||
SharedGlobalIconModule,
|
SharedGlobalIconModule,
|
||||||
SharedVideoCommentModule,
|
SharedVideoCommentModule,
|
||||||
SharedShareModal,
|
SharedShareModal,
|
||||||
SharedVideoModule
|
SharedVideoModule,
|
||||||
|
SharedSupportModal
|
||||||
],
|
],
|
||||||
|
|
||||||
declarations: [
|
declarations: [
|
||||||
VideoWatchComponent,
|
VideoWatchComponent,
|
||||||
VideoWatchPlaylistComponent,
|
VideoWatchPlaylistComponent,
|
||||||
|
|
||||||
VideoSupportComponent,
|
|
||||||
VideoCommentsComponent,
|
VideoCommentsComponent,
|
||||||
VideoCommentAddComponent,
|
VideoCommentAddComponent,
|
||||||
VideoCommentComponent,
|
VideoCommentComponent,
|
||||||
|
|
|
@ -46,7 +46,7 @@ export class VideoChannel extends Actor implements ServerVideoChannel {
|
||||||
if (hash.ownerAccount) {
|
if (hash.ownerAccount) {
|
||||||
this.ownerAccount = hash.ownerAccount
|
this.ownerAccount = hash.ownerAccount
|
||||||
this.ownerBy = Actor.CREATE_BY_STRING(hash.ownerAccount.name, hash.ownerAccount.host)
|
this.ownerBy = Actor.CREATE_BY_STRING(hash.ownerAccount.name, hash.ownerAccount.host)
|
||||||
this.ownerAvatarUrl = Actor.GET_ACTOR_AVATAR_URL(this.ownerAccount)
|
this.ownerAvatarUrl = VideoChannel.GET_ACTOR_AVATAR_URL(this.ownerAccount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
export * from './support-modal.component'
|
||||||
|
|
||||||
|
export * from './shared-support-modal.module'
|
|
@ -0,0 +1,24 @@
|
||||||
|
import { NgModule } from '@angular/core'
|
||||||
|
import { SharedFormModule } from '../shared-forms'
|
||||||
|
import { SharedGlobalIconModule } from '../shared-icons'
|
||||||
|
import { SharedMainModule } from '../shared-main/shared-main.module'
|
||||||
|
import { SupportModalComponent } from './support-modal.component'
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
SharedMainModule,
|
||||||
|
SharedFormModule,
|
||||||
|
SharedGlobalIconModule
|
||||||
|
],
|
||||||
|
|
||||||
|
declarations: [
|
||||||
|
SupportModalComponent
|
||||||
|
],
|
||||||
|
|
||||||
|
exports: [
|
||||||
|
SupportModalComponent
|
||||||
|
],
|
||||||
|
|
||||||
|
providers: [ ]
|
||||||
|
})
|
||||||
|
export class SharedSupportModal { }
|
|
@ -1,10 +1,10 @@
|
||||||
<ng-template #modal let-hide="close">
|
<ng-template #modal let-hide="close">
|
||||||
<div class="modal-header">
|
<div class="modal-header">
|
||||||
<h4 i18n class="modal-title">Support {{ video.account.displayName }}</h4>
|
<h4 i18n class="modal-title">Support {{ displayName }}</h4>
|
||||||
<my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
|
<my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-body" [innerHTML]="videoHTMLSupport"></div>
|
<div class="modal-body" [innerHTML]="htmlSupport"></div>
|
||||||
|
|
||||||
<div class="modal-footer inputs">
|
<div class="modal-footer inputs">
|
||||||
<input
|
<input
|
|
@ -0,0 +1,40 @@
|
||||||
|
import { Component, Input, ViewChild } from '@angular/core'
|
||||||
|
import { MarkdownService } from '@app/core'
|
||||||
|
import { VideoDetails } from '@app/shared/shared-main'
|
||||||
|
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
|
||||||
|
import { VideoChannel } from '@shared/models'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'my-support-modal',
|
||||||
|
templateUrl: './support-modal.component.html',
|
||||||
|
styleUrls: [ './support-modal.component.scss' ]
|
||||||
|
})
|
||||||
|
export class SupportModalComponent {
|
||||||
|
@Input() video: VideoDetails = null
|
||||||
|
@Input() videoChannel: VideoChannel = null
|
||||||
|
|
||||||
|
@ViewChild('modal', { static: true }) modal: NgbModal
|
||||||
|
|
||||||
|
htmlSupport = ''
|
||||||
|
displayName = ''
|
||||||
|
|
||||||
|
constructor (
|
||||||
|
private markdownService: MarkdownService,
|
||||||
|
private modalService: NgbModal
|
||||||
|
) { }
|
||||||
|
|
||||||
|
show () {
|
||||||
|
const modalRef = this.modalService.open(this.modal, { centered: true })
|
||||||
|
|
||||||
|
const support = this.video?.support || this.videoChannel.support
|
||||||
|
|
||||||
|
this.markdownService.enhancedMarkdownToHTML(support)
|
||||||
|
.then(r => this.htmlSupport = r)
|
||||||
|
|
||||||
|
this.displayName = this.video
|
||||||
|
? this.video.channel.displayName
|
||||||
|
: this.videoChannel.displayName
|
||||||
|
|
||||||
|
return modalRef
|
||||||
|
}
|
||||||
|
}
|
|
@ -15,6 +15,8 @@ $assets-path: '../../assets/';
|
||||||
@import './primeng-custom';
|
@import './primeng-custom';
|
||||||
@import './ng-select.scss';
|
@import './ng-select.scss';
|
||||||
|
|
||||||
|
@import './classes.scss';
|
||||||
|
|
||||||
[hidden] {
|
[hidden] {
|
||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
@ -465,21 +467,3 @@ ngx-loading-bar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Utils
|
|
||||||
|
|
||||||
.peertube-button {
|
|
||||||
@include peertube-button;
|
|
||||||
}
|
|
||||||
|
|
||||||
.peertube-button-link {
|
|
||||||
@include peertube-button-link;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orange-button {
|
|
||||||
@include orange-button;
|
|
||||||
}
|
|
||||||
|
|
||||||
.orange-button-inverted {
|
|
||||||
@include orange-button-inverted;
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
@import '_variables';
|
||||||
|
@import '_mixins';
|
||||||
|
|
||||||
|
.peertube-button {
|
||||||
|
@include peertube-button;
|
||||||
|
}
|
||||||
|
|
||||||
|
.peertube-button-link {
|
||||||
|
@include peertube-button-link;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orange-button {
|
||||||
|
@include orange-button;
|
||||||
|
}
|
||||||
|
|
||||||
|
.orange-button-inverted {
|
||||||
|
@include orange-button-inverted;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grey-button {
|
||||||
|
@include grey-button;
|
||||||
|
}
|
Loading…
Reference in New Issue