Skip to content

Commit 01b056e

Browse files
authored
Merge pull request #227 from CenterForOpenScience/feat/sign-up
Feat/sign up
2 parents b5cdae0 + 2b840de commit 01b056e

File tree

57 files changed

+1057
-1352
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1057
-1352
lines changed

src/app/app.component.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
44
import { RouterOutlet } from '@angular/router';
55

66
import { GetCurrentUser } from '@core/store/user';
7+
import { InitializeAuth } from '@osf/features/auth/store';
78

89
import { FullScreenLoaderComponent, ToastComponent } from './shared/components';
910

@@ -15,9 +16,13 @@ import { FullScreenLoaderComponent, ToastComponent } from './shared/components';
1516
changeDetection: ChangeDetectionStrategy.OnPush,
1617
})
1718
export class AppComponent implements OnInit {
18-
actions = createDispatchMap({ getCurrentUser: GetCurrentUser });
19+
actions = createDispatchMap({
20+
getCurrentUser: GetCurrentUser,
21+
initializeAuth: InitializeAuth,
22+
});
1923

2024
ngOnInit(): void {
25+
this.actions.initializeAuth();
2126
this.actions.getCurrentUser();
2227
}
2328
}

src/app/app.routes.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Routes } from '@angular/router';
44

55
import { BookmarksState, ProjectsState } from '@shared/stores';
66

