>(authFeature);
+
+const accessToken = createSelector(
+ authFeatureSelector,
+ (state = {}) => state.accessToken
+);
+
+const expiresIn = createSelector(
+ authFeatureSelector,
+ (state = {}) => state.expiresIn
+);
+
+const currentUser = createSelector(
+ authFeatureSelector,
+ (state = {}) => state.user
+);
+
+const isLoggedIn = createSelector(currentUser, (user) => !!user);
+
+const isLoggedOut = createSelector(isLoggedIn, (loggedIn) => !loggedIn);
+
+export const AuthSelectors = {
+ accessToken,
+ expiresIn,
+ currentUser,
+ isLoggedIn,
+ isLoggedOut,
+};
diff --git a/src/app/blogs/blogs-routing.module.ts b/src/app/blogs/blogs-routing.module.ts
index 14aee21..8da90f2 100644
--- a/src/app/blogs/blogs-routing.module.ts
+++ b/src/app/blogs/blogs-routing.module.ts
@@ -1,15 +1,20 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
+
import {
BlogDetailComponent,
BlogListComponent,
CreateUpdateBlogComponent,
} from './components';
+import { GetPostByIdResolver, PostResolver } from './resolvers';
const routes: Routes = [
{
path: '',
component: BlogListComponent,
+ resolve: {
+ posts: PostResolver,
+ },
},
{
path: 'new',
@@ -18,10 +23,16 @@ const routes: Routes = [
{
path: ':id',
component: BlogDetailComponent,
+ resolve: {
+ post: GetPostByIdResolver,
+ },
},
{
path: ':id/edit',
component: CreateUpdateBlogComponent,
+ resolve: {
+ post: GetPostByIdResolver,
+ },
},
];
diff --git a/src/app/blogs/blogs.module.ts b/src/app/blogs/blogs.module.ts
index aecbfd9..3f30081 100644
--- a/src/app/blogs/blogs.module.ts
+++ b/src/app/blogs/blogs.module.ts
@@ -4,13 +4,15 @@ import { FlexLayoutModule } from '@angular/flex-layout';
import { ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
+import { MatChipsModule } from '@angular/material/chips';
+import { MatDialogModule } from '@angular/material/dialog';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatMenuModule } from '@angular/material/menu';
-import { MatChipsModule } from '@angular/material/chips';
import { MatTooltipModule } from '@angular/material/tooltip';
-import { MatDialogModule } from '@angular/material/dialog';
+import { EffectsModule } from '@ngrx/effects';
+import { StoreModule } from '@ngrx/store';
import { BlogsRoutingModule } from './blogs-routing.module';
import {
@@ -18,8 +20,16 @@ import {
BlogListComponent,
CreateUpdateBlogComponent,
} from './components';
-import { BlogService, CommentService } from './services';
import { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dialog.component';
+import { CommentEffects, PostEffects } from './redux/effects';
+import {
+ commentFeature,
+ commentReducer,
+ postFeature,
+ postReducer,
+} from './redux/reducers';
+import { GetPostByIdResolver, PostResolver } from './resolvers';
+import { BlogService, CommentService } from './services';
@NgModule({
declarations: [
@@ -42,7 +52,10 @@ import { ConfirmDialogComponent } from './components/confirm-dialog/confirm-dial
MatTooltipModule,
MatDialogModule,
ReactiveFormsModule,
+ StoreModule.forFeature(postFeature, postReducer),
+ StoreModule.forFeature(commentFeature, commentReducer),
+ EffectsModule.forFeature([PostEffects, CommentEffects]),
],
- providers: [BlogService, CommentService],
+ providers: [BlogService, CommentService, PostResolver, GetPostByIdResolver],
})
export class BlogsModule {}
diff --git a/src/app/blogs/components/blog-detail/blog-detail.component.html b/src/app/blogs/components/blog-detail/blog-detail.component.html
index b8c05d8..a450fe2 100644
--- a/src/app/blogs/components/blog-detail/blog-detail.component.html
+++ b/src/app/blogs/components/blog-detail/blog-detail.component.html
@@ -77,7 +77,7 @@ Comments ({{ post.comments?.length || 0 }})
+
+ ({{
+ post.isUpvoted
+ ? "including you and " + (post.votes.length - 1) + " others"
+ : "+" + post.votes.length
+ }})
+
@@ -95,7 +102,9 @@
Comments ({{ post.comments?.length || 0 }})
- {{ post.createdOn | date }}
+
+ {{ post.createdOn | date: "MMM d, y h:mm a" }}
+
@@ -134,7 +143,9 @@ Comments ({{ post.comments?.length || 0 }})
{{ comment.author?.fullName }}
|
-
+
-