Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit 428c40a

Browse files
feat: display username
1 parent 78aeeab commit 428c40a

File tree

7 files changed

+138
-2
lines changed

7 files changed

+138
-2
lines changed

studio/src/app/components/core/app-menu/app-menu.scss

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ ion-split-pane {
4646
ion-item {
4747
--detail-icon-opacity: 0;
4848

49+
--deckgo-user-info-padding: 0;
50+
--deckgo-user-info-margin: 0;
51+
4952
&.user {
5053
min-height: 32px;
5154
}

studio/src/app/components/core/app-menu/app-menu.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,7 @@ export class AppMenu {
222222
private renderUser() {
223223
if (Utils.isLoggedIn(this.authUser)) {
224224
return <ion-item class="user">
225-
<app-avatar slot="start" src={this.authUser.photo_url}></app-avatar>
226-
<ion-label>{this.authUser.name}</ion-label>
225+
<app-user-info avatarColSize={3}></app-user-info>
227226
</ion-item>;
228227
} else {
229228
return <ion-item class="user"></ion-item>;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
app-user-info {
2+
width: 100%;
3+
4+
ion-grid {
5+
--deckgo-avatar-size: 3rem;
6+
7+
padding: var(--deckgo-user-info-padding, 16px 8px);
8+
margin: var(--deckgo-user-info-margin, 16px 0 0 0);
9+
10+
ion-col.user-info {
11+
display: flex;
12+
flex-direction: column;
13+
14+
ion-label {
15+
margin: 0;
16+
}
17+
18+
ion-label:first-of-type {
19+
padding-bottom: 4px;
20+
font-weight: 500;
21+
color: black;
22+
font-size: var(--font-size-normal);
23+
}
24+
25+
ion-label:last-of-type {
26+
color: var(--ion-color-medium);
27+
font-size: var(--font-size-small);
28+
}
29+
}
30+
}
31+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import {Component, Prop, State} from '@stencil/core';
2+
3+
import {Subscription} from 'rxjs';
4+
import {filter} from 'rxjs/operators';
5+
6+
import {AuthUser} from '../../../models/auth-user';
7+
import {User} from '../../../models/user';
8+
9+
import {UserService} from '../../../services/api/user/user.service';
10+
import {AuthService} from '../../../services/api/auth/auth.service';
11+
12+
@Component({
13+
tag: 'app-user-info',
14+
styleUrl: 'app-user-info.scss'
15+
})
16+
export class AppUserInfo {
17+
18+
@Prop()
19+
avatarColSize: number = 4;
20+
21+
private authService: AuthService;
22+
private authSubscription: Subscription;
23+
24+
private userService: UserService;
25+
private userSubscription: Subscription;
26+
27+
@State()
28+
private authUser: AuthUser;
29+
30+
@State()
31+
private user: User;
32+
33+
constructor() {
34+
this.authService = AuthService.getInstance();
35+
this.userService = UserService.getInstance();
36+
}
37+
38+
componentWillLoad() {
39+
this.authSubscription = this.authService.watch().subscribe((authUser: AuthUser) => {
40+
this.authUser = authUser;
41+
});
42+
43+
this.userSubscription = this.userService.watch().pipe(
44+
filter((user: User) => user && !user.anonymous)).subscribe(async (user: User) => {
45+
this.user = user;
46+
});
47+
}
48+
49+
componentDidUnload() {
50+
if (this.authSubscription) {
51+
this.authSubscription.unsubscribe();
52+
}
53+
54+
if (this.userSubscription) {
55+
this.userSubscription.unsubscribe();
56+
}
57+
}
58+
59+
render() {
60+
if (this.authUser || this.user) {
61+
return <ion-grid>
62+
<ion-row class="ion-align-items-center">
63+
<ion-col size={'' + this.avatarColSize}><app-avatar src={this.authUser.photo_url}></app-avatar></ion-col>
64+
<ion-col size={'' + (12 - this.avatarColSize)} class="user-info">
65+
<ion-label>{this.authUser.name}</ion-label>
66+
<ion-label>{this.user && this.user.username ? '@' + this.user.username : undefined}</ion-label>
67+
</ion-col>
68+
</ion-row>
69+
</ion-grid>
70+
} else {
71+
return undefined;
72+
}
73+
}
74+
75+
}

studio/src/app/popovers/core/app-user-menu/app-user-menu.scss

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
app-user-menu {
22

3+
ion-list {
4+
border-top: 1px solid var(--ion-color-light);
5+
}
6+
37
ion-list.list-ios {
48
margin-bottom: 0;
59
padding-top: 8px;

studio/src/app/popovers/core/app-user-menu/app-user-menu.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ export class AppUserMenu {
3434
}
3535

3636
render() {
37+
return [
38+
<app-user-info></app-user-info>,
39+
this.renderActions()
40+
]
41+
}
42+
43+
private renderActions() {
3744
return <ion-list>
3845
<ion-item onClick={() => this.signOut()}>
3946
<ion-label>Sign out</ion-label>

studio/src/components.d.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ export namespace Components {
6767
'user'?: boolean;
6868
}
6969

70+
interface AppUserInfo {
71+
'avatarColSize': number;
72+
}
73+
interface AppUserInfoAttributes extends StencilHTMLAttributes {
74+
'avatarColSize'?: number;
75+
}
76+
7077
interface AppAddSlideAction {}
7178
interface AppAddSlideActionAttributes extends StencilHTMLAttributes {
7279
'onActionOpenSlideAdd'?: (event: CustomEvent<UIEvent>) => void;
@@ -216,6 +223,7 @@ declare global {
216223
'AppMenu': Components.AppMenu;
217224
'AppNavigationActions': Components.AppNavigationActions;
218225
'AppNavigation': Components.AppNavigation;
226+
'AppUserInfo': Components.AppUserInfo;
219227
'AppAddSlideAction': Components.AppAddSlideAction;
220228
'AppEditorToolbar': Components.AppEditorToolbar;
221229
'AppDemo': Components.AppDemo;
@@ -253,6 +261,7 @@ declare global {
253261
'app-menu': Components.AppMenuAttributes;
254262
'app-navigation-actions': Components.AppNavigationActionsAttributes;
255263
'app-navigation': Components.AppNavigationAttributes;
264+
'app-user-info': Components.AppUserInfoAttributes;
256265
'app-add-slide-action': Components.AppAddSlideActionAttributes;
257266
'app-editor-toolbar': Components.AppEditorToolbarAttributes;
258267
'app-demo': Components.AppDemoAttributes;
@@ -325,6 +334,12 @@ declare global {
325334
new (): HTMLAppNavigationElement;
326335
};
327336

337+
interface HTMLAppUserInfoElement extends Components.AppUserInfo, HTMLStencilElement {}
338+
var HTMLAppUserInfoElement: {
339+
prototype: HTMLAppUserInfoElement;
340+
new (): HTMLAppUserInfoElement;
341+
};
342+
328343
interface HTMLAppAddSlideActionElement extends Components.AppAddSlideAction, HTMLStencilElement {}
329344
var HTMLAppAddSlideActionElement: {
330345
prototype: HTMLAppAddSlideActionElement;
@@ -495,6 +510,7 @@ declare global {
495510
'app-menu': HTMLAppMenuElement
496511
'app-navigation-actions': HTMLAppNavigationActionsElement
497512
'app-navigation': HTMLAppNavigationElement
513+
'app-user-info': HTMLAppUserInfoElement
498514
'app-add-slide-action': HTMLAppAddSlideActionElement
499515
'app-editor-toolbar': HTMLAppEditorToolbarElement
500516
'app-demo': HTMLAppDemoElement
@@ -532,6 +548,7 @@ declare global {
532548
'app-menu': HTMLAppMenuElement;
533549
'app-navigation-actions': HTMLAppNavigationActionsElement;
534550
'app-navigation': HTMLAppNavigationElement;
551+
'app-user-info': HTMLAppUserInfoElement;
535552
'app-add-slide-action': HTMLAppAddSlideActionElement;
536553
'app-editor-toolbar': HTMLAppEditorToolbarElement;
537554
'app-demo': HTMLAppDemoElement;

0 commit comments

Comments
 (0)