7+
import { authGuard, redirectIfLoggedInGuard } from './core/guards';
78
import { MyProfileResourceFiltersOptionsState } from './features/my-profile/components/filters/store';
89
import { MyProfileResourceFiltersState } from './features/my-profile/components/my-profile-resource-filters/store';
910
import { MyProfileState } from './features/my-profile/store';
@@ -19,20 +20,16 @@ export const routes: Routes = [
1920
{
2021
path: '',
2122
pathMatch: 'full',
22-
redirectTo: 'home',
23-
},
24-
{
25-
path: 'home',
26-
loadComponent: () => import('./features/home/home.component').then((mod) => mod.HomeComponent),
23+
canActivate: [redirectIfLoggedInGuard],
24+
loadComponent: () => import('@osf/features/home/home.component').then((mod) => mod.HomeComponent),
2725
data: { skipBreadcrumbs: true },
2826
},
2927
{
30-
path: 'home-logged-out',
28+
path: 'dashboard',
3129
loadComponent: () =>
32-
import('@osf/features/home/pages/home-logged-out/home-logged-out.component').then(
33-
(mod) => mod.HomeLoggedOutComponent
34-
),
30+
import('./features/home/pages/dashboard/dashboard.component').then((mod) => mod.DashboardComponent),
3531
data: { skipBreadcrumbs: true },
32+
canActivate: [authGuard],
3633
},
3734
{
3835
path: 'confirm/:userId/:token',
@@ -74,15 +71,18 @@ export const routes: Routes = [
7471
loadComponent: () =>
7572
import('./features/my-projects/my-projects.component').then((mod) => mod.MyProjectsComponent),
7673
providers: [provideStates([BookmarksState])],
74+
canActivate: [authGuard],
7775
},
7876
{
7977
path: 'my-projects/:id',
8078
loadChildren: () => import('./features/project/project.routes').then((mod) => mod.projectRoutes),
8179
providers: [provideStates([ProjectsState, BookmarksState])],
80+
canActivate: [authGuard],
8281
},
8382
{
8483
path: 'settings',
8584
loadChildren: () => import('./features/settings/settings.routes').then((mod) => mod.settingsRoutes),
85+
canActivate: [authGuard],
8686
},
8787
{
8888
path: 'preprints',
@@ -99,6 +99,7 @@ export const routes: Routes = [
9999
providers: [
100100
provideStates([MyProfileResourceFiltersState, MyProfileResourceFiltersOptionsState, MyProfileState]),
101101
],
102+
canActivate: [authGuard],
102103
},
103104
{
104105
path: 'institutions',
@@ -112,6 +113,7 @@ export const routes: Routes = [
112113
path: 'registries/:id',
113114
loadChildren: () => import('./features/registry/registry.routes').then((mod) => mod.registryRoutes),
114115
providers: [provideStates([BookmarksState])],
116+
canActivate: [authGuard],
115117
},
116118
{
117119
path: 'terms-of-use',

src/app/core/components/header/header.component.html

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,24 @@
22
<osf-breadcrumb />
33

44
<div class="header-dropdown-button ml-auto">
5-
<p-button
6-
class="custom-dark-hover"
7-
icon="fas fa-chevron-down"
8-
iconPos="right"
9-
variant="text"
10-
severity="contrast"
11-
[label]="currentUser()?.fullName"
12-
(click)="menu.toggle($event)"
13-
/>
5+
@if (isAuthenticated()) {
6+
<p-button
7+
class="custom-dark-hover"
8+
icon="fas fa-chevron-down"
9+
iconPos="right"
10+
variant="text"
11+
severity="contrast"
12+
[label]="currentUser()?.fullName"
13+
(click)="menu.toggle($event)"
14+
/>
1415

15-
<p-menu appendTo="body" #menu [model]="items" popup>
16-
<ng-template #item let-item>
17-
<a class="p-menu-item-link">{{ item.label | translate }}</a>
18-
</ng-template>
19-
</p-menu>
16+
<p-menu appendTo="body" #menu [model]="items" popup>
17+
<ng-template #item let-item>
18+
<a class="p-menu-item-link">{{ item.label | translate }}</a>
19+
</ng-template>
20+
</p-menu>
21+
} @else {
22+
<p-button [label]="'navigation.signIn' | translate" (onClick)="navigateToSignIn()"></p-button>
23+
}
2024
</div>
2125
</header>

src/app/core/components/header/header.component.scss

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
position: absolute;
55
gap: 1rem;
66
padding: mix.rem(12px) mix.rem(24px);
7-
height: mix.rem(52px);
87
width: 100%;
98
background-color: var(--header-background-color);
109
background-image: var(--header-background-image-url);
Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
1-
import { select } from '@ngxs/store';
1+
import { createDispatchMap, select } from '@ngxs/store';
22

33
import { TranslatePipe } from '@ngx-translate/core';
44

5-
import { ButtonModule } from 'primeng/button';
6-
import { MenuModule } from 'primeng/menu';
5+
import { Button } from 'primeng/button';
6+
import { Menu } from 'primeng/menu';
77

88
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
99
import { Router } from '@angular/router';
1010

11-
import { BreadcrumbComponent } from '@core/components/breadcrumb/breadcrumb.component';
12-
import { UserSelectors } from '@core/store/user/user.selectors';
11+
import { NavigationService } from '@osf/core/services';
12+
import { UserSelectors } from '@osf/core/store/user';
13+
import { AuthSelectors, Logout } from '@osf/features/auth/store';
14+
import { LoaderService } from '@osf/shared/services';
15+
16+
import { BreadcrumbComponent } from '../breadcrumb/breadcrumb.component';
1317

1418
@Component({
1519
selector: 'osf-header',
16-
imports: [BreadcrumbComponent, MenuModule, ButtonModule, TranslatePipe],
20+
imports: [BreadcrumbComponent, Menu, Button, TranslatePipe],
1721
templateUrl: './header.component.html',
1822
styleUrl: './header.component.scss',
1923
changeDetection: ChangeDetectionStrategy.OnPush,
2024
})
2125
export class HeaderComponent {
2226
currentUser = select(UserSelectors.getCurrentUser);
27+
isAuthenticated = select(AuthSelectors.isAuthenticated);
2328

2429
private readonly router = inject(Router);
30+
private readonly loaderService = inject(LoaderService);
31+
private readonly navigationService = inject(NavigationService);
32+
private readonly actions = createDispatchMap({ logout: Logout });
2533

2634
items = [
2735
{
@@ -32,9 +40,14 @@ export class HeaderComponent {
3240
{
3341
label: 'navigation.logOut',
3442
command: () => {
35-
document.cookie = 'auth_token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
36-
this.router.navigate(['/']);
43+
this.loaderService.show();
44+
this.actions.logout();
45+
this.router.navigate(['/home']).then(() => window.location.reload());
3746
},
3847
},
3948
];
49+
50+
navigateToSignIn() {
51+
this.navigationService.navigateToSignIn();
52+
}
4053
}

src/app/core/components/nav-menu/nav-menu.component.ts

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import { PanelMenuModule } from 'primeng/panelmenu';
77

88
import { filter, map } from 'rxjs';
99

10-
import { Component, computed, effect, inject, output } from '@angular/core';
10+
import { Component, computed, inject, output } from '@angular/core';
1111
import { toSignal } from '@angular/core/rxjs-interop';
1212
import { ActivatedRoute, NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router';
1313

1414
import { MENU_ITEMS, MODERATION_MENU_ITEM, PROJECT_MENU_ITEMS, REGISTRATION_MENU_ITEMS } from '@core/constants';
15+
import { filterMenuItems } from '@osf/core/helpers';
1516
import { ProviderSelectors } from '@osf/core/store/provider';
1617
import { UserSelectors } from '@osf/core/store/user';
18+
import { AuthSelectors } from '@osf/features/auth/store';
1719
import { IconComponent } from '@osf/shared/components';
1820

1921
@Component({
@@ -28,7 +30,8 @@ export class NavMenuComponent {
2830
private readonly router = inject(Router);
2931
private readonly route = inject(ActivatedRoute);
3032

31-
protected menuItems = MENU_ITEMS;
33+
private readonly isAuthenticated = select(AuthSelectors.isAuthenticated);
34+
3235
protected readonly myProjectMenuItems = PROJECT_MENU_ITEMS;
3336
protected readonly registrationMenuItems = computed(() => {
3437
const menu = [...REGISTRATION_MENU_ITEMS];
@@ -55,9 +58,22 @@ export class NavMenuComponent {
5558
protected readonly isUserModerator = select(UserSelectors.isCurrentUserModerator);
5659
protected readonly provider = select(ProviderSelectors.getCurrentProvider);
5760

58-
protected readonly mainMenuItems = computed(() =>
59-
this.isCollectionsRoute() ? this.menuItems : this.menuItems.filter((item) => item.routerLink !== '/collections')
60-
);
61+
protected readonly mainMenuItems = computed(() => {
62+
const isAuthenticated = this.isAuthenticated();
63+
const menuItems = filterMenuItems(MENU_ITEMS, isAuthenticated);
64+
65+
if (this.isRegistryRouteDetails()) {
66+
menuItems.map((menuItem) => {
67+
if (menuItem.id === 'registries') {
68+
menuItem.expanded = true;
69+
return menuItem;
70+
}
71+
return menuItem;
72+
});
73+
}
74+
75+
return this.isCollectionsRoute() ? menuItems : menuItems.filter((item) => item.routerLink !== '/collections');
76+
});
6177

6278
protected readonly currentRoute = toSignal(
6379
this.router.events.pipe(
@@ -75,21 +91,6 @@ export class NavMenuComponent {
7591
protected readonly isRegistryRoute = computed(() => this.currentRoute().isRegistryRoute);
7692
protected readonly isRegistryRouteDetails = computed(() => this.currentRoute().isRegistryRouteDetails);
7793

78-
constructor() {
79-
effect(() => {
80-
const isRouteDetails = this.isRegistryRouteDetails();
81-
if (isRouteDetails) {
82-
this.menuItems = this.menuItems.map((menuItem) => {
83-
if (menuItem.id === 'registries') {
84-
menuItem.expanded = true;
85-
return menuItem;
86-
}
87-
return menuItem;
88-
});
89-
}
90-
});
91-
}
92-
9394
private getRouteInfo() {
9495
const urlSegments = this.router.url.split('/').filter((segment) => segment);
9596
const resourceFromQueryParams = this.route.snapshot.queryParams['resourceId'];

0 commit comments

Comments
 (0)