diff --git a/client/src/app/+admin/overview/users/user-list/user-list.component.ts b/client/src/app/+admin/overview/users/user-list/user-list.component.ts index ed3fd7416..0b5c5898a 100644 --- a/client/src/app/+admin/overview/users/user-list/user-list.component.ts +++ b/client/src/app/+admin/overview/users/user-list/user-list.component.ts @@ -40,6 +40,7 @@ import { import { TableExpanderIconComponent } from '../../../../shared/shared-tables/table-expander-icon.component' import { UserEmailInfoComponent } from '../../../shared/user-email-info.component' import { shortCacheObservable } from '@root-helpers/utils' +import { lastValueFrom } from 'rxjs' type UserForList = User & { rawVideoQuota: number @@ -181,7 +182,7 @@ export class UserListComponent extends RestTable implements OnInit, OnDes ] ] - this.bulkActions = await this.hooks.wrapObject(bulkActions, 'admin-users', 'filter:admin-user-list.bulk-actions.create.result') + this.bulkActions = await this.hooks.wrapObject(bulkActions, 'admin-users', 'filter:admin-users-list.bulk-actions.create.result') this.columns = [ { id: 'username', label: $localize`Username` }, @@ -377,7 +378,7 @@ export class UserListComponent extends RestTable implements OnInit, OnDes error: err => this.notifier.error(err.message) }) - return obs + return lastValueFrom(obs) } private loadMutedStatus () { diff --git a/client/src/app/+videos/+video-watch/shared/comment/video-comments.component.ts b/client/src/app/+videos/+video-watch/shared/comment/video-comments.component.ts index 1dd141637..0145ca2d1 100644 --- a/client/src/app/+videos/+video-watch/shared/comment/video-comments.component.ts +++ b/client/src/app/+videos/+video-watch/shared/comment/video-comments.component.ts @@ -10,7 +10,7 @@ import { VideoComment } from '@app/shared/shared-video-comment/video-comment.mod import { VideoCommentService } from '@app/shared/shared-video-comment/video-comment.service' import { NgbDropdown, NgbDropdownButtonItem, NgbDropdownItem, NgbDropdownMenu, NgbDropdownToggle } from '@ng-bootstrap/ng-bootstrap' import { PeerTubeProblemDocument, ServerErrorCode, VideoCommentPolicy } from '@peertube/peertube-models' -import { Subject, Subscription } from 'rxjs' +import { lastValueFrom, Subject, Subscription } from 'rxjs' import { InfiniteScrollerDirective } from '../../../../shared/shared-main/common/infinite-scroller.directive' import { FeedComponent } from '../../../../shared/shared-main/feeds/feed.component' import { LoaderComponent } from '../../../../shared/shared-main/common/loader.component' @@ -151,13 +151,14 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy { } loadMoreThreads (reset = false) { + if (reset === true) { + this.componentPagination.currentPage = 1 + } + const params = { videoId: this.video.uuid, videoPassword: this.videoPassword, - componentPagination: { - ...this.componentPagination, - currentPage: reset === true ? 1 : this.componentPagination.currentPage - }, + componentPagination: this.componentPagination, sort: this.sort } @@ -185,7 +186,7 @@ export class VideoCommentsComponent implements OnInit, OnChanges, OnDestroy { error: err => this.notifier.error(err.message) }) - return obs + return lastValueFrom(obs) } onCommentThreadCreated (comment: VideoComment) { diff --git a/client/src/app/app.component.ts b/client/src/app/app.component.ts index 7a90b4e15..dc884e604 100644 --- a/client/src/app/app.component.ts +++ b/client/src/app/app.component.ts @@ -1,4 +1,4 @@ -import { forkJoin, from } from 'rxjs' +import { forkJoin } from 'rxjs' import { filter, first, map } from 'rxjs/operators' import { DOCUMENT, getLocaleDirection, NgClass, NgIf, PlatformLocation } from '@angular/common' import { AfterViewInit, Component, Inject, LOCALE_ID, OnDestroy, OnInit, ViewChild } from '@angular/core' @@ -150,12 +150,12 @@ export class AppComponent implements OnInit, AfterViewInit, OnDestroy { this.pluginService.addAction('application:increment-loader', () => { this.loadingBar.useRef('plugins').start() - return from([]) + return Promise.resolve() }) this.pluginService.addAction('application:decrement-loader', () => { this.loadingBar.useRef('plugins').complete() - return from([]) + return Promise.resolve() }) } diff --git a/client/src/app/core/plugins/plugin.service.ts b/client/src/app/core/plugins/plugin.service.ts index a9a772306..0165c83b4 100644 --- a/client/src/app/core/plugins/plugin.service.ts +++ b/client/src/app/core/plugins/plugin.service.ts @@ -61,7 +61,7 @@ export class PluginService implements ClientHook { private pluginsManager: PluginsManager - private actions: { [name in ClientDoActionName]?: ClientDoActionCallback } = {} + private actions = new Map() constructor ( private authService: AuthService, @@ -85,11 +85,11 @@ export class PluginService implements ClientHook { } addAction (actionName: ClientDoActionName, callback: ClientDoActionCallback) { - this.actions[actionName] = callback + this.actions.set(actionName, callback) } removeAction (actionName: ClientDoActionName) { - delete this.actions[actionName] + this.actions.delete(actionName) } initializePlugins () { @@ -199,11 +199,15 @@ export class PluginService implements ClientHook { } private doAction (actionName: ClientDoActionName) { - try { - return this.actions[actionName]() - } catch (err: any) { + if (!this.actions.has(actionName)) { logger.warn(`Plugin tried to do unknown action: ${actionName}`) } + + try { + return this.actions.get(actionName)() + } catch (err: any) { + logger.warn(`Cannot run action ${actionName}`, err) + } } private onFormFields ( diff --git a/client/src/app/shared/shared-abuse-list/abuse-list-table.component.ts b/client/src/app/shared/shared-abuse-list/abuse-list-table.component.ts index 56a6c9db4..07e0fc43a 100644 --- a/client/src/app/shared/shared-abuse-list/abuse-list-table.component.ts +++ b/client/src/app/shared/shared-abuse-list/abuse-list-table.component.ts @@ -30,6 +30,7 @@ import { AbuseMessageModalComponent } from './abuse-message-modal.component' import { ModerationCommentModalComponent } from './moderation-comment-modal.component' import { ProcessedAbuse } from './processed-abuse.model' import { shortCacheObservable } from '@root-helpers/utils' +import { lastValueFrom } from 'rxjs' const debugLogger = debug('peertube:moderation:AbuseListTableComponent') @@ -293,7 +294,7 @@ export class AbuseListTableComponent extends RestTable implements OnInit, OnDest error: err => this.notifier.error(err.message) }) - return observable + return lastValueFrom(observable) } private buildInternalActions (): DropdownAction[] { diff --git a/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts b/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts index 2e3cc4297..9800d5ec9 100644 --- a/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts +++ b/client/src/app/shared/shared-moderation/user-moderation-dropdown.component.ts @@ -286,7 +286,7 @@ export class UserModerationDropdownComponent implements OnInit, OnChanges { if (myAccountModerationActions.length !== 0) userActions.push(myAccountModerationActions) if (instanceModerationActions.length !== 0) userActions.push(instanceModerationActions) - this.userActions = await this.hooks.wrapObject(userActions, 'admin-users', 'filter:admin-user-moderation.actions.create.result') + this.userActions = await this.hooks.wrapObject(userActions, 'moderation', 'filter:user-moderation.actions.create.result') } private buildMyAccountModerationActions () { diff --git a/client/src/app/shared/shared-video-comment/video-comment-list-admin-owner.component.ts b/client/src/app/shared/shared-video-comment/video-comment-list-admin-owner.component.ts index 8a2a1d748..fa22f2901 100644 --- a/client/src/app/shared/shared-video-comment/video-comment-list-admin-owner.component.ts +++ b/client/src/app/shared/shared-video-comment/video-comment-list-admin-owner.component.ts @@ -18,6 +18,7 @@ import { AutoColspanDirective } from '../shared-main/common/auto-colspan.directi import { PTDatePipe } from '../shared-main/common/date.pipe' import { TableExpanderIconComponent } from '../shared-tables/table-expander-icon.component' import { shortCacheObservable } from '@root-helpers/utils' +import { lastValueFrom } from 'rxjs' @Component({ selector: 'my-video-comment-list-admin-owner', @@ -102,7 +103,7 @@ export class VideoCommentListAdminOwnerComponent extends RestTable [] = [ @@ -119,11 +120,16 @@ export class VideoCommentListAdminOwnerComponent extends RestTable this.notifier.error(err.message) }) - return obs + return lastValueFrom(obs) } private approveComments (comments: VideoCommentForAdminOrUser[]) { diff --git a/client/src/root-helpers/plugins-manager.ts b/client/src/root-helpers/plugins-manager.ts index a57c5a38d..b11af1511 100644 --- a/client/src/root-helpers/plugins-manager.ts +++ b/client/src/root-helpers/plugins-manager.ts @@ -74,7 +74,8 @@ class PluginsManager { 'video-channel': new ReplaySubject(1), 'my-account': new ReplaySubject(1), 'admin-users': new ReplaySubject(1), - 'admin-comments': new ReplaySubject(1) + 'admin-comments': new ReplaySubject(1), + 'moderation': new ReplaySubject(1) } private readonly doAction: ClientDoAction diff --git a/packages/models/src/plugins/client/client-hook.model.ts b/packages/models/src/plugins/client/client-hook.model.ts index c44b66a13..4b1a2b794 100644 --- a/packages/models/src/plugins/client/client-hook.model.ts +++ b/packages/models/src/plugins/client/client-hook.model.ts @@ -1,5 +1,3 @@ -import { Observable } from 'rxjs' - // Data from API hooks: {hookType}:api.{location}.{elementType}.{actionType}.{target} // Data in internal functions: {hookType}:{location}.{elementType}.{actionType}.{target} @@ -106,16 +104,16 @@ export const clientFilterHookObject = { 'filter:internal.player.p2p-media-loader.options.result': true, // Filter bulk actions in user list - 'filter:admin-user-list.bulk-actions.create.result': true, + 'filter:admin-users-list.bulk-actions.create.result': true, // Filter actions in comment list - 'filter:admin-video-comment-list.actions.create.result': true, + 'filter:admin-video-comments-list.actions.create.result': true, // Filter bulk actions in comment list - 'filter:admin-video-comment-list.bulk-actions.create.result': true, + 'filter:admin-video-comments-list.bulk-actions.create.result': true, // Filter user moderation actions - 'filter:admin-user-moderation.actions.create.result': true, + 'filter:user-moderation.actions.create.result': true, // Filter actions in abuse list 'filter:admin-abuse-list.actions.create.result': true @@ -226,5 +224,5 @@ export const clientDoActionObject = { export type ClientDoActionName = keyof typeof clientDoActionObject -export type ClientDoActionCallback = () => Observable -export type ClientDoAction = (actionName: ClientDoActionName) => Observable +export type ClientDoActionCallback = () => Promise +export type ClientDoAction = (actionName: ClientDoActionName) => Promise diff --git a/packages/models/src/plugins/client/plugin-client-scope.type.ts b/packages/models/src/plugins/client/plugin-client-scope.type.ts index 839d51b9b..d27744104 100644 --- a/packages/models/src/plugins/client/plugin-client-scope.type.ts +++ b/packages/models/src/plugins/client/plugin-client-scope.type.ts @@ -11,4 +11,5 @@ export type PluginClientScope = 'video-channel' | 'my-account' | 'admin-users' | - 'admin-comments' + 'admin-comments' | + 'moderation'