{"version":3,"file":"ottimis-ionic-utils.mjs","sources":["../../../projects/ionic-utils/src/lib/services/main.service.ts","../../../projects/ionic-utils/src/lib/Auth/auth.guard.ts","../../../projects/ionic-utils/src/lib/Auth/jwt.interceptor.ts","../../../projects/ionic-utils/src/lib/Auth/token.interceptor.ts","../../../projects/ionic-utils/src/lib/main.provider.ts","../../../projects/ionic-utils/src/public-api.ts","../../../projects/ionic-utils/src/ottimis-ionic-utils.ts"],"sourcesContent":["import {Injectable, Inject} from '@angular/core';\nimport { HttpClient, HttpHeaders, HttpParams, HttpResponse } from '@angular/common/http';\nimport {LoadingController} from '@ionic/angular/standalone';\nimport {BehaviorSubject, lastValueFrom, Observable} from 'rxjs';\nimport {Router} from '@angular/router';\nimport {InitConfig, Rest, RestBase, RestResult} from '../interfaces/interfaces';\nimport jwt_decode from 'jwt-decode';\n\nimport {\n  Camera,\n  CameraResultType,\n  ImageOptions,\n  CameraSource\n} from '@capacitor/camera';\nimport {Dialog} from '@capacitor/dialog';\nimport {Toast} from '@capacitor/toast';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class MainService {\n\n  endpoints = [''];\n  debug: boolean;\n  logged = new BehaviorSubject<boolean>(false);\n  loader!: HTMLIonLoadingElement;\n  permLoading!: boolean;\n  loaderDuration!: number;\n  loginUrl = '/login';\n  maintenanceUrl = '/maintenance';\n  headers: {\n    [key: string]: string\n  } = {};\n\n  constructor(\n    private http: HttpClient,\n    private router: Router,\n    private loadingCtrl: LoadingController,\n    @Inject('APP_ENVIRONMENT')\n    private config: InitConfig\n  ) {\n    this.endpoints = config.serverUrls;\n    this.debug = !config.production;\n    if (config.loginUrl !== undefined) {\n      this.loginUrl = config.loginUrl;\n    }\n    if (config.maintenanceUrl !== undefined) {\n      this.maintenanceUrl = config.maintenanceUrl;\n    }\n    if (config.customHeaders)  {\n      this.headers = config.customHeaders;\n    }\n  }\n\n  backDate(numOfDays: number) {\n    const today = new Date();\n    return new Date(today.setDate(today.getDate() - numOfDays));\n  }\n\n  logout() {\n    localStorage.removeItem('token_auth');\n    localStorage.removeItem('user');\n    this.logged.next(false);\n    this.router.navigate([this.loginUrl], {replaceUrl: true});\n  }\n\n  login(data: any): Promise<{}> {\n    return new Promise((resolve, reject) => {\n      localStorage.setItem('token_auth', data.token);\n      delete (data.token);\n      localStorage.setItem('logged', '1');\n      localStorage.setItem('user', JSON.stringify(data));\n      this.logged.next(true);\n      resolve({success: 1});\n    });\n  }\n\n  setUserData(data: any) {\n    let user = localStorage.getItem('user');\n    if (user) {\n      user = Object.assign(JSON.parse(user), data);\n      localStorage.setItem('user', JSON.stringify(user));\n    }\n  }\n\n  getUserData(data?: string) {\n    let user = localStorage.getItem('user');\n    if (user) {\n      const parsedUser = JSON.parse(user);\n      if (data && parsedUser[data] !== undefined) {\n        return parsedUser[data];\n      } else if (!data && user) {\n        return parsedUser;\n      } else {\n        return false;\n      }\n    }\n  }\n\n  deleteUserData(data: string) {\n    let user = localStorage.getItem('user');\n    if (user) {\n      const parsedUser = JSON.parse(user);\n      if (parsedUser[data] !== undefined) {\n        delete (parsedUser[data]);\n        localStorage.setItem('user', JSON.stringify(user));\n        return true;\n      }\n    }\n    return false;\n  }\n\n  getToken() {\n    const token = localStorage.getItem('token_auth');\n    return token ? token : false;\n  }\n\n  getTokenDecoded() {\n    try {\n      const token = this.getToken();\n      if (token) {\n        return jwt_decode(token);\n      } else {\n        return null;\n      }\n    } catch (Error) {\n      return null;\n    }\n  }\n\n  setToken(token: string) {\n    localStorage.setItem('token_auth', token);\n  }\n\n  async loaderOn(permLoading?: boolean) {\n    if (!this.loader) {\n      this.loader = await this.loadingCtrl.create({\n        duration: this.loaderDuration,\n        spinner: 'crescent'\n      });\n      if (permLoading) {\n        this.permLoading = true;\n      }\n\n      await this.loader.present();\n    }\n  }\n\n  loaderOff(removePerm?: boolean) {\n    if (this.loader && (removePerm || !this.permLoading)) {\n      this.loader.dismiss();\n      this.permLoading = false;\n    }\n  }\n\n  // Used to retrieve first working endpoint. Loop through all endpoints until one works or return the first one.\n  async getEndpoint() {\n    for (const endpoint of this.endpoints) {\n      const res = await this.rest({type: 'GET', path: ''})\n        .catch(() => {});\n      if (res) {\n        return endpoint;\n      }\n    }\n\n    return this.endpoints[0];\n  }\n\n  // Used for getting translations with custom loader\n  getRaw(path: string): Observable<any>  {\n    const obj: Rest = {\n      type: 'GET',\n      path,\n    };\n\n    return new Observable((observe) => {\n      this.rest(obj)\n        .then((res) => {\n          observe.next(res);\n        })\n    });\n  }\n\n  async rest(req: Rest): RestResult<RestBase> {\n    let endpoints = this.endpoints;\n    if (req.url)  {\n      endpoints = [req.url];\n    }\n    let lastError: any;\n\n    const params = req.queryParams\n      ? new HttpParams({ fromObject: req.queryParams })\n      : new HttpParams();\n    let h = req.httpHeaders || {};\n    if (this.headers) {\n      for (const key in this.headers) {\n        if (Object.prototype.hasOwnProperty.call(this.headers, key)) {\n          h[key] = this.headers[key];\n        }\n      }\n    }\n    const headers = new HttpHeaders(h);\n\n    for (const baseUrl of endpoints) {\n      const url = `${baseUrl}/${req.path}`;\n\n      try {\n        let response: HttpResponse<any>;\n\n        switch (req.type) {\n          case 'GET':\n            response = await lastValueFrom(this.http.get(url, {\n              headers,\n              params,\n              observe: 'response',\n              ...req.options,\n            }));\n            break;\n          case 'POST':\n            response = await lastValueFrom(this.http.post(url, req.body, {\n              headers,\n              params,\n              observe: 'response',\n              ...req.options\n            }));\n            break;\n          case 'PUT':\n            response = await lastValueFrom(this.http.put(url, req.body, {\n              headers,\n              params,\n              observe: 'response',\n              ...req.options\n            }));\n            break;\n          case 'PATCH':\n            response = await lastValueFrom(this.http.patch(url, req.body, {\n              headers,\n              params,\n              observe: 'response',\n              ...req.options\n            }));\n            break;\n          case 'DELETE':\n            response = await lastValueFrom(this.http.delete(url, {\n              headers,\n              params,\n              observe: 'response',\n              ...req.options\n            }));\n            break;\n          default:\n            throw new Error('Invalid request type. Request not supported. Use GET, POST, PUT, PATCH or DELETE');\n        }\n\n        // Check if the response has a new endpoint\n        // Always remember this: ->withHeader('Access-Control-Expose-Headers', 'New-API-Endpoint')\n        const newEndpoint = response.headers.get('New-API-Endpoint');\n        if (newEndpoint) {\n          this.updateEndpoint(newEndpoint);\n        }\n\n        if (response.ok) {\n          if (req.returnCurrent) {\n            response.body.currentEndpoint = baseUrl;\n          }\n          return response.body;\n        } else {\n          // If status is not 200, throw an error\n          lastError = new Error(`Status non atteso: ${response.status}`);\n        }\n      }  catch (err: any) {\n        // If network error, log and pass to next endpoint\n        lastError = err;\n        if (!this.isNetworkError(err)) {\n          // If not a network error, throw it\n          throw err;\n        }\n        // Otherwise, log the error\n        console.error(`Request failed for ${baseUrl}:`, err);\n      }\n    }\n    // If no endpoint worked, throw the last error\n    throw lastError;\n  }\n\n  /**\n   * Verify if the error is a network error\n   */\n  private isNetworkError(err: any): boolean {\n    return err.status === 0;\n  }\n\n  /**\n   * Update the endpoint list with the new endpoint\n   */\n  private updateEndpoint(newEndpoint: string): void {\n    console.log('Pre add', this.endpoints);\n    this.endpoints.unshift(newEndpoint);\n    console.log(`New endpoint added: ${newEndpoint}`, this.endpoints);\n  }\n\n  async showAlert(message: string, title = 'Attenzione') {\n    const alert = await Dialog.alert({\n      title,\n      message,\n      buttonTitle: 'Ok'\n    });\n    return alert;\n  }\n\n  async presentToast(message: string, position: 'top' | 'center' | 'bottom' = 'top', duration: 'short' | 'long' = 'short') {\n    return await Toast.show({\n      duration,\n      position,\n      text: message\n    });\n  }\n\n  async showConfirm(header: string, message: string, yes: string, no = 'Annulla') {\n    return await Dialog.confirm({\n      title: header,\n      message,\n      okButtonTitle: yes,\n      cancelButtonTitle: no\n    });\n  }\n\n  isLogged() {\n    const loggedStr = localStorage.getItem('logged');\n    if (loggedStr) {\n      const logged = JSON.parse(loggedStr);\n      this.logged.next(logged);\n      return logged;\n    } else {\n      return false;\n    }\n  }\n\n  selectPhoto(crop = false, quality = 75) {\n    return new Observable((observer) => {\n      const options: ImageOptions = {\n        quality,\n        source: CameraSource.Photos,\n        resultType: CameraResultType.Uri\n      };\n      Camera.getPhoto(options)\n        .then((photo) => {\n          observer.next(photo.path);\n        });\n    });\n  }\n\n  takePhoto(quality = 75) {\n    return new Observable((observer) => {\n      const options: ImageOptions = {\n        quality,\n        source: CameraSource.Camera,\n        resultType: CameraResultType.Uri,\n        correctOrientation: true\n      };\n      Camera.getPhoto(options)\n        .then((photo) => {\n          observer.next(photo.path);\n        });\n    });\n  }\n\n  arrayGen(n: number): any[] {\n    return Array(n);\n  }\n\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { MainService } from '../services/main.service';\nimport { ModalController } from '@ionic/angular/standalone';\n\nexport const AuthGuard: CanActivateFn = async (route, state) => {\n    const mainService = inject(MainService);\n    const router = inject(Router);\n    const modalCtrl = inject(ModalController);\n\n    const token = mainService.getToken();\n    if (token) {\n        mainService.logged.next(true);\n        return true;\n    } else {\n        mainService.logged.next(false);\n        while (await modalCtrl.getTop()) {\n            await modalCtrl.dismiss();\n        }\n        router.navigate([mainService.loginUrl], { queryParams: { returnUrl: state.url?.substring(1) } });\n        return false;\n    }\n};\n","import {inject} from '@angular/core';\nimport { HttpRequest, HttpEvent, HttpResponse, HttpErrorResponse, HttpHandlerFn } from '@angular/common/http';\nimport {Observable} from 'rxjs';\nimport {tap} from 'rxjs/operators';\nimport {Router} from '@angular/router';\nimport {MainService} from '../services/main.service';\nimport {ModalController} from '@ionic/angular/standalone';\n\nexport const JwtInterceptor = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n\n  const main = inject(MainService);\n  const router = inject(Router);\n  const modalCtrl = inject(ModalController);\n\n  // Clone the request object\n  let newReq = req.clone();\n\n  return next(newReq).pipe(tap(\n    {\n      next: (event: HttpEvent<any>) => {\n        if (event instanceof HttpResponse) {\n          main.loaderOff();\n          if (main.debug) {\n            console.log('Risposta -->', event.body);\n          }\n          if (!event.ok) {\n            throw new Error(event.body ? event.body : event);\n          }\n        }\n      },\n      error: async (err: any) => {\n        if (err instanceof HttpErrorResponse) {\n          main.loaderOff();\n          if (err.status === 401) {\n            while (await modalCtrl.getTop()) {\n              await modalCtrl.dismiss();\n            }\n            main.logout();\n          }\n          if (err.status === 418) {\n            main.logout();\n            router.navigate(['/standby'])\n          }\n          if (err.status === 503) {\n            router.navigate([main.maintenanceUrl], {queryParams: {message: err.error.message}})\n          }\n        }\n      }\n    }));\n};\n","import { inject } from '@angular/core';\nimport { HttpRequest, HttpEvent, HttpHandlerFn } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { MainService } from '../services/main.service';\n\nexport const TokenInterceptor = (req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>> => {\n\n  const main: MainService = inject(MainService);\n\n  // Clone the request object\n  let newReq = req.clone();\n  if (newReq.method !== 'OPTIONS' && main.getToken() !== false) {\n    newReq = req.clone({\n      setHeaders: {\n        Authorization: `Bearer ${main.getToken()}`\n      }\n    });\n  }\n\n  return next(newReq);\n}","import { provideHttpClient, withInterceptors } from '@angular/common/http';\nimport { EnvironmentProviders, inject, Provider, provideEnvironmentInitializer } from '@angular/core';\nimport { MainService } from './services/main.service';\nimport { JwtInterceptor } from './Auth/jwt.interceptor';\nimport { TokenInterceptor } from './Auth/token.interceptor';\n\nexport const provideMain = (): Array<Provider | EnvironmentProviders> => {\n  return [\n    provideHttpClient(withInterceptors([JwtInterceptor, TokenInterceptor])),\n    provideEnvironmentInitializer(() => inject(MainService))\n  ];\n};\n","/*\n * Public API Surface of ionic-utils\n */\n\nexport * from './lib/services/main.service';\nexport * from './lib/services/main.service';\nexport * from './lib/interfaces/interfaces';\nexport * from './lib/Auth/auth.guard';\nexport * from './lib/Auth/jwt.interceptor';\nexport * from './lib/Auth/token.interceptor';\nexport * from './lib/main.provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}