Add user notification animation

pull/1697/head
Chocobozzz 2019-02-20 10:16:04 +01:00
parent 28c8e63e55
commit b28e4e5e08
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
13 changed files with 124 additions and 21 deletions

View File

@ -2,7 +2,6 @@ import { Injectable } from '@angular/core'
import { environment } from '../../../environments/environment'
import { UserNotification as UserNotificationServer } from '../../../../../shared'
import { Subject } from 'rxjs'
import * as io from 'socket.io-client'
import { AuthService } from '../auth'
export type NotificationEvent = 'new' | 'read' | 'read-all'

View File

@ -1,6 +1,6 @@
<div
[ngbPopover]="popContent" autoClose="outside" placement="bottom-left" container="body" popoverClass="popover-notifications"
i18n-title title="View your notifications" class="notification-avatar" #popover="ngbPopover"
i18n-title title="View your notifications" class="notification-avatar" #popover="ngbPopover" (hidden)="onPopoverHidden()"
>
<div *ngIf="unreadNotifications > 0" class="unread-notifications">{{ unreadNotifications }}</div>
@ -8,16 +8,25 @@
</div>
<ng-template #popContent>
<div class="notifications-header">
<div i18n>Notifications</div>
<div class="content" [ngClass]="{ loaded: loaded }">
<div class="notifications-header">
<div i18n>Notifications</div>
<a
i18n-title title="Update your notification preferences" class="glyphicon glyphicon-cog"
routerLink="/my-account/settings" fragment="notifications"
></a>
<a
i18n-title title="Update your notification preferences" class="glyphicon glyphicon-cog"
routerLink="/my-account/settings" fragment="notifications"
></a>
</div>
<div *ngIf="!loaded" class="loader">
<my-loader [loading]="!loaded"></my-loader>
</div>
<my-user-notifications
[ignoreLoadingBar]="true" [infiniteScroll]="false" itemsPerPage="10"
(notificationsLoaded)="onNotificationLoaded()"
></my-user-notifications>
<a *ngIf="loaded" class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a>
</div>
<my-user-notifications [ignoreLoadingBar]="true" [infiniteScroll]="false" itemsPerPage="10"></my-user-notifications>
<a class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a>
</ng-template>

View File

