diff --git a/angular.json b/angular.json
index 3667153ac..713797410 100644
--- a/angular.json
+++ b/angular.json
@@ -37,7 +37,10 @@
"src/assets"
],
"styles": [
- "src/scss/styles.scss"
+ "src/scss/styles.scss",
+ "node_modules/primeng/resources/themes/lara-light-blue/theme.css",
+ "node_modules/primeng/resources/primeng.min.css",
+ "node_modules/primeicons/primeicons.css"
],
"scripts": [],
"allowedCommonJsDependencies": [],
diff --git a/package-lock.json b/package-lock.json
index 786849d93..bac02451c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,6 +20,7 @@
"@angular/platform-browser": "^21.0.6",
"@angular/platform-browser-dynamic": "^21.0.6",
"@angular/router": "^21.0.6",
+ "@auth0/angular-jwt": "^5.2.0",
"@coreui/angular": "~5.6.4",
"@coreui/angular-chartjs": "~5.6.4",
"@coreui/chartjs": "~4.1.0",
@@ -27,9 +28,16 @@
"@coreui/icons": "^3.0.1",
"@coreui/icons-angular": "~5.6.4",
"@coreui/utils": "^2.0.2",
+ "@types/mime-types": "^3.0.1",
"chart.js": "^4.5.1",
+ "jwt-decode": "^4.0.0",
"lodash-es": "^4.17.22",
+ "mime": "^4.1.0",
+ "mime-types": "^3.0.2",
"ngx-scrollbar": "^13.0.3",
+ "primeicons": "^7.0.0",
+ "primeng": "^21.0.2",
+ "react-spinners": "^0.17.0",
"rxjs": "~7.8.2",
"tslib": "^2.8.1",
"zone.js": "~0.16.0"
@@ -701,6 +709,17 @@
"rxjs": "^6.5.3 || ^7.4.0"
}
},
+ "node_modules/@auth0/angular-jwt": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@auth0/angular-jwt/-/angular-jwt-5.2.0.tgz",
+ "integrity": "sha512-9FS2L0QwGNlxA/zgeehCcsR9CZscouyXkoIj1fODM36A8BLfdzg9k9DWAXUQ2Drjk0AypGAFzeNZR4vsLMhdeQ==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=14.0.0"
+ }
+ },
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
@@ -989,7 +1008,6 @@
"version": "5.6.4",
"resolved": "https://registry.npmjs.org/@coreui/angular/-/angular-5.6.4.tgz",
"integrity": "sha512-iOelu602tuEoQLj0esOx/HqJMxquQKiMvm6heeYTtk/GB4BegSPlqUVdbNkfK+MlTlxrYdORfE5Ymz0zvRDo3g==",
- "license": "MIT",
"dependencies": {
"@popperjs/core": "~2.11.8",
"tslib": "^2.3.0"
@@ -3257,6 +3275,44 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@primeuix/motion": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/@primeuix/motion/-/motion-0.0.10.tgz",
+ "integrity": "sha512-PsZwOPq79Scp7/ionshRcQ5xKVf9+zuLcyY5mf6onK8chHT5C9JGphmcIZ4CzcqxuGEpsm8AIbTGy+zS3RtzLA==",
+ "dependencies": {
+ "@primeuix/utils": "^0.6.3"
+ },
+ "engines": {
+ "node": ">=12.11.0"
+ }
+ },
+ "node_modules/@primeuix/styled": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/@primeuix/styled/-/styled-0.7.4.tgz",
+ "integrity": "sha512-QSO/NpOQg8e9BONWRBx9y8VGMCMYz0J/uKfNJEya/RGEu7ARx0oYW0ugI1N3/KB1AAvyGxzKBzGImbwg0KUiOQ==",
+ "dependencies": {
+ "@primeuix/utils": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=12.11.0"
+ }
+ },
+ "node_modules/@primeuix/styles": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@primeuix/styles/-/styles-2.0.2.tgz",
+ "integrity": "sha512-LNtkJsTonNHF5ag+9s3+zQzm00+LRmffw68QRIHy6S/dam1JpdrrAnUzNYlWbaY7aE2EkZvQmx7Np7+PyHn+ow==",
+ "dependencies": {
+ "@primeuix/styled": "^0.7.4"
+ }
+ },
+ "node_modules/@primeuix/utils": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.6.3.tgz",
+ "integrity": "sha512-/SLNQSKQ73WbBIsflKVqbpVjCfFYvQO3Sf1LMheXyxh8JqxO4M63dzP56wwm9OPGuCQ6MYOd2AHgZXz+g7PZcg==",
+ "engines": {
+ "node": ">=12.11.0"
+ }
+ },
"node_modules/@rolldown/binding-android-arm64": {
"version": "1.0.0-beta.47",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-beta.47.tgz",
@@ -4063,6 +4119,11 @@
"@types/lodash": "*"
}
},
+ "node_modules/@types/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRMsfuQbnRq1Ef+C+RKaENOxXX87Ygl38W1vDfPHRku02TgQr+Qd8iivLtAMcR0KF5/29xlnFihkTlbqFrGOVQ=="
+ },
"node_modules/@types/node": {
"version": "24.10.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.4.tgz",
@@ -6465,6 +6526,14 @@
],
"license": "MIT"
},
+ "node_modules/jwt-decode": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+ "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/karma": {
"version": "6.4.4",
"resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz",
@@ -6745,6 +6814,18 @@
"node": ">= 0.6"
}
},
+ "node_modules/karma/node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/karma/node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
@@ -7252,23 +7333,23 @@
}
},
"node_modules/mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
- "dev": true,
- "license": "MIT",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-4.1.0.tgz",
+ "integrity": "sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==",
+ "funding": [
+ "https://github.com/sponsors/broofa"
+ ],
"bin": {
- "mime": "cli.js"
+ "mime": "bin/cli.js"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">=16"
}
},
"node_modules/mime-db": {
"version": "1.54.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
"integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -7278,8 +7359,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
"integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
- "dev": true,
- "license": "MIT",
"dependencies": {
"mime-db": "^1.54.0"
},
@@ -8215,6 +8294,32 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/primeicons": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz",
+ "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw=="
+ },
+ "node_modules/primeng": {
+ "version": "21.0.2",
+ "resolved": "https://registry.npmjs.org/primeng/-/primeng-21.0.2.tgz",
+ "integrity": "sha512-suf+xK3V3z2aG9OmQMAriqhMt79JM3jBSoRDu4XQKCiTiWDRnOvoVdCZCjByT32sE5tYqhrLBsCH0lT7RLcosg==",
+ "dependencies": {
+ "@primeuix/motion": "^0.0.10",
+ "@primeuix/styled": "^0.7.4",
+ "@primeuix/styles": "^2.0.2",
+ "@primeuix/utils": "^0.6.3",
+ "tslib": "^2.3.0"
+ },
+ "peerDependencies": {
+ "@angular/cdk": "^21.0.0",
+ "@angular/common": "^21.0.0",
+ "@angular/core": "^21.0.0",
+ "@angular/forms": "^21.0.0",
+ "@angular/platform-browser": "^21.0.0",
+ "@angular/router": "^21.0.0",
+ "rxjs": "^6.0.0 || ^7.8.1"
+ }
+ },
"node_modules/proc-log": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz",
@@ -8312,6 +8417,36 @@
"node": ">= 0.10"
}
},
+ "node_modules/react": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
+ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==",
+ "peer": true,
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.3"
+ }
+ },
+ "node_modules/react-spinners": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-spinners/-/react-spinners-0.17.0.tgz",
+ "integrity": "sha512-L/8HTylaBmIWwQzIjMq+0vyaRXuoAevzWoD35wKpNTxxtYXWZp+xtgkfD7Y4WItuX0YvdxMPU79+7VhhmbmuTQ==",
+ "peerDependencies": {
+ "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/readdirp": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
@@ -8577,6 +8712,12 @@
"@parcel/watcher": "^2.4.1"
}
},
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "peer": true
+ },
"node_modules/semver": {
"version": "7.7.3",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
diff --git a/package.json b/package.json
index a4518dc72..a8ffefda3 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"@angular/platform-browser": "^21.0.6",
"@angular/platform-browser-dynamic": "^21.0.6",
"@angular/router": "^21.0.6",
+ "@auth0/angular-jwt": "^5.2.0",
"@coreui/angular": "~5.6.4",
"@coreui/angular-chartjs": "~5.6.4",
"@coreui/chartjs": "~4.1.0",
@@ -37,9 +38,16 @@
"@coreui/icons": "^3.0.1",
"@coreui/icons-angular": "~5.6.4",
"@coreui/utils": "^2.0.2",
+ "@types/mime-types": "^3.0.1",
"chart.js": "^4.5.1",
+ "jwt-decode": "^4.0.0",
"lodash-es": "^4.17.22",
+ "mime": "^4.1.0",
+ "mime-types": "^3.0.2",
"ngx-scrollbar": "^13.0.3",
+ "primeicons": "^7.0.0",
+ "primeng": "^21.0.2",
+ "react-spinners": "^0.17.0",
"rxjs": "~7.8.2",
"tslib": "^2.8.1",
"zone.js": "~0.16.0"
diff --git a/src/app/Interceptor/auth.interceptor.ts b/src/app/Interceptor/auth.interceptor.ts
new file mode 100644
index 000000000..4be101bc9
--- /dev/null
+++ b/src/app/Interceptor/auth.interceptor.ts
@@ -0,0 +1,18 @@
+import { HttpInterceptorFn, HttpRequest, HttpEvent, HttpHandlerFn } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+export const authInterceptor: HttpInterceptorFn = (req: HttpRequest, next: HttpHandlerFn): Observable> => {
+ // Get token logic...
+ const token = localStorage.getItem('token'); // Replace with actual token retrieval
+
+ if (token) {
+ const authReq = req.clone({
+ setHeaders: {
+ Authorization: `Bearer ${token}`
+ }
+ });
+ return next(authReq);
+ }
+
+ return next(req);
+};
\ No newline at end of file
diff --git a/src/app/RouteGuard/AuthGuard.ts b/src/app/RouteGuard/AuthGuard.ts
new file mode 100644
index 000000000..7ea7bb0fd
--- /dev/null
+++ b/src/app/RouteGuard/AuthGuard.ts
@@ -0,0 +1,28 @@
+import { Injectable } from '@angular/core';
+import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
+import { Observable } from 'rxjs';
+import { AuthService } from '../services/auth.service'; // Assume you have an authentication service
+
+@Injectable({
+ providedIn: 'root'
+})
+export class AuthGuard implements CanActivate {
+ decodeToken:any;
+ decodedTxt:any;
+ constructor(private authService: AuthService, private router: Router) {}
+
+ canActivate(
+ next: ActivatedRouteSnapshot,
+ state: RouterStateSnapshot): Observable | Promise | boolean {
+ this.decodeToken = this.authService.getDecodeToken();
+ this.decodedTxt = JSON.parse(this.decodeToken);
+ if (this.decodedTxt?.isAdmin) {
+ console.log("Admin")
+ this.router.navigate(['/forms/form-control']);
+ return true
+ } else {
+ console.log("User")
+ return false; // Block navigation
+ }
+ }
+}
diff --git a/src/app/app.component.ts b/src/app/app.component.ts
index 3514d8698..2efa9ff46 100644
--- a/src/app/app.component.ts
+++ b/src/app/app.component.ts
@@ -14,7 +14,7 @@ import { iconSubset } from './icons/icon-subset';
imports: [RouterOutlet]
})
export class AppComponent implements OnInit {
- title = 'CoreUI Angular Admin Template';
+ title = 'Ecomm';
readonly #destroyRef: DestroyRef = inject(DestroyRef);
readonly #activatedRoute: ActivatedRoute = inject(ActivatedRoute);
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
index 8196731ab..5f133429d 100644
--- a/src/app/app.config.ts
+++ b/src/app/app.config.ts
@@ -10,9 +10,13 @@ import {
} from '@angular/router';
import { IconSetService } from '@coreui/icons-angular';
import { routes } from './app.routes';
+import { provideHttpClient, withInterceptors } from '@angular/common/http';
+import {authInterceptor} from './Interceptor/auth.interceptor';
+import { provideAnimations } from '@angular/platform-browser/animations';
export const appConfig: ApplicationConfig = {
providers: [
+ provideHttpClient(withInterceptors([authInterceptor])),
provideRouter(routes,
withRouterConfig({
onSameUrlNavigation: 'reload'
@@ -26,7 +30,7 @@ export const appConfig: ApplicationConfig = {
withHashLocation()
),
IconSetService,
- provideAnimationsAsync()
+ provideAnimations()
]
};
diff --git a/src/app/layout/default-layout/_nav.ts b/src/app/layout/default-layout/_nav.ts
index db48a851b..b5322f70f 100644
--- a/src/app/layout/default-layout/_nav.ts
+++ b/src/app/layout/default-layout/_nav.ts
@@ -1,4 +1,6 @@
import { INavData } from '@coreui/angular';
+import { CanActivate } from '@angular/router';
+import { AuthGuard } from '../../RouteGuard/AuthGuard';
export const navItems: INavData[] = [
{
@@ -15,12 +17,12 @@ export const navItems: INavData[] = [
name: 'Theme'
},
{
- name: 'Colors',
+ name: 'Product Details',
url: '/theme/colors',
iconComponent: { name: 'cil-drop' }
},
{
- name: 'Typography',
+ name: 'AddToCart',
url: '/theme/typography',
linkProps: { fragment: 'headings' },
iconComponent: { name: 'cil-pencil' }
@@ -189,9 +191,9 @@ export const navItems: INavData[] = [
attributes: { target: '_blank' }
},
{
- name: 'Form Control',
+ name: 'Add Product',
url: '/forms/form-control',
- icon: 'nav-icon-bullet'
+ icon: 'nav-icon-bullet',
},
{
name: 'Checks & Radios',
diff --git a/src/app/layout/default-layout/default-header/default-header.component.html b/src/app/layout/default-layout/default-header/default-header.component.html
index 34fcecfc2..173488013 100644
--- a/src/app/layout/default-layout/default-header/default-header.component.html
+++ b/src/app/layout/default-layout/default-header/default-header.component.html
@@ -16,11 +16,21 @@
Dashboard
+
+
+
+
+
@@ -46,12 +56,15 @@
+
-
+
+
+
@@ -59,15 +72,30 @@
+
+
{{decodedEmail}}
+
{{decodedTxt?.isAdmin ? 'Admin' : 'User'}}
+
-
@@ -97,7 +125,7 @@ 42
- -
+
-
@@ -150,7 +178,7 @@
+
Logout
diff --git a/src/app/layout/default-layout/default-header/default-header.component.ts b/src/app/layout/default-layout/default-header/default-header.component.ts
index 6f4d6954e..e5d412bc9 100644
--- a/src/app/layout/default-layout/default-header/default-header.component.ts
+++ b/src/app/layout/default-layout/default-header/default-header.component.ts
@@ -1,6 +1,6 @@
-import { NgTemplateOutlet } from '@angular/common';
-import { Component, computed, inject, input } from '@angular/core';
-import { RouterLink, RouterLinkActive } from '@angular/router';
+import { CommonModule, NgTemplateOutlet } from '@angular/common';
+import { Component, computed, inject, input, OnInit } from '@angular/core';
+import { Router, RouterLink, RouterLinkActive } from '@angular/router';
import {
AvatarComponent,
@@ -23,17 +23,24 @@ import {
} from '@coreui/angular';
import { IconDirective } from '@coreui/icons-angular';
+import { AuthService } from '../../../services/auth.service';
+import { FormsModule } from '@angular/forms';
+import { ProductService } from '../../../services/product.service';
@Component({
selector: 'app-default-header',
templateUrl: './default-header.component.html',
- imports: [ContainerComponent, HeaderTogglerDirective, SidebarToggleDirective, IconDirective, HeaderNavComponent, NavItemComponent, NavLinkDirective, RouterLink, RouterLinkActive, NgTemplateOutlet, BreadcrumbRouterComponent, DropdownComponent, DropdownToggleDirective, AvatarComponent, DropdownMenuDirective, DropdownHeaderDirective, DropdownItemDirective, BadgeComponent, DropdownDividerDirective]
+ imports: [ContainerComponent,FormsModule, HeaderTogglerDirective, SidebarToggleDirective, IconDirective, HeaderNavComponent, NavItemComponent, NavLinkDirective, RouterLink, RouterLinkActive, NgTemplateOutlet, BreadcrumbRouterComponent, DropdownComponent, DropdownToggleDirective, AvatarComponent, DropdownMenuDirective, DropdownHeaderDirective, DropdownItemDirective, BadgeComponent, DropdownDividerDirective]
})
-export class DefaultHeaderComponent extends HeaderComponent {
+export class DefaultHeaderComponent extends HeaderComponent{
readonly #colorModeService = inject(ColorModeService);
readonly colorMode = this.#colorModeService.colorMode;
-
+ decodedImage:any;
+ decodedEmail:any;
+ decodeToken:any;
+ decodedTxt:any;
+ searchTxt = '';
readonly colorModes = [
{ name: 'light', text: 'Light', icon: 'cilSun' },
{ name: 'dark', text: 'Dark', icon: 'cilMoon' },
@@ -45,10 +52,29 @@ export class DefaultHeaderComponent extends HeaderComponent {
return this.colorModes.find(mode => mode.name === currentMode)?.icon ?? 'cilSun';
});
- constructor() {
+ constructor(private authService:AuthService,
+ private router:Router,private productService:ProductService) {
super();
}
+ ngOnInit() {
+ let email = '';
+ this.decodeToken = this.authService.getDecodeToken();
+ this.decodedTxt = JSON.parse(this.decodeToken);
+ this.decodedImage = this.decodedTxt?.image;
+ this.decodedEmail = this.decodedTxt?.email;
+ }
+
+ handleLogout(){
+ this.authService.removeToken();
+ this.router.navigateByUrl('/login')
+ }
+
+ //search
+ getSearchProduct(searchTxt:string){
+ return this.productService.getSearchProduct(searchTxt)
+ }
+
sidebarId = input('sidebar1');
public newMessages = [
diff --git a/src/app/layout/default-layout/default-layout.component.html b/src/app/layout/default-layout/default-layout.component.html
index f7ae8e188..3d2f2465b 100644
--- a/src/app/layout/default-layout/default-layout.component.html
+++ b/src/app/layout/default-layout/default-layout.component.html
@@ -7,15 +7,20 @@
visible
>
-
+
+
+
+
+
+
-
-
-
@if (!sidebar1.narrow) {
diff --git a/src/app/layout/default-layout/default-layout.component.ts b/src/app/layout/default-layout/default-layout.component.ts
index 2e01ea849..fac218603 100644
--- a/src/app/layout/default-layout/default-layout.component.ts
+++ b/src/app/layout/default-layout/default-layout.component.ts
@@ -1,12 +1,10 @@
import { Component } from '@angular/core';
-import { RouterLink, RouterOutlet } from '@angular/router';
+import { RouterOutlet } from '@angular/router';
import { NgScrollbar } from 'ngx-scrollbar';
-import { IconDirective } from '@coreui/icons-angular';
import {
ContainerComponent,
ShadowOnScrollDirective,
- SidebarBrandComponent,
SidebarComponent,
SidebarFooterComponent,
SidebarHeaderComponent,
@@ -17,6 +15,7 @@ import {
import { DefaultFooterComponent, DefaultHeaderComponent } from './';
import { navItems } from './_nav';
+import { AuthService } from '../../services/auth.service';
function isOverflown(element: HTMLElement) {
return (
@@ -32,7 +31,6 @@ function isOverflown(element: HTMLElement) {
imports: [
SidebarComponent,
SidebarHeaderComponent,
- SidebarBrandComponent,
SidebarNavComponent,
SidebarFooterComponent,
SidebarToggleDirective,
@@ -40,13 +38,33 @@ function isOverflown(element: HTMLElement) {
ContainerComponent,
DefaultFooterComponent,
DefaultHeaderComponent,
- IconDirective,
NgScrollbar,
RouterOutlet,
- RouterLink,
ShadowOnScrollDirective
]
})
export class DefaultLayoutComponent {
public navItems = [...navItems];
+ decodeToken:any;decodedTxt:any;
+ isItemFound = true;
+ matchedItem:any;
+ constructor(private authService:AuthService){}
+
+ ngOnInit() {
+ this.navItems.filter(item => {
+ // console.log(item.children)
+
+ this.decodeToken = this.authService.getDecodeToken();
+ this.decodedTxt = JSON.parse(this.decodeToken);
+ if (!this.decodedTxt?.isAdmin) {
+
+ console.log("No Name")
+ this.matchedItem = item.children?.filter(item => item.name === 'Add Product');
+ console.log(this.matchedItem);
+ // this.isItemFound = !!match;
+ //return this.isItemFound;
+ }
+ })
+ }
+
}
diff --git a/src/app/model/auth.model.ts b/src/app/model/auth.model.ts
new file mode 100644
index 000000000..2209c83dc
--- /dev/null
+++ b/src/app/model/auth.model.ts
@@ -0,0 +1,10 @@
+export class UserRegister{
+ username!:string;
+ password!:string;
+ email!:string;
+ image!:string;
+}
+export class UserLogin{
+ email!:string;
+ password!:string;
+}
diff --git a/src/app/model/product.model.ts b/src/app/model/product.model.ts
new file mode 100644
index 000000000..ad509f8b8
--- /dev/null
+++ b/src/app/model/product.model.ts
@@ -0,0 +1,8 @@
+export class Product{
+ title!:string;
+ description!:string;
+ rating!:number;
+ price!:number;
+ image!:File;
+ category!:string;
+}
diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts
new file mode 100644
index 000000000..1d22e117d
--- /dev/null
+++ b/src/app/services/auth.service.ts
@@ -0,0 +1,84 @@
+import { HttpClient } from '@angular/common/http';
+import { Injectable, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { UserLogin, UserRegister } from '../model/auth.model';
+import { Subject } from 'rxjs';
+import { JwtHelperService } from '@auth0/angular-jwt';
+
+@Injectable({
+ providedIn:'root'
+})
+export class AuthService implements OnInit{
+ decodedToken:any;
+ private authStatusListener = new Subject();
+ constructor(public http:HttpClient,private router:Router){}
+ token:any;
+ ngOnInit(): void {
+
+ }
+
+ registerUser(username:string,password:string,email:string,image:File){
+ const form = new FormData();
+ form.append('username',username);
+ form.append('password',password);
+ form.append('email',email);
+ form.append('image',image);
+
+ this.http.post<{message:string,userReg:UserRegister}>
+ ('http://localhost:8000/api/auth/register',form)
+ .subscribe(responseData=>{
+ alert("Registration Successfully");
+ this.router.navigateByUrl('/login')
+ },error=>{
+ if(error.status === 400){
+ this.authStatusListener.next(false);
+ console.log(error)
+ alert(error.error.message)
+ }
+
+ })
+ }
+
+ login(email:string,password:string){
+ const form = new FormData();
+ form.append('email',email);
+ form.append('password',password);
+
+ this.http.post<{
+ token: any;message:string,userLogin:UserLogin
+ }>
+ ('http://localhost:8000/api/auth/login',form)
+ .subscribe(responseData=>{
+ this.token = responseData.token;
+ localStorage.setItem('token', responseData.token);
+ const helper = new JwtHelperService();
+ this.decodedToken= helper.decodeToken(this.token);
+ localStorage.setItem('userInfo', JSON.stringify(this.decodedToken));
+ console.log(this.decodedToken);
+ alert("Login Successfully");
+ this.router.navigateByUrl('/');
+ },error=>{
+ if(error.status === 400){
+ this.authStatusListener.next(false);
+ console.log(error)
+ alert(error.error.message)
+ }
+ })
+ }
+
+ adminAuthentication(){
+ this.http.get(``)
+ }
+
+ getAuthenticationToken(){
+ return localStorage.getItem('token');
+ }
+ getDecodeToken(){
+ return localStorage.getItem('userInfo');
+ }
+ // Remove token
+ public removeToken(): void {
+ localStorage.removeItem('token');
+ localStorage.removeItem('userInfo');
+ }
+}
diff --git a/src/app/services/product.service.ts b/src/app/services/product.service.ts
new file mode 100644
index 000000000..816ed620d
--- /dev/null
+++ b/src/app/services/product.service.ts
@@ -0,0 +1,124 @@
+import { Injectable, signal } from '@angular/core';
+import { HttpClient, HttpHeaders } from '@angular/common/http';
+import { Router } from '@angular/router';
+import { Product } from '../model/product.model';
+import { BehaviorSubject, map, retry } from 'rxjs';
+@Injectable({
+ providedIn:'root'
+})
+
+export class ProductService {
+ TOKEN = localStorage.getItem('token');
+ productInfo = signal
-