{"version":3,"file":"third-party-tracker-k5pruu7o.js","sources":["packages/vanilla/lib/features/third-party-tracker/src/third-party-tracking.service.ts","packages/vanilla/lib/features/third-party-tracker/src/third-party-tracker.component.ts","packages/vanilla/lib/features/third-party-tracker/src/third-party-tracker-bootstrap.service.ts","packages/vanilla/lib/features/third-party-tracker/src/third-party-tracker.feature.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { CookieName, CookieService, SharedFeaturesApiService, UserEvent, UserLoginEvent, UserService } from '@frontend/vanilla/core';\nimport { BehaviorSubject, Observable, retry, throwError, timer } from 'rxjs';\nimport { filter, mergeMap } from 'rxjs/operators';\n\n/**\n * @whatItDoes Handles third party tracking\n *\n * @howToUse\n *\n * The third-party tracker functionality can be enabled by calling ThirdPartyTrackingService.enableTracker() with correct channelId and productId.\n *\n * ```\n * thirdPartyTrackingService.enableTracker(myChannelId, myProductId);\n * ```\n *\n * @stable\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ThirdPartyTrackingService {\n private trackingContentEvents = new BehaviorSubject(null);\n private running: boolean;\n\n constructor(\n private cookieService: CookieService,\n private apiService: SharedFeaturesApiService,\n private user: UserService,\n ) {\n this.loadTrackingContent();\n }\n\n get trackingContent(): Observable {\n return this.trackingContentEvents;\n }\n\n enableTracker(channelId: number, productId: number) {\n if (this.cookieService.get(CookieName.TrackingAffiliate)) {\n const targetDate = new Date();\n targetDate.setDate(targetDate.getDate() + 7);\n\n this.cookieService.putObject(CookieName.ThirdPartyTracker, { channelId: channelId, productId: productId }, { expires: targetDate });\n\n this.loadTrackingContent();\n }\n }\n\n private loadTrackingContent() {\n const thirdPartyTracker: any = this.cookieService.getObject(CookieName.ThirdPartyTracker);\n\n if (!thirdPartyTracker || this.running) {\n return;\n }\n\n this.running = true;\n\n if (this.user.isAuthenticated) {\n this.requestTrackingContent();\n } else {\n const sub = this.user.events.pipe(filter((e: UserEvent) => e instanceof UserLoginEvent)).subscribe(() => {\n sub.unsubscribe();\n\n this.requestTrackingContent();\n });\n }\n }\n\n // TODO: Implement retry logic using Web worker\n private requestTrackingContent() {\n const thirdPartyTracker = this.cookieService.getObject(CookieName.ThirdPartyTracker);\n\n this.apiService\n .get('thirdpartytrackingcontent', {\n productId: thirdPartyTracker.productId,\n channelId: thirdPartyTracker.channelId,\n })\n .pipe(\n retry({\n delay: (errors: Observable) =>\n errors.pipe(\n mergeMap((err: any) => {\n if (!thirdPartyTracker.failureCount) {\n thirdPartyTracker.failureCount = 1;\n } else {\n thirdPartyTracker.failureCount++;\n }\n\n if (thirdPartyTracker.failureCount > 4) {\n this.cleanup();\n\n return throwError(err);\n }\n\n this.cookieService.putObject(CookieName.ThirdPartyTracker, thirdPartyTracker);\n\n return timer(10000);\n }),\n ),\n }),\n )\n .subscribe({\n next: (result) => {\n this.trackingContentEvents.next(result.content);\n this.cleanup();\n },\n error: () => {},\n });\n }\n\n private cleanup() {\n this.running = false;\n this.cookieService.remove(CookieName.ThirdPartyTracker);\n }\n}\n","import { Component } from '@angular/core';\n\nimport { TrustAsHtmlPipe } from '@frontend/vanilla/shared/browser';\n\nimport { ThirdPartyTrackingService } from './third-party-tracking.service';\n\n/**\n * @stable\n */\n@Component({\n standalone: true,\n imports: [TrustAsHtmlPipe],\n selector: 'vn-third-party-tracker',\n host: { style: 'display: block; width: 0; height: 0; overflow: hidden;' },\n template: '@if (url) {}@if (content) {
}',\n})\nexport class ThirdPartyTrackerComponent {\n url: string | null;\n content: string | null;\n\n constructor(thirdPartyTrackerService: ThirdPartyTrackingService) {\n thirdPartyTrackerService.trackingContent.subscribe((trackingContent: string | null) => {\n this.url = null;\n this.content = null;\n\n if (!trackingContent) {\n return;\n }\n\n if (trackingContent.indexOf('http') === 0) {\n this.url = trackingContent;\n } else {\n this.content = trackingContent;\n }\n });\n }\n}\n","import { Injectable } from '@angular/core';\n\nimport { DynamicLayoutService, OnFeatureInit, SlotName } from '@frontend/vanilla/core';\n\nimport { ThirdPartyTrackerComponent } from './third-party-tracker.component';\n\n@Injectable()\nexport class ThirdPartyTrackerBootstrapService implements OnFeatureInit {\n constructor(private dynamicLayoutService: DynamicLayoutService) {}\n\n onFeatureInit() {\n this.dynamicLayoutService.addComponent(SlotName.Bottom, ThirdPartyTrackerComponent, null);\n }\n}\n","import { runOnFeatureInit } from '@frontend/vanilla/core';\n\nimport { ThirdPartyTrackerBootstrapService } from './third-party-tracker-bootstrap.service';\n\nexport function provide() {\n return [runOnFeatureInit(ThirdPartyTrackerBootstrapService)];\n}\n"],"names":["ThirdPartyTrackingService","constructor","cookieService","apiService","user","trackingContentEvents","BehaviorSubject","loadTrackingContent","trackingContent","enableTracker","channelId","productId","get","CookieName","TrackingAffiliate","targetDate","Date","setDate","getDate","putObject","ThirdPartyTracker","expires","getObject","running","isAuthenticated","requestTrackingContent","sub","events","pipe","filter","e","UserLoginEvent","subscribe","unsubscribe","thirdPartyTracker","retry","delay","errors","mergeMap","err","failureCount","cleanup","throwError","timer","next","result","content","error","remove","ɵɵinject","CookieService","SharedFeaturesApiService","UserService","factory","ɵfac","providedIn","_ThirdPartyTrackingService","ɵɵelement","d","ɵɵproperty","ctx_r0","url","ɵɵsanitizeUrl","P","ɵɵpipeBind1","ɵɵsanitizeHtml","ThirdPartyTrackerComponent","thirdPartyTrackerService","indexOf","ɵɵdirectiveInject","selectors","hostAttrs","standalone","features","ɵɵStandaloneFeature","decls","vars","consts","template","rf","ctx","ɵɵtemplate","ThirdPartyTrackerComponent_Conditional_0_Template","ThirdPartyTrackerComponent_Conditional_1_Template","ɵɵconditional","ɵɵadvance","TrustAsHtmlPipe","encapsulation","_ThirdPartyTrackerComponent","ThirdPartyTrackerBootstrapService","dynamicLayoutService","onFeatureInit","addComponent","SlotName","Bottom","DynamicLayoutService","_ThirdPartyTrackerBootstrapService","provide","runOnFeatureInit"],"mappings":"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"}