@ -9,11 +9,27 @@
padding: 0;
font-size: 14px;
font-family: $main-fonts;
overflow-y: auto;
max-height: 500px;
overflow-y: scroll;
width: 400px;
box-shadow: 0 6px 14px rgba(0, 0, 0, 0.30);
.loader {
display: flex;
align-items: center;
justify-content: center;
padding: 5px 0;
}
.content {
max-height: 150px;
transition: max-height 0.15s ease-out;
&.loaded {
max-height: 500px;
}
}
.notifications-header {
display: flex;
justify-content: space-between;

View File

@ -17,6 +17,7 @@ export class AvatarNotificationComponent implements OnInit, OnDestroy {
@Input() user: User
unreadNotifications = 0
loaded = false
private notificationSub: Subscription
private routeSub: Subscription
@ -54,6 +55,14 @@ export class AvatarNotificationComponent implements OnInit, OnDestroy {
this.popover.close()
}
onPopoverHidden () {
this.loaded = false
}
onNotificationLoaded () {
this.loaded = true
}
private async subscribeToNotifications () {
const obs = await this.userNotificationSocket.getMyNotificationsSocket()

View File

@ -1,3 +1,8 @@
<div id="video-loading" *ngIf="loading">
<div class="glyphicon glyphicon-refresh glyphicon-refresh-animate"></div>
<div *ngIf="loading">
<div class="lds-ring">
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</div>

View File

@ -0,0 +1,45 @@
@import '_variables';
@import '_mixins';
// Thanks to https://loading.io/css/ (CC0 License)
.lds-ring {
display: inline-block;
position: relative;
width: 50px;
height: 50px;
}
.lds-ring div {
box-sizing: border-box;
display: block;
position: absolute;
width: 44px;
height: 44px;
margin: 6px;
border: 4px solid;
border-radius: 50%;
animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
border-color: #999999 transparent transparent transparent;
}
.lds-ring div:nth-child(1) {
animation-delay: -0.45s;
}
.lds-ring div:nth-child(2) {
animation-delay: -0.3s;
}
.lds-ring div:nth-child(3) {
animation-delay: -0.15s;
}
@keyframes lds-ring {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}

View File

@ -2,10 +2,9 @@ import { Component, Input } from '@angular/core'
@Component({
selector: 'my-loader',
styleUrls: [ ],
styleUrls: [ './loader.component.scss' ],
templateUrl: './loader.component.html'
})
export class LoaderComponent {
@Input() loading: boolean
}

View File

@ -0,0 +1,3 @@
<div *ngIf="loading">
<div class="glyphicon glyphicon-refresh glyphicon-refresh-animate"></div>
</div>

View File

@ -0,0 +1,11 @@
import { Component, Input } from '@angular/core'
@Component({
selector: 'my-small-loader',
styleUrls: [ ],
templateUrl: './small-loader.component.html'
})
export class SmallLoaderComponent {
@Input() loading: boolean
}

View File

@ -69,6 +69,7 @@ import { InstanceService } from '@app/shared/instance/instance.service'
import { HtmlRendererService, LinkifierService, MarkdownService } from '@app/shared/renderer'
import { ConfirmComponent } from '@app/shared/confirm/confirm.component'
import { GlobalIconComponent } from '@app/shared/icons/global-icon.component'
import { SmallLoaderComponent } from '@app/shared/misc/small-loader.component'
@NgModule({
imports: [
@ -90,6 +91,7 @@ import { GlobalIconComponent } from '@app/shared/icons/global-icon.component'
declarations: [
LoaderComponent,
SmallLoaderComponent,
VideoThumbnailComponent,
VideoMiniatureComponent,
FeedComponent,
@ -135,6 +137,7 @@ import { GlobalIconComponent } from '@app/shared/icons/global-icon.component'
KeysPipe,
LoaderComponent,
SmallLoaderComponent,
VideoThumbnailComponent,
VideoMiniatureComponent,
FeedComponent,

View File

@ -1,4 +1,4 @@
import { Component, Input, OnInit } from '@angular/core'
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'
import { UserNotificationService } from '@app/shared/users/user-notification.service'
import { UserNotificationType } from '../../../../../shared'
import { ComponentPagination, hasMoreItems } from '@app/shared/rest/component-pagination.model'
@ -15,6 +15,8 @@ export class UserNotificationsComponent implements OnInit {
@Input() infiniteScroll = true
@Input() itemsPerPage = 20
@Output() notificationsLoaded = new EventEmitter()
notifications: UserNotification[] = []
// So we can access it in the template
@ -43,6 +45,8 @@ export class UserNotificationsComponent implements OnInit {
result => {
this.notifications = this.notifications.concat(result.data)
this.componentPagination.totalItems = result.total
this.notificationsLoaded.emit()
},
err => this.notifier.error(err.message)

View File

@ -54,7 +54,7 @@
<ng-container i18n>View all {{ comment.totalReplies }} replies</ng-container>
<span *ngIf="!threadLoading[comment.id]" class="glyphicon glyphicon-menu-down"></span>
<my-loader class="comment-thread-loading" [loading]="threadLoading[comment.id]"></my-loader>
<my-small-loader class="comment-thread-loading" [loading]="threadLoading[comment.id]"></my-small-loader>
</div>
</div>
</div>

View File

@ -146,7 +146,7 @@
<div class="video-info-description-more" *ngIf="completeDescriptionShown === false && video.description?.length >= 250" (click)="showMoreDescription()">
<ng-container i18n>Show more</ng-container>
<span *ngIf="descriptionLoading === false" class="glyphicon glyphicon-menu-down"></span>
<my-loader class="description-loading" [loading]="descriptionLoading"></my-loader>
<my-small-loader class="description-loading" [loading]="descriptionLoading"></my-small-loader>
</div>
<div *ngIf="completeDescriptionShown === true" (click)="showLessDescription()" class="video-info-description-more">