├── .editorconfig ├── .firebase └── hosting.ZGlzdFxoYW5kbWFkZS1wcm9qZWN0.cache ├── .firebaserc ├── .gitignore ├── README.md ├── angular.json ├── firebase.json ├── package-lock.json ├── package.json ├── src ├── app │ ├── app-routing.module.ts │ ├── app.component.css │ ├── app.component.html │ ├── app.component.spec.ts │ ├── app.component.ts │ ├── app.module.ts │ ├── components │ │ ├── about-us │ │ │ ├── about-us.component.css │ │ │ ├── about-us.component.html │ │ │ └── about-us.component.ts │ │ ├── cart-page │ │ │ ├── cart-products │ │ │ │ ├── cart-products.component.css │ │ │ │ ├── cart-products.component.html │ │ │ │ ├── cart-products.component.spec.ts │ │ │ │ └── cart-products.component.ts │ │ │ ├── cart │ │ │ │ ├── cart.component.css │ │ │ │ ├── cart.component.html │ │ │ │ ├── cart.component.spec.ts │ │ │ │ └── cart.component.ts │ │ │ └── empty-cart │ │ │ │ ├── empty-cart.component.css │ │ │ │ ├── empty-cart.component.html │ │ │ │ ├── empty-cart.component.spec.ts │ │ │ │ └── empty-cart.component.ts │ │ ├── checkout │ │ │ ├── checkout.component.css │ │ │ ├── checkout.component.html │ │ │ ├── checkout.component.spec.ts │ │ │ └── checkout.component.ts │ │ ├── client-orders │ │ │ ├── client-orders.component.css │ │ │ ├── client-orders.component.html │ │ │ ├── client-orders.component.spec.ts │ │ │ └── client-orders.component.ts │ │ ├── contact-us │ │ │ ├── contact-us.component.css │ │ │ ├── contact-us.component.html │ │ │ ├── contact-us.component.spec.ts │ │ │ └── contact-us.component.ts │ │ ├── create-product │ │ │ ├── add-new-product.component.css │ │ │ ├── add-new-product.component.html │ │ │ ├── add-new-product.component.spec.ts │ │ │ └── add-new-product.component.ts │ │ ├── create-workshop │ │ │ ├── create-workshop.component.css │ │ │ ├── create-workshop.component.html │ │ │ ├── create-workshop.component.spec.ts │ │ │ └── create-workshop.component.ts │ │ ├── edit-product │ │ │ ├── edit-product.component.css │ │ │ ├── edit-product.component.html │ │ │ ├── edit-product.component.spec.ts │ │ │ └── edit-product.component.ts │ │ ├── edit-workshop │ │ │ ├── edit-workshop.component.css │ │ │ ├── edit-workshop.component.html │ │ │ ├── edit-workshop.component.spec.ts │ │ │ └── edit-workshop.component.ts │ │ ├── favorite-page │ │ │ ├── empty-favourites │ │ │ │ ├── empty-favourites.component.css │ │ │ │ ├── empty-favourites.component.html │ │ │ │ ├── empty-favourites.component.spec.ts │ │ │ │ └── empty-favourites.component.ts │ │ │ ├── favourite-products │ │ │ │ ├── favourite-products.component.css │ │ │ │ ├── favourite-products.component.html │ │ │ │ ├── favourite-products.component.spec.ts │ │ │ │ └── favourite-products.component.ts │ │ │ └── favourite │ │ │ │ ├── favourite.component.css │ │ │ │ ├── favourite.component.html │ │ │ │ ├── favourite.component.spec.ts │ │ │ │ └── favourite.component.ts │ │ ├── footer │ │ │ ├── footer.component.css │ │ │ ├── footer.component.html │ │ │ ├── footer.component.spec.ts │ │ │ └── footer.component.ts │ │ ├── forget-password-page │ │ │ ├── request-reset │ │ │ │ ├── request-reset.component.css │ │ │ │ ├── request-reset.component.html │ │ │ │ ├── request-reset.component.spec.ts │ │ │ │ └── request-reset.component.ts │ │ │ ├── response-reset-password │ │ │ │ ├── response-reset-password.component.css │ │ │ │ ├── response-reset-password.component.html │ │ │ │ ├── response-reset-password.component.spec.ts │ │ │ │ └── response-reset-password.component.ts │ │ │ └── success-modal │ │ │ │ ├── success-modal.component.css │ │ │ │ ├── success-modal.component.html │ │ │ │ ├── success-modal.component.spec.ts │ │ │ │ └── success-modal.component.ts │ │ ├── go-to-login │ │ │ ├── go-to-login.component.css │ │ │ ├── go-to-login.component.html │ │ │ ├── go-to-login.component.spec.ts │ │ │ └── go-to-login.component.ts │ │ ├── home-page │ │ │ ├── banner │ │ │ │ ├── banner.component.css │ │ │ │ ├── banner.component.html │ │ │ │ ├── banner.component.spec.ts │ │ │ │ └── banner.component.ts │ │ │ ├── home │ │ │ │ ├── home.component.css │ │ │ │ ├── home.component.html │ │ │ │ ├── home.component.spec.ts │ │ │ │ └── home.component.ts │ │ │ ├── horizontall-scroll │ │ │ │ ├── horizontall-scroll.component.css │ │ │ │ ├── horizontall-scroll.component.html │ │ │ │ ├── horizontall-scroll.component.spec.ts │ │ │ │ └── horizontall-scroll.component.ts │ │ │ ├── sellers-section │ │ │ │ ├── sellers-section.component.css │ │ │ │ ├── sellers-section.component.html │ │ │ │ ├── sellers-section.component.spec.ts │ │ │ │ └── sellers-section.component.ts │ │ │ ├── top-selling-products │ │ │ │ ├── top-selling-products.component.css │ │ │ │ ├── top-selling-products.component.html │ │ │ │ ├── top-selling-products.component.spec.ts │ │ │ │ └── top-selling-products.component.ts │ │ │ ├── top2sellers │ │ │ │ ├── top2sellers.component.css │ │ │ │ ├── top2sellers.component.html │ │ │ │ ├── top2sellers.component.spec.ts │ │ │ │ └── top2sellers.component.ts │ │ │ └── workshop-home-section │ │ │ │ ├── workshop-home-section.component.css │ │ │ │ ├── workshop-home-section.component.html │ │ │ │ ├── workshop-home-section.component.spec.ts │ │ │ │ └── workshop-home-section.component.ts │ │ ├── landing-page │ │ │ ├── landing-page.component.css │ │ │ ├── landing-page.component.html │ │ │ ├── landing-page.component.spec.ts │ │ │ └── landing-page.component.ts │ │ ├── navbar │ │ │ ├── header │ │ │ │ ├── header.component.css │ │ │ │ ├── header.component.html │ │ │ │ ├── header.component.spec.ts │ │ │ │ └── header.component.ts │ │ │ ├── notification │ │ │ │ ├── notification.component.css │ │ │ │ ├── notification.component.html │ │ │ │ ├── notification.component.spec.ts │ │ │ │ └── notification.component.ts │ │ │ ├── search-bar │ │ │ │ ├── search-bar.component.css │ │ │ │ ├── search-bar.component.html │ │ │ │ ├── search-bar.component.spec.ts │ │ │ │ └── search-bar.component.ts │ │ │ └── sidebar │ │ │ │ ├── sidebar.component.css │ │ │ │ ├── sidebar.component.html │ │ │ │ ├── sidebar.component.spec.ts │ │ │ │ └── sidebar.component.ts │ │ ├── products-page │ │ │ ├── filter │ │ │ │ ├── filter.component.css │ │ │ │ ├── filter.component.html │ │ │ │ ├── filter.component.spec.ts │ │ │ │ └── filter.component.ts │ │ │ ├── product-card │ │ │ │ ├── product-card.component.css │ │ │ │ ├── product-card.component.html │ │ │ │ ├── product-card.component.spec.ts │ │ │ │ └── product-card.component.ts │ │ │ ├── product-details │ │ │ │ ├── product-details.component.css │ │ │ │ ├── product-details.component.html │ │ │ │ ├── product-details.component.spec.ts │ │ │ │ └── product-details.component.ts │ │ │ └── products │ │ │ │ ├── products-page.component.css │ │ │ │ ├── products-page.component.html │ │ │ │ ├── products-page.component.spec.ts │ │ │ │ └── products-page.component.ts │ │ ├── profile │ │ │ ├── animated-number │ │ │ │ ├── animated-number.component.css │ │ │ │ ├── animated-number.component.html │ │ │ │ ├── animated-number.component.spec.ts │ │ │ │ └── animated-number.component.ts │ │ │ ├── edit-profile │ │ │ │ ├── edit-profile.component.css │ │ │ │ ├── edit-profile.component.html │ │ │ │ ├── edit-profile.component.spec.ts │ │ │ │ └── edit-profile.component.ts │ │ │ └── user-profile │ │ │ │ ├── user-profile.component.css │ │ │ │ ├── user-profile.component.html │ │ │ │ ├── user-profile.component.spec.ts │ │ │ │ └── user-profile.component.ts │ │ ├── registration-page │ │ │ ├── registration │ │ │ │ ├── registration.component.css │ │ │ │ ├── registration.component.html │ │ │ │ ├── registration.component.spec.ts │ │ │ │ └── registration.component.ts │ │ │ ├── signin │ │ │ │ ├── signin.component.css │ │ │ │ ├── signin.component.html │ │ │ │ ├── signin.component.spec.ts │ │ │ │ └── signin.component.ts │ │ │ └── signup │ │ │ │ ├── signup.component.css │ │ │ │ ├── signup.component.html │ │ │ │ ├── signup.component.spec.ts │ │ │ │ └── signup.component.ts │ │ ├── seller-orders-page │ │ │ ├── seller-order-card │ │ │ │ ├── seller-order-card.component.css │ │ │ │ ├── seller-order-card.component.html │ │ │ │ ├── seller-order-card.component.spec.ts │ │ │ │ └── seller-order-card.component.ts │ │ │ └── seller-orders │ │ │ │ ├── seller-orders.component.css │ │ │ │ ├── seller-orders.component.html │ │ │ │ ├── seller-orders.component.spec.ts │ │ │ │ └── seller-orders.component.ts │ │ ├── seller-products-page │ │ │ ├── seller-product-card │ │ │ │ ├── seller-product-card.component.css │ │ │ │ ├── seller-product-card.component.html │ │ │ │ ├── seller-product-card.component.spec.ts │ │ │ │ └── seller-product-card.component.ts │ │ │ └── seller-products │ │ │ │ ├── seller-products.component.css │ │ │ │ ├── seller-products.component.html │ │ │ │ ├── seller-products.component.spec.ts │ │ │ │ └── seller-products.component.ts │ │ ├── seller-workshop-page │ │ │ ├── myworkshop │ │ │ │ ├── myworkshop.component.css │ │ │ │ ├── myworkshop.component.html │ │ │ │ └── myworkshop.component.ts │ │ │ └── sellerworkshops │ │ │ │ ├── sellerworkshops.component.css │ │ │ │ ├── sellerworkshops.component.html │ │ │ │ ├── sellerworkshops.component.spec.ts │ │ │ │ └── sellerworkshops.component.ts │ │ ├── sellers-page │ │ │ ├── sellercard │ │ │ │ ├── sellercard.component.css │ │ │ │ ├── sellercard.component.html │ │ │ │ ├── sellercard.component.spec.ts │ │ │ │ └── sellercard.component.ts │ │ │ └── sellers │ │ │ │ ├── sellers.component.css │ │ │ │ ├── sellers.component.html │ │ │ │ ├── sellers.component.spec.ts │ │ │ │ └── sellers.component.ts │ │ ├── spinner │ │ │ ├── spinner.component.css │ │ │ ├── spinner.component.html │ │ │ ├── spinner.component.spec.ts │ │ │ └── spinner.component.ts │ │ ├── stripe │ │ │ ├── stripe.component.css │ │ │ ├── stripe.component.html │ │ │ ├── stripe.component.spec.ts │ │ │ └── stripe.component.ts │ │ └── workshop-page │ │ │ ├── workshop-card │ │ │ ├── workshop-card.component.css │ │ │ ├── workshop-card.component.html │ │ │ ├── workshop-card.component.spec.ts │ │ │ └── workshop-card.component.ts │ │ │ └── workshop-page │ │ │ ├── workshop-page.component.css │ │ │ ├── workshop-page.component.html │ │ │ ├── workshop-page.component.spec.ts │ │ │ └── workshop-page.component.ts │ ├── directives │ │ ├── drag.directive.spec.ts │ │ ├── drag.directive.ts │ │ ├── set-direction.directive.spec.ts │ │ └── set-direction.directive.ts │ ├── error │ │ ├── error.component.css │ │ ├── error.component.html │ │ └── error.component.ts │ ├── guard │ │ ├── auth.guard.spec.ts │ │ ├── auth.guard.ts │ │ ├── customer.guard.spec.ts │ │ ├── customer.guard.ts │ │ ├── seller.guard.spec.ts │ │ └── seller.guard.ts │ ├── helpers │ │ ├── AuthConfig.interceptor.ts │ │ ├── auth.interceptor.ts │ │ ├── cache.interceptor.ts │ │ └── loading.interceptor.ts │ ├── model │ │ ├── cart.model.ts │ │ ├── category.model.ts │ │ ├── file-handler.model.ts │ │ ├── order.model.ts │ │ ├── product.model.ts │ │ ├── seller.model.ts │ │ ├── userProfile.model.ts │ │ └── workshop.model.ts │ ├── pipes │ │ ├── time-ago.pipe.spec.ts │ │ └── time-ago.pipe.ts │ └── services │ │ ├── auth │ │ ├── auth.service.spec.ts │ │ └── auth.service.ts │ │ ├── cart │ │ ├── cart.service.spec.ts │ │ └── cart.service.ts │ │ ├── favorite │ │ ├── favourite.service.spec.ts │ │ └── favourite.service.ts │ │ ├── loader │ │ ├── loader.service.spec.ts │ │ └── loader.service.ts │ │ ├── order │ │ ├── order.service.spec.ts │ │ └── order.service.ts │ │ ├── payment │ │ ├── payment.service.spec.ts │ │ └── payment.service.ts │ │ ├── product │ │ ├── product.service.spec.ts │ │ └── product.service.ts │ │ ├── seller │ │ ├── seller.service.spec.ts │ │ └── seller.service.ts │ │ ├── token │ │ ├── token-storage.service.spec.ts │ │ └── token-storage.service.ts │ │ ├── user │ │ ├── user.service.spec.ts │ │ └── user.service.ts │ │ └── workshop │ │ ├── workshop.service.spec.ts │ │ └── workshop.service.ts ├── assets │ ├── .gitkeep │ ├── Images │ │ ├── 1600w-dzssuRtOTn8.webp │ │ ├── 20210902_103708.jpg │ │ ├── assortment-with-clay-pots.jpg │ │ ├── banner1.jpg │ │ ├── banner2.jpg │ │ ├── banner3.jpg │ │ ├── banner4.jpg │ │ ├── emptyWishList.jpg │ │ ├── emptycart.jpg │ │ ├── hands-creating-design-with-needle-sewing-thread.jpg │ │ ├── pexels-amina-filkins-5409681.jpg │ │ ├── pexels-amina-filkins-5409703.jpg │ │ ├── pexels-anna-shvets-5760814.jpg │ │ ├── pexels-askar-abayev-6190983.jpg │ │ ├── pexels-askar-abayev-6190985.jpg │ │ ├── pexels-brett-sayles-6424244.jpg │ │ ├── pexels-cottonbro-studio-3738098.jpg │ │ ├── pexels-cottonbro-studio-6694304.jpg │ │ ├── pexels-digital-buggu-186846.jpg │ │ ├── pexels-dominika-roseclay-2089949.jpg │ │ ├── pexels-eneida-nieves-905844.jpg │ │ ├── pexels-giovana-spiller-6679220.jpg │ │ ├── pexels-hitesh-choudhary-909495.jpg │ │ ├── pexels-jenny-mavimiro-14579871.jpg │ │ ├── pexels-julie-aagaard-2766335.jpg │ │ ├── pexels-lil-artsy-3427720.jpg │ │ ├── pexels-mikhail-nilov-9304551.jpg │ │ ├── pexels-min-an-713661.jpg │ │ ├── pexels-monicore-135486.jpg │ │ ├── pexels-monstera-5302891.jpg │ │ ├── pexels-olga-kalinina-a10824516.jpg │ │ ├── pexels-regiane-tosatti-22823.jpg │ │ ├── pexels-vincent-rivaud-2333855.jpg │ │ ├── pexels-vlada-karpovich-6755860.jpg │ │ ├── unfinished-jug.jpg │ │ └── woman-craftmaster-pottery-shop.jpg │ ├── i18n │ │ ├── ar.json │ │ └── en.json │ └── svg │ │ ├── cash.svg │ │ ├── forget-password.svg │ │ ├── money.svg │ │ ├── revenue.svg │ │ └── sendmail.svg ├── environments │ └── environment.ts ├── favicon.ico ├── index.html ├── main.ts └── styles.css ├── tsconfig.app.json ├── tsconfig.json └── tsconfig.spec.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = false 9 | trim_trailing_whitespace = true 10 | 11 | [*.ts] 12 | quote_type = single 13 | 14 | [*.md] 15 | max_line_length = off 16 | trim_trailing_whitespace = false 17 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "threadsandbeads-4863e" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # Compiled output 4 | /dist 5 | /tmp 6 | /out-tsc 7 | /bazel-out 8 | 9 | # Node 10 | /node_modules 11 | npm-debug.log 12 | yarn-error.log 13 | 14 | # IDEs and editors 15 | .idea/ 16 | .project 17 | .classpath 18 | .c9/ 19 | *.launch 20 | .settings/ 21 | *.sublime-workspace 22 | 23 | # Visual Studio Code 24 | .vscode/* 25 | !.vscode/settings.json 26 | !.vscode/tasks.json 27 | !.vscode/launch.json 28 | !.vscode/extensions.json 29 | .history/* 30 | 31 | # Miscellaneous 32 | /.angular/cache 33 | .sass-cache/ 34 | /connect.lock 35 | /coverage 36 | /libpeerconnection.log 37 | testem.log 38 | /typings 39 | 40 | # System files 41 | .DS_Store 42 | Thumbs.db 43 | 44 | .vscode 45 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "dist/handmade-project", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ], 9 | "rewrites": [ 10 | { 11 | "source": "**", 12 | "destination": "/index.html" 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "handmade-project", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "watch": "ng build --watch --configuration development", 9 | "test": "ng test", 10 | "extract-translations": "ngx-translate-extract --input ./src --output ./src/assets/i18n/en.json ./src/assets/i18n/ar.json --clean --sort --format namespaced-json --marker _" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@abacritt/angularx-social-login": "2.0", 15 | "@angular/animations": "^16.0.1", 16 | "@angular/cdk": "^16.0.1", 17 | "@angular/common": "^16.0.1", 18 | "@angular/compiler": "^16.0.1", 19 | "@angular/core": "^16.0.1", 20 | "@angular/forms": "^16.0.1", 21 | "@angular/material": "^16.0.1", 22 | "@angular/platform-browser": "^16.0.1", 23 | "@angular/platform-browser-dynamic": "^16.0.1", 24 | "@angular/router": "^16.0.1", 25 | "@biesbjerg/ngx-translate-extract": "^7.0.4", 26 | "@ng-bootstrap/ng-bootstrap": "^14.1.1", 27 | "@ngx-translate/core": "^15.0.0", 28 | "@ngx-translate/http-loader": "^8.0.0", 29 | "@popperjs/core": "^2.11.7", 30 | "@types/socket.io-client": "^3.0.0", 31 | "bootstrap": "^5.2.3", 32 | "bootstrap-icons": "^1.10.5", 33 | "jquery": "^3.6.4", 34 | "rxjs": "~7.8.0", 35 | "socket.io-client": "^4.6.1", 36 | "tslib": "^2.3.0", 37 | "zone.js": "~0.13.0" 38 | }, 39 | "devDependencies": { 40 | "@angular-devkit/build-angular": "^16.0.1", 41 | "@angular/cli": "~16.0.1", 42 | "@angular/compiler-cli": "^16.0.1", 43 | "@bartholomej/ngx-translate-extract": "^8.0.2", 44 | "@types/bootstrap": "^5.2.6", 45 | "@types/jasmine": "~4.3.0", 46 | "@types/jquery": "^3.5.16", 47 | "jasmine-core": "~4.5.0", 48 | "karma": "~6.4.0", 49 | "karma-chrome-launcher": "~3.1.0", 50 | "karma-coverage": "~2.2.0", 51 | "karma-jasmine": "~5.1.0", 52 | "karma-jasmine-html-reporter": "~2.0.0", 53 | "typescript": "~4.9.4" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/app/app.component.css: -------------------------------------------------------------------------------- 1 | .all-container{ 2 | min-height:80vh; 3 | } -------------------------------------------------------------------------------- /src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 4 |
5 | 6 |
7 | 8 | 9 | 10 | 11 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | 5 | describe('AppComponent', () => { 6 | beforeEach(async () => { 7 | await TestBed.configureTestingModule({ 8 | imports: [ 9 | RouterTestingModule 10 | ], 11 | declarations: [ 12 | AppComponent 13 | ], 14 | }).compileComponents(); 15 | }); 16 | 17 | it('should create the app', () => { 18 | const fixture = TestBed.createComponent(AppComponent); 19 | const app = fixture.componentInstance; 20 | expect(app).toBeTruthy(); 21 | }); 22 | 23 | it(`should have as title 'handmadeProject'`, () => { 24 | const fixture = TestBed.createComponent(AppComponent); 25 | const app = fixture.componentInstance; 26 | expect(app.title).toEqual('handmadeProject'); 27 | }); 28 | 29 | it('should render title', () => { 30 | const fixture = TestBed.createComponent(AppComponent); 31 | fixture.detectChanges(); 32 | const compiled = fixture.nativeElement as HTMLElement; 33 | expect(compiled.querySelector('.content span')?.textContent).toContain('handmadeProject app is running!'); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | 4 | @Component({ 5 | selector: 'app-root', 6 | templateUrl: './app.component.html', 7 | styleUrls: ['./app.component.css'] 8 | }) 9 | export class AppComponent { 10 | constructor(public router: Router){ 11 | 12 | } 13 | title = 'handmadeProject'; 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/app/components/about-us/about-us.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 |
7 |
8 | {{"AboutUs.title" | translate}}

9 | 10 |
11 |
12 | 13 |
14 |

{{"AboutUs.slogan" | translate}}

15 |
16 | 17 |
18 |
19 | {{"AboutUs.canva" | translate}} 21 |
22 |
23 | 24 |
25 |
26 | {{"AboutUs.Fiber" | translate}} 28 | 29 |
30 |
31 | 32 |
33 |
34 | {{"AboutUs.Jewelry" | translate}} 36 |
37 |
38 | 39 |
40 |
41 |

{{"AboutUs.brief" | translate}}

42 | 43 |
44 |
45 | 46 |
47 |
48 | {{"AboutUs.thankyou" | translate}} 49 |
50 |
51 | 52 | 53 | 54 | 55 | 56 |
-------------------------------------------------------------------------------- /src/app/components/about-us/about-us.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-about-us', 5 | templateUrl: './about-us.component.html', 6 | styleUrls: ['./about-us.component.css'] 7 | }) 8 | export class AboutUsComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/components/cart-page/cart-products/cart-products.component.css: -------------------------------------------------------------------------------- 1 | .cart-container{ 2 | display: block; 3 | max-width: 900px; 4 | overflow-x: auto; 5 | } 6 | .table{ 7 | border: 1px solid #e8e8e8; 8 | border-collapse: collapse; 9 | 10 | } 11 | 12 | .table td, 13 | .table th{ 14 | vertical-align: middle; 15 | padding: 15px; 16 | } 17 | 18 | .table th{ 19 | border-bottom: 1px solid #e8e8e8; 20 | line-height: 2; 21 | letter-spacing: 2px; 22 | font-size: 18px; 23 | font-weight: 500; 24 | } 25 | 26 | .table td .product-name{ 27 | line-height: 2; 28 | letter-spacing: 1.5px; 29 | } 30 | 31 | .table td img{ 32 | width: 70px ; 33 | height: 85px ; 34 | } 35 | 36 | .table td input{ 37 | width: 110px; 38 | padding: 5px 30px; 39 | text-align: center; 40 | } 41 | 42 | .table .bi{ 43 | cursor: pointer; 44 | margin: auto 0; 45 | } 46 | 47 | .table td .bi-dash, 48 | .table td .bi-plus{ 49 | position: absolute; 50 | top: 50%; 51 | transform: translateY(-50%); 52 | } 53 | 54 | .table td .bi-dash{ 55 | left: 25px; 56 | } 57 | 58 | .table td .bi-plus{ 59 | left: 95px; 60 | } 61 | 62 | .table td .bi-x:hover { 63 | color: #A20A0A; 64 | } 65 | 66 | .table tfoot button{ 67 | padding: 8px 15px; 68 | text-transform: uppercase; 69 | border: 2px solid #A20A0A; 70 | transition: background-color 0.5s ease-in-out, color 0.5s ease-in-out; 71 | color: white; 72 | background-color: #A20A0A; 73 | } 74 | 75 | 76 | .table tfoot button:hover{ 77 | background-color: transparent; 78 | color: black; 79 | } -------------------------------------------------------------------------------- /src/app/components/cart-page/cart-products/cart-products.component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 | 19 | 34 | 37 | 40 | 41 | 42 | 43 | 44 | 61 | 62 | 63 |
{{ "cart.productName" | translate }}{{ "cart.productPrice" | translate }}{{ "cart.productQuantity" | translate }}{{ "cart.productTotalPrice" | translate }}
13 | 14 |

15 | {{ product.productId.name }} 16 |

17 |
EGP {{ product.productId.actualPrice }} 20 | 24 | 32 | 33 | 35 | EGP {{ product.productId.actualPrice * product.quantity }} 36 | 38 | 39 |
45 |
46 | 47 | 51 | {{ "cart.backToShopping" | translate }} 53 | 54 |
55 | 58 |
59 |
60 |
64 |
65 | -------------------------------------------------------------------------------- /src/app/components/cart-page/cart-products/cart-products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CartProductsComponent } from './cart-products.component'; 4 | 5 | describe('CartProductsComponent', () => { 6 | let component: CartProductsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ CartProductsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(CartProductsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/cart-page/cart/cart.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CartComponent } from './cart.component'; 4 | 5 | describe('CartComponent', () => { 6 | let component: CartComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [CartComponent] 12 | }); 13 | fixture = TestBed.createComponent(CartComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/cart-page/empty-cart/empty-cart.component.css: -------------------------------------------------------------------------------- 1 | button{ 2 | padding: 10px 50px; 3 | border: 2px solid #A20A0A; 4 | margin: 5px; 5 | border-radius: 5px; 6 | } 7 | 8 | .goBack{ 9 | background-color: transparent; 10 | transition: background-color 0.5s ease-in-out, color 0.5s ease-in-out; 11 | } 12 | 13 | .goBack:hover{ 14 | background-color: #A20A0A; 15 | color: white; 16 | } 17 | 18 | .shop{ 19 | background-color: #A20A0A; 20 | color: white; 21 | transition: background-color 0.5s ease-in-out, color 0.5s ease-in-out; 22 | } 23 | 24 | .shop:hover{ 25 | background-color: transparent; 26 | color: black; 27 | } 28 | -------------------------------------------------------------------------------- /src/app/components/cart-page/empty-cart/empty-cart.component.html: -------------------------------------------------------------------------------- 1 |
2 | Empty Cart 3 |

{{ "emptyCart.empty" | translate }}

4 |

{{ "emptyCart.paragraph" | translate }}.

5 |
6 | 7 | 8 |
9 |
-------------------------------------------------------------------------------- /src/app/components/cart-page/empty-cart/empty-cart.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EmptyCartComponent } from './empty-cart.component'; 4 | 5 | describe('EmptyCartComponent', () => { 6 | let component: EmptyCartComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ EmptyCartComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(EmptyCartComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/cart-page/empty-cart/empty-cart.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Location } from '@angular/common'; 3 | 4 | @Component({ 5 | selector: 'app-empty-cart', 6 | templateUrl: './empty-cart.component.html', 7 | styleUrls: ['./empty-cart.component.css'], 8 | }) 9 | export class EmptyCartComponent { 10 | constructor(private location: Location) {} 11 | 12 | goBack(): void { 13 | this.location.back(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/app/components/checkout/checkout.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CheckoutComponent } from './checkout.component'; 4 | 5 | describe('CheckoutComponent', () => { 6 | let component: CheckoutComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [CheckoutComponent] 12 | }); 13 | fixture = TestBed.createComponent(CheckoutComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/client-orders/client-orders.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ClientOrdersComponent } from './client-orders.component'; 4 | 5 | describe('ClientOrdersComponent', () => { 6 | let component: ClientOrdersComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [ClientOrdersComponent] 12 | }); 13 | fixture = TestBed.createComponent(ClientOrdersComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/contact-us/contact-us.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ContactUsComponent } from './contact-us.component'; 4 | 5 | describe('ContactUsComponent', () => { 6 | let component: ContactUsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ContactUsComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ContactUsComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/contact-us/contact-us.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-contact-us', 5 | templateUrl: './contact-us.component.html', 6 | styleUrls: ['./contact-us.component.css'] 7 | }) 8 | export class ContactUsComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/components/create-product/add-new-product.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { AddNewProductComponent } from './add-new-product.component'; 4 | 5 | describe('AddNewProductComponent', () => { 6 | let component: AddNewProductComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ AddNewProductComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(AddNewProductComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/create-workshop/create-workshop.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { CreateWorkshopComponent } from './create-workshop.component'; 4 | 5 | describe('CreateWorkshopComponent', () => { 6 | let component: CreateWorkshopComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [CreateWorkshopComponent] 12 | }); 13 | fixture = TestBed.createComponent(CreateWorkshopComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/edit-product/edit-product.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EditProductComponent } from './edit-product.component'; 4 | 5 | describe('EditProductComponent', () => { 6 | let component: EditProductComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [EditProductComponent] 12 | }); 13 | fixture = TestBed.createComponent(EditProductComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/edit-workshop/edit-workshop.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EditWorkshopComponent } from './edit-workshop.component'; 4 | 5 | describe('EditWorkshopComponent', () => { 6 | let component: EditWorkshopComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [EditWorkshopComponent] 12 | }); 13 | fixture = TestBed.createComponent(EditWorkshopComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/empty-favourites/empty-favourites.component.css: -------------------------------------------------------------------------------- 1 | button{ 2 | padding: 10px 50px; 3 | border: 2px solid #A20A0A; 4 | margin: 5px; 5 | border-radius: 5px; 6 | } 7 | 8 | .shop{ 9 | background-color: #A20A0A; 10 | color: white; 11 | transition: background-color 0.5s ease-in-out, color 0.5s ease-in-out; 12 | } 13 | 14 | .shop:hover{ 15 | background-color: transparent; 16 | color: black; 17 | } 18 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/empty-favourites/empty-favourites.component.html: -------------------------------------------------------------------------------- 1 |
2 | Empty Cart 3 |

{{ "emptyWishList.empty" | translate }}

4 |

{{ "emptyWishList.paragraph" | translate }}.

5 |
6 | 7 |
8 |
-------------------------------------------------------------------------------- /src/app/components/favorite-page/empty-favourites/empty-favourites.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { EmptyFavouritesComponent } from './empty-favourites.component'; 4 | 5 | describe('EmptyFavouritesComponent', () => { 6 | let component: EmptyFavouritesComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [EmptyFavouritesComponent] 12 | }); 13 | fixture = TestBed.createComponent(EmptyFavouritesComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/empty-favourites/empty-favourites.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-empty-favourites', 5 | templateUrl: './empty-favourites.component.html', 6 | styleUrls: ['./empty-favourites.component.css'] 7 | }) 8 | export class EmptyFavouritesComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite-products/favourite-products.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 7 |
8 | Product 13 |
14 |
15 |
16 |

{{ product.product.name }}

17 |
18 |
19 |

20 | {{ product.product.category }} 21 |

22 |
23 | 33 |
34 |
35 |
36 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite-products/favourite-products.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FavouriteProductsComponent } from './favourite-products.component'; 4 | 5 | describe('FavouriteProductsComponent', () => { 6 | let component: FavouriteProductsComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [FavouriteProductsComponent] 12 | }); 13 | fixture = TestBed.createComponent(FavouriteProductsComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite-products/favourite-products.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Input } from '@angular/core'; 2 | import { FavouriteService } from 'src/app/services/favorite/favourite.service'; 3 | 4 | @Component({ 5 | selector: 'app-favourite-products', 6 | templateUrl: './favourite-products.component.html', 7 | styleUrls: ['./favourite-products.component.css'], 8 | }) 9 | export class FavouriteProductsComponent { 10 | @Input() product: any; 11 | 12 | constructor(private favouriteService: FavouriteService) {} 13 | 14 | deleteProduct(productId: any) { 15 | this.favouriteService.deleteProduct(productId).subscribe({ 16 | next: () => { 17 | this.favouriteService.favoritesUpdatedSubject.next(); 18 | }, 19 | error: (error) => { 20 | console.log(error); 21 | }, 22 | }); 23 | } 24 | 25 | addToCart(productId: any){ 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite/favourite.component.css: -------------------------------------------------------------------------------- 1 | .clear button{ 2 | padding: 8px 15px; 3 | text-transform: uppercase; 4 | border: 2px solid #A20A0A; 5 | transition: background-color 0.5s ease-in-out, color 0.5s ease-in-out; 6 | color: white; 7 | background-color: #A20A0A; 8 | } 9 | 10 | 11 | .clear button:hover{ 12 | background-color: transparent; 13 | color: black; 14 | } -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite/favourite.component.html: -------------------------------------------------------------------------------- 1 |
2 |
6 | 9 |
10 |
14 |
18 | 19 |
20 |
21 |
25 | 26 |
27 |
28 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite/favourite.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FavouriteComponent } from './favourite.component'; 4 | 5 | describe('FavouriteComponent', () => { 6 | let component: FavouriteComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(() => { 10 | TestBed.configureTestingModule({ 11 | declarations: [FavouriteComponent] 12 | }); 13 | fixture = TestBed.createComponent(FavouriteComponent); 14 | component = fixture.componentInstance; 15 | fixture.detectChanges(); 16 | }); 17 | 18 | it('should create', () => { 19 | expect(component).toBeTruthy(); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /src/app/components/favorite-page/favourite/favourite.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectorRef, Component, OnInit } from '@angular/core'; 2 | import { FavouriteService } from 'src/app/services/favorite/favourite.service'; 3 | 4 | @Component({ 5 | selector: 'app-favourite', 6 | templateUrl: './favourite.component.html', 7 | styleUrls: ['./favourite.component.css'], 8 | }) 9 | export class FavouriteComponent implements OnInit { 10 | favouriteProducts: any[] = []; 11 | constructor(private favouriteService: FavouriteService, private cdr: ChangeDetectorRef) {} 12 | 13 | ngOnInit(): void { 14 | this.getFavouriteProducts(); 15 | this.favouriteService.favoritesUpdated$.subscribe(() => { 16 | this.getFavouriteProducts(); 17 | this.cdr.detectChanges(); 18 | }); 19 | } 20 | 21 | clearFavourite() { 22 | this.favouriteService.clearFavourite().subscribe({ 23 | next: () => { 24 | this.favouriteService.favoritesUpdatedSubject.next(); 25 | }, 26 | error: (error) => { 27 | console.log(error); 28 | }, 29 | }); 30 | } 31 | 32 | getFavouriteProducts() { 33 | this.favouriteService.getFavouritesProducts().subscribe({ 34 | next: (response: any) => { 35 | if (response.data && response.data.products) { 36 | this.favouriteProducts = response.data.products; 37 | } else { 38 | this.favouriteProducts = []; 39 | } 40 | }, 41 | error: (error) => { 42 | console.log(error); 43 | }, 44 | }); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/app/components/footer/footer.component.css: -------------------------------------------------------------------------------- 1 | .footer { 2 | z-index: 1; 3 | --footer-background: #0f0f0f; 4 | display: grid; 5 | position: relative; 6 | grid-area: footer; 7 | min-height: 10rem; 8 | left:0; 9 | bottom: 0; 10 | width: 100%; 11 | } 12 | .footer .content { 13 | z-index: 2; 14 | display: grid; 15 | background: var(--footer-background); 16 | } 17 | 18 | .footer .content a, .footer .content p { 19 | color: #f5f7fa; 20 | text-decoration: none; 21 | margin-right: 70%; 22 | } 23 | 24 | .footer .content b { 25 | color: white; 26 | margin-right: 70%; 27 | } 28 | 29 | .footer .content p { 30 | margin: 0; 31 | font-size: 1.2rem; 32 | } 33 | 34 | .logo { 35 | font-family: 'Delicious Handrawn', cursive; 36 | font-size: 40px; 37 | } 38 | 39 | h1{ 40 | color: white; 41 | font-size: 15px; 42 | } 43 | 44 | 45 | .social-links, 46 | .flex-center { 47 | display: flex; 48 | justify-content: center; 49 | align-items: center; 50 | } 51 | 52 | .social-btn { 53 | cursor: pointer; 54 | height: 40px; 55 | width: 40px; 56 | font-family: 'Titillium Web', sans-serif; 57 | color: #333; 58 | border-radius: 10px; 59 | box-shadow: 0px 10px 10px rgba(0, 0, 0, 0.1); 60 | background: white; 61 | margin: 5px; 62 | transition: 0.3s; 63 | justify-content: center; 64 | } 65 | 66 | .social-btn svg { 67 | height: 24px; 68 | width: 24px; 69 | } 70 | 71 | .social-btn span { 72 | width: 0px; 73 | overflow: hidden; 74 | transition: 0.3s; 75 | text-align: center; 76 | margin-left: 5px; 77 | } 78 | 79 | .social-btn:hover { 80 | width: 150px; 81 | border-radius: 5px; 82 | } 83 | 84 | .social-btn:hover span { 85 | padding: 2px; 86 | width: 80px; 87 | } 88 | 89 | #twitter svg { 90 | fill: #1da1f2; 91 | } 92 | 93 | #linkedin svg { 94 | fill: #0e76a8; 95 | } 96 | 97 | #github { 98 | fill: #333; 99 | } 100 | 101 | .cr-con{ 102 | background-color:black ; 103 | } 104 | 105 | -------------------------------------------------------------------------------- /src/app/components/footer/footer.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { FooterComponent } from './footer.component'; 4 | 5 | describe('FooterComponent', () => { 6 | let component: FooterComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ FooterComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(FooterComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/footer/footer.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-footer', 5 | templateUrl: './footer.component.html', 6 | styleUrls: ['./footer.component.css'] 7 | }) 8 | export class FooterComponent { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/app/components/forget-password-page/request-reset/request-reset.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |

Forgot Password?

32 | 33 |
{{ errorMessage }}
34 |
{{ successMessage }}
35 | Please enter a valid email! 36 |
37 | 38 |
39 |
40 |
41 |
42 |
43 |
44 | 45 | -------------------------------------------------------------------------------- /src/app/components/forget-password-page/request-reset/request-reset.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { RequestResetComponent } from './request-reset.component'; 4 | 5 | describe('RequestResetComponent', () => { 6 | let component: RequestResetComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ RequestResetComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(RequestResetComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/forget-password-page/request-reset/request-reset.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormControl, FormGroup, Validators } from '@angular/forms'; 3 | import { Router } from '@angular/router'; 4 | import { AuthService } from 'src/app/services/auth/auth.service'; 5 | import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; 6 | import { SuccessModalComponent } from 'src/app/components/forget-password-page/success-modal/success-modal.component'; 7 | @Component({ 8 | selector: 'app-request-reset', 9 | templateUrl: './request-reset.component.html', 10 | styleUrls: ['./request-reset.component.css'] 11 | }) 12 | export class RequestResetComponent implements OnInit { 13 | RequestResetForm: any; 14 | forbiddenEmails: any; 15 | errorMessage: any; 16 | successMessage: any; 17 | IsvalidForm = true; 18 | 19 | constructor( 20 | private authService: AuthService, 21 | private router: Router, 22 | private modalService: NgbModal 23 | ) {} 24 | 25 | ngOnInit() { 26 | this.RequestResetForm = new FormGroup({ 27 | email: new FormControl(null, [Validators.required, Validators.email], this.forbiddenEmails), 28 | }); 29 | } 30 | 31 | RequestResetUser(form: any) { 32 | if (form.valid) { 33 | this.IsvalidForm = true; 34 | this.authService.requestReset(this.RequestResetForm.value).subscribe({ 35 | next: (data) => { 36 | this.RequestResetForm.reset(); 37 | this.successMessage = 'Reset password link sent to email successfully.'; 38 | this.modalService.open(SuccessModalComponent, { centered: true }); 39 | }, 40 | error: (err) => { 41 | if (err.error.message) { 42 | this.errorMessage = err.error.message; 43 | } 44 | }, 45 | }); 46 | } else { 47 | this.IsvalidForm = false; 48 | } 49 | } 50 | } -------------------------------------------------------------------------------- /src/app/components/forget-password-page/response-reset-password/response-reset-password.component.html: -------------------------------------------------------------------------------- 1 |
5 |
6 |
7 |
10 |
11 |

Threads & Beads

14 |
15 |
16 |
21 |

Set New Password

22 | 30 | 31 |
32 | {{ errorMessage }} 33 |
34 |
35 | {{ successMessage }} 36 |
37 | Password is required with at least 6 characters. 44 |
45 | 49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | -------------------------------------------------------------------------------- /src/app/components/forget-password-page/response-reset-password/response-reset-password.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { ComponentFixture, TestBed } from '@angular/core/testing'; 2 | 3 | import { ResponseResetPasswordComponent } from './response-reset-password.component'; 4 | 5 | describe('ResposeResetPasswordComponent', () => { 6 | let component: ResponseResetPasswordComponent; 7 | let fixture: ComponentFixture; 8 | 9 | beforeEach(async () => { 10 | await TestBed.configureTestingModule({ 11 | declarations: [ ResponseResetPasswordComponent ] 12 | }) 13 | .compileComponents(); 14 | 15 | fixture = TestBed.createComponent(ResponseResetPasswordComponent); 16 | component = fixture.componentInstance; 17 | fixture.detectChanges(); 18 | }); 19 | 20 | it('should create', () => { 21 | expect(component).toBeTruthy(); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /src/app/components/forget-password-page/success-modal/success-modal.component.css: -------------------------------------------------------------------------------- 1 | .loader { 2 | position: relative; 3 | border-style: solid; 4 | box-sizing: border-box; 5 | border-width: 40px 60px 30px 60px; 6 | border-color: #3760C9 #96DDFC #96DDFC #36BBF7; 7 | animation: envFloating 1s ease-in infinite alternate; 8 | } 9 | 10 | .loader:after { 11 | content: ""; 12 | position: absolute; 13 | right: 62px; 14 | top: -40px; 15 | height: 70px; 16 | width: 50px; 17 | background-image: linear-gradient(#fff 45px, transparent 0), 18 | linear-gradient(#fff 45px, transparent 0), 19 | linear-gradient(#fff 45px, transparent 0); 20 | background-repeat: no-repeat; 21 | background-size: 30px 4px; 22 | background-position: 0px 11px, 8px 35px, 0px 60px; 23 | animation: envDropping 0.75s linear infinite; 24 | } 25 | 26 | @keyframes envFloating { 27 | 0% { 28 | transform: translate(-2px, -5px) 29 | } 30 | 31 | 100% { 32 | transform: translate(0, 5px) 33 | } 34 | } 35 | 36 | @keyframes envDropping { 37 | 0% { 38 | background-position: 100px 11px, 115px 35px, 105px 60px; 39 | opacity: 1; 40 | } 41 | 42 | 50% { 43 | background-position: 0px 11px, 20px 35px, 5px 60px; 44 | } 45 | 46 | 60% { 47 | background-position: -30px 11px, 0px 35px, -10px 60px; 48 | } 49 | 50 | 75%, 51 | 100% { 52 | background-position: -30px 11px, -30px 35px, -30px 60px; 53 | opacity: 0; 54 | } 55 | } 56 | 57 | .emailContainer{ 58 | transform: translate(166px, 10px); 59 | width: 100px; 60 | } 61 | 62 | /* .modal-content{ 63 | background-color: red !important; 64 | } */ -------------------------------------------------------------------------------- /src/app/components/forget-password-page/success-modal/success-modal.component.html: -------------------------------------------------------------------------------- 1 | 7 | 13 |