diff options
author | Chocobozzz <me@florianbigard.com> | 2023-01-19 09:29:47 +0100 |
---|---|---|
committer | Chocobozzz <chocobozzz@cpy.re> | 2023-01-19 13:53:40 +0100 |
commit | 9589907c89d29a6c0acd52c8cb789af9f93ce9af (patch) | |
tree | f1d238e6144231bbfbed5614e05a21eca8aa6fc2 /client/src/app/shared | |
parent | b379759f55a35837b803a3b988674972db2903d1 (diff) | |
download | PeerTube-9589907c89d29a6c0acd52c8cb789af9f93ce9af.tar.gz PeerTube-9589907c89d29a6c0acd52c8cb789af9f93ce9af.tar.zst PeerTube-9589907c89d29a6c0acd52c8cb789af9f93ce9af.zip |
Implement signup approval in client
Diffstat (limited to 'client/src/app/shared')
16 files changed, 42 insertions, 89 deletions
diff --git a/client/src/app/shared/form-validators/user-validators.ts b/client/src/app/shared/form-validators/user-validators.ts index b93de75ea..ed6e0582e 100644 --- a/client/src/app/shared/form-validators/user-validators.ts +++ b/client/src/app/shared/form-validators/user-validators.ts | |||
@@ -136,13 +136,6 @@ export const USER_DESCRIPTION_VALIDATOR: BuildFormValidator = { | |||
136 | } | 136 | } |
137 | } | 137 | } |
138 | 138 | ||
139 | export const USER_TERMS_VALIDATOR: BuildFormValidator = { | ||
140 | VALIDATORS: [ Validators.requiredTrue ], | ||
141 | MESSAGES: { | ||
142 | required: $localize`You must agree with the instance terms in order to register on it.` | ||
143 | } | ||
144 | } | ||
145 | |||
146 | export const USER_BAN_REASON_VALIDATOR: BuildFormValidator = { | 139 | export const USER_BAN_REASON_VALIDATOR: BuildFormValidator = { |
147 | VALIDATORS: [ | 140 | VALIDATORS: [ |
148 | Validators.minLength(3), | 141 | Validators.minLength(3), |
diff --git a/client/src/app/shared/shared-abuse-list/abuse-details.component.html b/client/src/app/shared/shared-abuse-list/abuse-details.component.html index 089be501d..2d3e26a25 100644 --- a/client/src/app/shared/shared-abuse-list/abuse-details.component.html +++ b/client/src/app/shared/shared-abuse-list/abuse-details.component.html | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | <span class="moderation-expanded-text"> | 9 | <span class="moderation-expanded-text"> |
10 | <a [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reporter:"' + abuse.reporterAccount.displayName + '"' }" | 10 | <a [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reporter:"' + abuse.reporterAccount.displayName + '"' }" |
11 | class="chip" | 11 | class="chip me-1" |
12 | > | 12 | > |
13 | <my-actor-avatar size="18" [actor]="abuse.reporterAccount" actorType="account"></my-actor-avatar> | 13 | <my-actor-avatar size="18" [actor]="abuse.reporterAccount" actorType="account"></my-actor-avatar> |
14 | <div> | 14 | <div> |
@@ -29,7 +29,7 @@ | |||
29 | <span class="moderation-expanded-label" i18n>Reportee</span> | 29 | <span class="moderation-expanded-label" i18n>Reportee</span> |
30 | <span class="moderation-expanded-text"> | 30 | <span class="moderation-expanded-text"> |
31 | <a [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reportee:"' +abuse.flaggedAccount.displayName + '"' }" | 31 | <a [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reportee:"' +abuse.flaggedAccount.displayName + '"' }" |
32 | class="chip" | 32 | class="chip me-1" |
33 | > | 33 | > |
34 | <my-actor-avatar size="18" [actor]="abuse.flaggedAccount" actorType="account"></my-actor-avatar> | 34 | <my-actor-avatar size="18" [actor]="abuse.flaggedAccount" actorType="account"></my-actor-avatar> |
35 | <div> | 35 | <div> |
@@ -63,7 +63,7 @@ | |||
63 | <div *ngIf="predefinedReasons" class="mt-2 d-flex"> | 63 | <div *ngIf="predefinedReasons" class="mt-2 d-flex"> |
64 | <span> | 64 | <span> |
65 | <a *ngFor="let reason of predefinedReasons" [routerLink]="[ '.' ]" | 65 | <a *ngFor="let reason of predefinedReasons" [routerLink]="[ '.' ]" |
66 | [queryParams]="{ 'search': 'tag:' + reason.id }" class="chip rectangular bg-secondary text-light" | 66 | [queryParams]="{ 'search': 'tag:' + reason.id }" class="pt-badge badge-secondary" |
67 | > | 67 | > |
68 | <div>{{ reason.label }}</div> | 68 | <div>{{ reason.label }}</div> |
69 | </a> | 69 | </a> |
diff --git a/client/src/app/shared/shared-main/account/index.ts b/client/src/app/shared/shared-main/account/index.ts index b80ddb9f5..dd41a5f05 100644 --- a/client/src/app/shared/shared-main/account/index.ts +++ b/client/src/app/shared/shared-main/account/index.ts | |||
@@ -1,3 +1,4 @@ | |||
1 | export * from './account.model' | 1 | export * from './account.model' |
2 | export * from './account.service' | 2 | export * from './account.service' |
3 | export * from './actor.model' | 3 | export * from './actor.model' |
4 | export * from './signup-label.component' | ||
diff --git a/client/src/app/shared/shared-main/account/signup-label.component.html b/client/src/app/shared/shared-main/account/signup-label.component.html new file mode 100644 index 000000000..35d6c5360 --- /dev/null +++ b/client/src/app/shared/shared-main/account/signup-label.component.html | |||
@@ -0,0 +1,2 @@ | |||
1 | <ng-container i18n *ngIf="requiresApproval">Request an account</ng-container> | ||
2 | <ng-container i18n *ngIf="!requiresApproval">Create an account</ng-container> | ||
diff --git a/client/src/app/shared/shared-main/account/signup-label.component.ts b/client/src/app/shared/shared-main/account/signup-label.component.ts new file mode 100644 index 000000000..caacb9c6f --- /dev/null +++ b/client/src/app/shared/shared-main/account/signup-label.component.ts | |||
@@ -0,0 +1,9 @@ | |||
1 | import { Component, Input } from '@angular/core' | ||
2 | |||
3 | @Component({ | ||
4 | selector: 'my-signup-label', | ||
5 | templateUrl: './signup-label.component.html' | ||
6 | }) | ||
7 | export class SignupLabelComponent { | ||
8 | @Input() requiresApproval: boolean | ||
9 | } | ||
diff --git a/client/src/app/shared/shared-main/shared-main.module.ts b/client/src/app/shared/shared-main/shared-main.module.ts index c1523bc50..eb1642d97 100644 --- a/client/src/app/shared/shared-main/shared-main.module.ts +++ b/client/src/app/shared/shared-main/shared-main.module.ts | |||
@@ -16,7 +16,7 @@ import { | |||
16 | import { LoadingBarModule } from '@ngx-loading-bar/core' | 16 | import { LoadingBarModule } from '@ngx-loading-bar/core' |
17 | import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client' | 17 | import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client' |
18 | import { SharedGlobalIconModule } from '../shared-icons' | 18 | import { SharedGlobalIconModule } from '../shared-icons' |
19 | import { AccountService } from './account' | 19 | import { AccountService, SignupLabelComponent } from './account' |
20 | import { | 20 | import { |
21 | AutofocusDirective, | 21 | AutofocusDirective, |
22 | BytesPipe, | 22 | BytesPipe, |
@@ -113,6 +113,8 @@ import { VideoChannelService } from './video-channel' | |||
113 | UserQuotaComponent, | 113 | UserQuotaComponent, |
114 | UserNotificationsComponent, | 114 | UserNotificationsComponent, |
115 | 115 | ||
116 | SignupLabelComponent, | ||
117 | |||
116 | EmbedComponent, | 118 | EmbedComponent, |
117 | 119 | ||
118 | PluginPlaceholderComponent, | 120 | PluginPlaceholderComponent, |
@@ -171,6 +173,8 @@ import { VideoChannelService } from './video-channel' | |||
171 | UserQuotaComponent, | 173 | UserQuotaComponent, |
172 | UserNotificationsComponent, | 174 | UserNotificationsComponent, |
173 | 175 | ||
176 | SignupLabelComponent, | ||
177 | |||
174 | EmbedComponent, | 178 | EmbedComponent, |
175 | 179 | ||
176 | PluginPlaceholderComponent, | 180 | PluginPlaceholderComponent, |
diff --git a/client/src/app/shared/shared-main/users/user-notification.model.ts b/client/src/app/shared/shared-main/users/user-notification.model.ts index bf8870a79..96e7b4dd0 100644 --- a/client/src/app/shared/shared-main/users/user-notification.model.ts +++ b/client/src/app/shared/shared-main/users/user-notification.model.ts | |||
@@ -83,6 +83,11 @@ export class UserNotification implements UserNotificationServer { | |||
83 | latestVersion: string | 83 | latestVersion: string |
84 | } | 84 | } |
85 | 85 | ||
86 | registration?: { | ||
87 | id: number | ||
88 | username: string | ||
89 | } | ||
90 | |||
86 | createdAt: string | 91 | createdAt: string |
87 | updatedAt: string | 92 | updatedAt: string |
88 | 93 | ||
@@ -97,6 +102,8 @@ export class UserNotification implements UserNotificationServer { | |||
97 | 102 | ||
98 | accountUrl?: string | 103 | accountUrl?: string |
99 | 104 | ||
105 | registrationsUrl?: string | ||
106 | |||
100 | videoImportIdentifier?: string | 107 | videoImportIdentifier?: string |
101 | videoImportUrl?: string | 108 | videoImportUrl?: string |
102 | 109 | ||
@@ -135,6 +142,7 @@ export class UserNotification implements UserNotificationServer { | |||
135 | 142 | ||
136 | this.plugin = hash.plugin | 143 | this.plugin = hash.plugin |
137 | this.peertube = hash.peertube | 144 | this.peertube = hash.peertube |
145 | this.registration = hash.registration | ||
138 | 146 | ||
139 | this.createdAt = hash.createdAt | 147 | this.createdAt = hash.createdAt |
140 | this.updatedAt = hash.updatedAt | 148 | this.updatedAt = hash.updatedAt |
@@ -208,6 +216,10 @@ export class UserNotification implements UserNotificationServer { | |||
208 | this.accountUrl = this.buildAccountUrl(this.account) | 216 | this.accountUrl = this.buildAccountUrl(this.account) |
209 | break | 217 | break |
210 | 218 | ||
219 | case UserNotificationType.NEW_USER_REGISTRATION_REQUEST: | ||
220 | this.registrationsUrl = '/admin/moderation/registrations/list' | ||
221 | break | ||
222 | |||
211 | case UserNotificationType.NEW_FOLLOW: | 223 | case UserNotificationType.NEW_FOLLOW: |
212 | this.accountUrl = this.buildAccountUrl(this.actorFollow.follower) | 224 | this.accountUrl = this.buildAccountUrl(this.actorFollow.follower) |
213 | break | 225 | break |
diff --git a/client/src/app/shared/shared-main/users/user-notifications.component.html b/client/src/app/shared/shared-main/users/user-notifications.component.html index e7cdb0183..a51e08292 100644 --- a/client/src/app/shared/shared-main/users/user-notifications.component.html +++ b/client/src/app/shared/shared-main/users/user-notifications.component.html | |||
@@ -215,6 +215,14 @@ | |||
215 | </div> | 215 | </div> |
216 | </ng-container> | 216 | </ng-container> |
217 | 217 | ||
218 | <ng-container *ngSwitchCase="20"> <!-- UserNotificationType.NEW_USER_REGISTRATION_REQUEST --> | ||
219 | <my-global-icon iconName="user-add" aria-hidden="true"></my-global-icon> | ||
220 | |||
221 | <div class="message" i18n> | ||
222 | User <a (click)="markAsRead(notification)" [routerLink]="notification.registrationsUrl">{{ notification.registration.username }}</a> wants to register on your instance | ||
223 | </div> | ||
224 | </ng-container> | ||
225 | |||
218 | <ng-container *ngSwitchDefault> | 226 | <ng-container *ngSwitchDefault> |
219 | <my-global-icon iconName="alert" aria-hidden="true"></my-global-icon> | 227 | <my-global-icon iconName="alert" aria-hidden="true"></my-global-icon> |
220 | 228 | ||
diff --git a/client/src/app/shared/shared-moderation/account-blocklist.component.scss b/client/src/app/shared/shared-moderation/account-blocklist.component.scss index 8b1239d34..00aaf3b9c 100644 --- a/client/src/app/shared/shared-moderation/account-blocklist.component.scss +++ b/client/src/app/shared/shared-moderation/account-blocklist.component.scss | |||
@@ -1,10 +1,6 @@ | |||
1 | @use '_variables' as *; | 1 | @use '_variables' as *; |
2 | @use '_mixins' as *; | 2 | @use '_mixins' as *; |
3 | 3 | ||
4 | .chip { | ||
5 | @include chip; | ||
6 | } | ||
7 | |||
8 | .unblock-button { | 4 | .unblock-button { |
9 | @include peertube-button; | 5 | @include peertube-button; |
10 | @include grey-button; | 6 | @include grey-button; |
diff --git a/client/src/app/shared/shared-moderation/moderation.scss b/client/src/app/shared/shared-moderation/moderation.scss index eaf5a8250..7c1e308cf 100644 --- a/client/src/app/shared/shared-moderation/moderation.scss +++ b/client/src/app/shared/shared-moderation/moderation.scss | |||
@@ -40,10 +40,6 @@ | |||
40 | } | 40 | } |
41 | } | 41 | } |
42 | 42 | ||
43 | .chip { | ||
44 | @include chip; | ||
45 | } | ||
46 | |||
47 | my-action-dropdown.show { | 43 | my-action-dropdown.show { |
48 | ::ng-deep .dropdown-root { | 44 | ::ng-deep .dropdown-root { |
49 | display: block !important; | 45 | display: block !important; |
diff --git a/client/src/app/shared/shared-moderation/server-blocklist.component.scss b/client/src/app/shared/shared-moderation/server-blocklist.component.scss index e29668a23..1a6b0435f 100644 --- a/client/src/app/shared/shared-moderation/server-blocklist.component.scss +++ b/client/src/app/shared/shared-moderation/server-blocklist.component.scss | |||
@@ -24,7 +24,3 @@ a { | |||
24 | .block-button { | 24 | .block-button { |
25 | @include create-button; | 25 | @include create-button; |
26 | } | 26 | } |
27 | |||
28 | .chip { | ||
29 | @include chip; | ||
30 | } | ||
diff --git a/client/src/app/shared/shared-users/index.ts b/client/src/app/shared/shared-users/index.ts index 20e60486d..95d90e49e 100644 --- a/client/src/app/shared/shared-users/index.ts +++ b/client/src/app/shared/shared-users/index.ts | |||
@@ -1,5 +1,4 @@ | |||
1 | export * from './user-admin.service' | 1 | export * from './user-admin.service' |
2 | export * from './user-signup.service' | ||
3 | export * from './two-factor.service' | 2 | export * from './two-factor.service' |
4 | 3 | ||
5 | export * from './shared-users.module' | 4 | export * from './shared-users.module' |
diff --git a/client/src/app/shared/shared-users/shared-users.module.ts b/client/src/app/shared/shared-users/shared-users.module.ts index 5a1675dc9..efffc6026 100644 --- a/client/src/app/shared/shared-users/shared-users.module.ts +++ b/client/src/app/shared/shared-users/shared-users.module.ts | |||
@@ -1,9 +1,7 @@ | |||
1 | |||
2 | import { NgModule } from '@angular/core' | 1 | import { NgModule } from '@angular/core' |
3 | import { SharedMainModule } from '../shared-main/shared-main.module' | 2 | import { SharedMainModule } from '../shared-main/shared-main.module' |
4 | import { TwoFactorService } from './two-factor.service' | 3 | import { TwoFactorService } from './two-factor.service' |
5 | import { UserAdminService } from './user-admin.service' | 4 | import { UserAdminService } from './user-admin.service' |
6 | import { UserSignupService } from './user-signup.service' | ||
7 | 5 | ||
8 | @NgModule({ | 6 | @NgModule({ |
9 | imports: [ | 7 | imports: [ |
@@ -15,7 +13,6 @@ import { UserSignupService } from './user-signup.service' | |||
15 | exports: [], | 13 | exports: [], |
16 | 14 | ||
17 | providers: [ | 15 | providers: [ |
18 | UserSignupService, | ||
19 | UserAdminService, | 16 | UserAdminService, |
20 | TwoFactorService | 17 | TwoFactorService |
21 | ] | 18 | ] |
diff --git a/client/src/app/shared/shared-users/user-signup.service.ts b/client/src/app/shared/shared-users/user-signup.service.ts deleted file mode 100644 index 46fe34af1..000000000 --- a/client/src/app/shared/shared-users/user-signup.service.ts +++ /dev/null | |||
@@ -1,56 +0,0 @@ | |||
1 | import { catchError, tap } from 'rxjs/operators' | ||
2 | import { HttpClient } from '@angular/common/http' | ||
3 | import { Injectable } from '@angular/core' | ||
4 | import { RestExtractor, UserService } from '@app/core' | ||
5 | import { UserRegister } from '@shared/models' | ||
6 | |||
7 | @Injectable() | ||
8 | export class UserSignupService { | ||
9 | constructor ( | ||
10 | private authHttp: HttpClient, | ||
11 | private restExtractor: RestExtractor, | ||
12 | private userService: UserService | ||
13 | ) { } | ||
14 | |||
15 | signup (userCreate: UserRegister) { | ||
16 | return this.authHttp.post(UserService.BASE_USERS_URL + 'register', userCreate) | ||
17 | .pipe( | ||
18 | tap(() => this.userService.setSignupInThisSession(true)), | ||
19 | catchError(err => this.restExtractor.handleError(err)) | ||
20 | ) | ||
21 | } | ||
22 | |||
23 | verifyEmail (userId: number, verificationString: string, isPendingEmail: boolean) { | ||
24 | const url = `${UserService.BASE_USERS_URL}/${userId}/verify-email` | ||
25 | const body = { | ||
26 | verificationString, | ||
27 | isPendingEmail | ||
28 | } | ||
29 | |||
30 | return this.authHttp.post(url, body) | ||
31 | .pipe(catchError(res => this.restExtractor.handleError(res))) | ||
32 | } | ||
33 | |||
34 | askSendVerifyEmail (email: string) { | ||
35 | const url = UserService.BASE_USERS_URL + '/ask-send-verify-email' | ||
36 | |||
37 | return this.authHttp.post(url, { email }) | ||
38 | .pipe(catchError(err => this.restExtractor.handleError(err))) | ||
39 | } | ||
40 | |||
41 | getNewUsername (oldDisplayName: string, newDisplayName: string, currentUsername: string) { | ||
42 | // Don't update display name, the user seems to have changed it | ||
43 | if (this.displayNameToUsername(oldDisplayName) !== currentUsername) return currentUsername | ||
44 | |||
45 | return this.displayNameToUsername(newDisplayName) | ||
46 | } | ||
47 | |||
48 | private displayNameToUsername (displayName: string) { | ||
49 | if (!displayName) return '' | ||
50 | |||
51 | return displayName | ||
52 | .toLowerCase() | ||
53 | .replace(/\s/g, '_') | ||
54 | .replace(/[^a-z0-9_.]/g, '') | ||
55 | } | ||
56 | } | ||
diff --git a/client/src/app/shared/shared-video-miniature/video-miniature.component.html b/client/src/app/shared/shared-video-miniature/video-miniature.component.html index 6fdf24b2d..227c12130 100644 --- a/client/src/app/shared/shared-video-miniature/video-miniature.component.html +++ b/client/src/app/shared/shared-video-miniature/video-miniature.component.html | |||
@@ -53,8 +53,8 @@ | |||
53 | <ng-container *ngIf="displayOptions.state">{{ getStateLabel(video) }}</ng-container> | 53 | <ng-container *ngIf="displayOptions.state">{{ getStateLabel(video) }}</ng-container> |
54 | </div> | 54 | </div> |
55 | 55 | ||
56 | <div *ngIf="containedInPlaylists" class="video-contained-in-playlists"> | 56 | <div *ngIf="containedInPlaylists" class="fs-6"> |
57 | <a *ngFor="let playlist of containedInPlaylists" class="chip rectangular bg-secondary text-light" [routerLink]="['/w/p/', playlist.playlistShortUUID]"> | 57 | <a *ngFor="let playlist of containedInPlaylists" class="pt-badge badge-secondary" [routerLink]="['/w/p/', playlist.playlistShortUUID]"> |
58 | {{ playlist.playlistDisplayName }} | 58 | {{ playlist.playlistDisplayName }} |
59 | </a> | 59 | </a> |
60 | </div> | 60 | </div> |
diff --git a/client/src/app/shared/shared-video-miniature/video-miniature.component.scss b/client/src/app/shared/shared-video-miniature/video-miniature.component.scss index ba2adfc5a..a397efdca 100644 --- a/client/src/app/shared/shared-video-miniature/video-miniature.component.scss +++ b/client/src/app/shared/shared-video-miniature/video-miniature.component.scss | |||
@@ -4,10 +4,6 @@ | |||
4 | 4 | ||
5 | $more-button-width: 40px; | 5 | $more-button-width: 40px; |
6 | 6 | ||
7 | .chip { | ||
8 | @include chip; | ||
9 | } | ||
10 | |||
11 | .video-miniature { | 7 | .video-miniature { |
12 | font-size: 14px; | 8 | font-size: 14px; |
13 | } | 9 | } |