\n","import { AuthService } from './../../../auth/services/auth.service';\nimport { Component, Input, OnInit } from '@angular/core';\nimport { SessionService } from '../../services/session.service';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'app-user-dropdown',\n templateUrl: './user-dropdown.component.html',\n styleUrls: ['./user-dropdown.component.scss']\n})\nexport class UserDropdownComponent implements OnInit {\n\n @Input() showDropdown: boolean;\n @Input() name: string;\n isBackoffice = true;\n\n constructor(\n public authService: AuthService,\n private sessionService: SessionService,\n private router: Router\n ) { }\n\n ngOnInit(): void {\n\n }\n\n cancelToggle(e: Event): void {\n e.stopPropagation();\n }\n\n logout(): void {\n this.authService.logout().subscribe(\n r => {\n this.sessionService.resetSession().then(() => {\n this.router.navigate(['/']).then(() => location.reload());\n })\n },\n error => {\n console.error(\"Erro ao realizar logout:\", error);\n \n // Mesmo se der erro, limpa a session e envia para o login para um novo login e token.\n this.sessionService.resetSession().then(() => {\n this.router.navigate(['/']).then(() => location.reload());\n })\n }\n );\n \n } \n}\n","
\n
\n \n \n
\n
\n Olá, {{ name }}!\n
\n \n
\n\n
\n
\n
\n \n
\n
\n
\n","import { SessionService } from 'src/app/shared/services/session.service';\nimport { Injectable } from '@angular/core';\nimport {\n ActivatedRouteSnapshot,\n CanActivate,\n Router,\n RouterStateSnapshot,\n UrlTree,\n} from '@angular/router';\nimport { Observable } from 'rxjs';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class OnlyAuthGuard implements CanActivate {\n constructor(private sessionService: SessionService, private router: Router) {}\n\n canActivate(\n route: ActivatedRouteSnapshot,\n state: RouterStateSnapshot\n ):\n | Observable\n | Promise\n | boolean\n | UrlTree {\n return !!this.sessionService.getSession() || this.router.navigateByUrl('/');\n }\n}\n","import { environment } from 'src/environments/environment';\n\n/**\n * Decorator utlizado para fazer bind de uma propriedade no LocalStorage ou no SessionStorage dependendo do keepConnected\n * @param customName nome customizado, por padrão o nome ultilizado é o mesmo da propriedade\n * @param isPrefixed Argumento opcional que indica se sera utilizado o prefixo padrão\n */\nexport function Storage(customName?: string, isPrefixed = true) {\n return (\n target: any, // The prototype of the class\n decoratedPropertyName: string // The name of the property\n ) => {\n // get and set methods\n Object.defineProperty(target, decoratedPropertyName, {\n get: () => {\n const keepConnected: boolean = JSON.parse(\n localStorage.getItem(getKeyName('keepConnected', decoratedPropertyName))\n );\n\n const storage = keepConnected ? localStorage : sessionStorage;\n return JSON.parse(storage.getItem(getKeyName(customName, decoratedPropertyName, isPrefixed)));\n },\n set: (newValue) => {\n const keepConnected: boolean = JSON.parse(\n localStorage.getItem(getKeyName('keepConnected', decoratedPropertyName))\n );\n\n const storage = keepConnected ? localStorage : sessionStorage;\n storage.setItem(getKeyName(customName, decoratedPropertyName, isPrefixed), JSON.stringify(newValue));\n }\n });\n };\n}\n\n/**\n * Decorator utlizado para fazer bind de uma propriedade no LocalStorage\n * @param customName nome customizado, por padrão o nome ultilizado é o mesmo da propriedade\n * @param isPrefixed Argumento opcional que indica se sera utilizado o prefixo padrão\n */\nexport function LocalStorage(customName?: string, isPrefixed = true) {\n return (\n target: any, // The prototype of the class\n decoratedPropertyName: string // The name of the property\n ) => {\n\n // get and set methods\n Object.defineProperty(target, decoratedPropertyName, {\n get: () => {\n return JSON.parse(localStorage.getItem(getKeyName(customName, decoratedPropertyName, isPrefixed)));\n },\n set: (newValue) => {\n localStorage.setItem(getKeyName(customName, decoratedPropertyName, isPrefixed), JSON.stringify(newValue));\n }\n });\n };\n}\n\n/**\n * Decorator utlizado para fazer bind de uma propriedade no SessionStorage\n * @param customName nome customizado, por padrão o nome ultilizado é o mesmo da propriedade\n * @param isPrefixed Argumento opcional que indica se sera utilizado o prefixo padrão\n */\nexport function SessionStorage(customName?: string, isPrefixed = true) {\n return (\n target: any, // The prototype of the class\n decoratedPropertyName: string // The name of the property\n ) => {\n\n // get and set methods\n Object.defineProperty(target, decoratedPropertyName, {\n get: () => {\n return JSON.parse(sessionStorage.getItem(getKeyName(customName, decoratedPropertyName, isPrefixed)));\n },\n set: (newValue) => {\n sessionStorage.setItem(getKeyName(customName, decoratedPropertyName, isPrefixed), JSON.stringify(newValue));\n }\n });\n };\n}\n\n/**\n * \"Calcula\" o nome da key usado pelos decorators\n * @param customName nome customizado, por padrão o nome ultilizado é o mesmo da propriedade\n * @param decoratedPropertyName nome da propriedade decorada\n * @param isPrefixed determina se deve ultilizar o prefixo\n * @description este é um método auxiliar, a lógica deste método é usada tanto no decorator de local storage quanto no de session storage\n */\nfunction getKeyName(customName: string, decoratedPropertyName: string, isPrefixed = true) {\n let keyName = customName || decoratedPropertyName;\n if (isPrefixed) {\n keyName = `${environment.localStoragePrefix}_${keyName}`;\n }\n\n return keyName;\n}\n\nexport function setLocalStorage(key: string, value: any) {\n const keyName = `${environment.localStoragePrefix}_${key}`;\n localStorage.setItem(keyName, JSON.stringify(value));\n}\n\nexport function getLocalStorage(key: string) {\n const keyName = `${environment.localStoragePrefix}_${key}`;\n return JSON.parse(localStorage.getItem(keyName));\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'phone'\n})\nexport class PhonePipe implements PipeTransform {\n\n transform(value: string) {\n if (value) {\n let formatedValue: string;\n\n switch (value.length) {\n case 12:\n // Fax\n formatedValue = value.replace(/(\\d{2})(\\d{3})(\\d{3})(\\d{4})/g, '\\+$1 \\$2 \\$3 \\$4');\n break;\n\n case 11:\n // Cell phone\n formatedValue = value.replace(/(\\d{2})(\\d{1})(\\d{4})(\\d{4})/g, '\\($1) \\$2\\$3-\\$4');\n break;\n\n case 10:\n // Phone\n formatedValue = value.replace(/(\\d{2})(\\d{4})(\\d{4})/g, '\\($1) \\$2-\\$3');\n break;\n\n case 8:\n // Phone\n formatedValue = value.replace(/(\\d{4})(\\d{4})/g, '\\$1-\\$2');\n break;\n\n default:\n formatedValue = value;\n break;\n }\n\n return formatedValue;\n } else {\n return value;\n }\n }\n\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { PhonePipe } from './phone.pipe';\n\n@NgModule({\n declarations: [\n PhonePipe\n ],\n imports: [\n CommonModule\n ],\n exports: [\n PhonePipe\n ]\n})\nexport class PipesModule { }\n","import { DecodedJWT } from './../data/interfaces/session/decoded-jwt.interface';\nimport { SessionService } from './session.service';\nimport { Injectable } from '@angular/core';\nimport jwt_decode from 'jwt-decode';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AuthTokenService {\n constructor(private sessionService: SessionService) {}\n\n private getToken(): string {\n return this.sessionService.getSession().access_token;\n }\n\n public decodePayloadJWT(): DecodedJWT {\n try {\n return jwt_decode(this.getToken());\n } catch (Error) {\n return null;\n }\n }\n}\n","import { AuthTokenService } from './auth-token.service';\nimport { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class RolesService {\n constructor(private authToeknService: AuthTokenService) {}\n\n public checkPermission(permission: string): boolean {\n const session = this.authToeknService.decodePayloadJWT();\n const roles = session?.resource_access?.['portal-varejo']?.roles;\n\n if (roles) {\n return roles.includes(permission);\n }\n\n return false;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { ISession } from '../data/interfaces/session/session.interface';\nimport { SessionStorage } from '../helpers/local-storage.decorator';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SessionService {\n @SessionStorage('SESSION') session: ISession;\n protected _session$: BehaviorSubject;\n session$: Observable;\n\n constructor() {\n this._session$ = new BehaviorSubject(this.session);\n this.session$ = this._session$.asObservable();\n }\n\n public getSession(): ISession {\n return this.session;\n }\n\n public setSession(sessionDetails: ISession): void {\n this.session = sessionDetails;\n this._session$.next(this.session);\n }\n\n public async resetSession() {\n this._session$.next(null);\n return await sessionStorage.clear();\n }\n}\n","import { RouterModule } from '@angular/router';\nimport { UserDropdownComponent } from './components/user-dropdown/user-dropdown.component';\nimport { CoreNavbarComponent } from './components/core-navbar/core-navbar.component';\nimport { CoreSidebarComponent } from './components/core-sidebar/core-sidebar.component';\nimport { LoadingComponent } from './components/loading/loading.component';\nimport { AngularMaterialModule } from './angular-material.module';\nimport { MainLayoutComponent } from './components/main-layout/main-layout.component';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { HttpClientModule } from '@angular/common/http';\nimport { PipesModule } from './pipes/pipes.module';\nimport { NotFoundModule } from '../not-found/not-found.module';\n\n\n@NgModule({\n declarations: [\n MainLayoutComponent,\n LoadingComponent,\n CoreSidebarComponent,\n CoreNavbarComponent,\n UserDropdownComponent,\n ],\n imports: [\n CommonModule,\n MatSidenavModule,\n AngularMaterialModule,\n RouterModule,\n PipesModule,\n HttpClientModule,\n ],\n exports: [\n MainLayoutComponent,\n LoadingComponent,\n CoreSidebarComponent,\n CoreNavbarComponent,\n UserDropdownComponent,\n PipesModule,\n NotFoundModule\n ],\n providers: []\n})\nexport class SharedModule {}\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nexport const environment = {\n production: false,\n localStoragePrefix: 'RIHAPPY_PV_',\n keycloak: {\n url: '',\n clientId: '',\n clientSecret: '',\n },\n api: {\n base: 'https://portalloja-qa.gruporihappy.com.br',\n telemarketing: 'api/Telemarketing/',\n },\n role: {\n admin: 'admin',\n adminTelemarketing: 'telemarketing-admin'\n }\n};\n\n/*\n * For easier debugging in development mode, you can import the following file\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\n *\n * This import should be commented out in production mode because it will have a negative impact\n * on performance if an error is thrown.\n */\n// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.error(err));\n"],"names":[],"sourceRoot":"webpack:///"}