From 832a8d5bcd5a3510a737105e52f6c5b28c927559 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 23 Sep 2020 17:38:25 +0900 Subject: [PATCH 01/39] Implement Ecommerce features --- .eslintrc.js | 1 + src/__tests__/index.ts | 17 ++- src/index.ts | 5 +- src/trackers/base.ts | 12 +- src/trackers/beacon.ts | 3 +- src/trackers/ecommerce/common.ts | 48 +++++++ src/trackers/ecommerce/ga.ts | 210 +++++++++++++++++++++++++++++++ src/trackers/ecommerce/index.ts | 2 + src/trackers/ga.ts | 21 +++- src/trackers/gtag.ts | 3 +- src/trackers/index.ts | 1 + src/trackers/kakao.ts | 3 +- src/trackers/pixel.ts | 3 +- src/trackers/tagmanager.ts | 3 +- src/trackers/twitter.ts | 3 +- 15 files changed, 315 insertions(+), 20 deletions(-) create mode 100644 src/trackers/ecommerce/common.ts create mode 100644 src/trackers/ecommerce/ga.ts create mode 100644 src/trackers/ecommerce/index.ts diff --git a/.eslintrc.js b/.eslintrc.js index 33969eb..9519950 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -32,6 +32,7 @@ module.exports = { 'import/prefer-default-export': 0, 'func-names': 0, '@typescript-eslint/no-empty-function': 1, + 'max-classes-per-file': ['error', 10], }, ignorePatterns: ['**/node_modules/**'], }; diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index b14a483..3eaf286 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -1,6 +1,7 @@ import { DeviceType, MainTrackerOptions, Tracker } from '../index'; import { BeaconTracker, + GAEcommerceTracker, GATracker, KakaoTracker, PixelTracker, @@ -8,6 +9,7 @@ import { TwitterTracker, } from '../trackers'; import { BaseTracker, EventTracker } from '../trackers/base'; +import { Impression } from '../trackers/ecommerce/ga'; const ALL_TRACKERS = [ BeaconTracker, @@ -276,7 +278,7 @@ it('Test TwitterTracker', async () => { t.throttledFlush = t.flush.bind(t); t.sendPageView('href'); - t.sendImpression(); + t.sendImpression([new Impression('12', 'name')]); t.sendSignUp(); t.sendStartSubscription(); @@ -298,3 +300,16 @@ it('Test TwitterTracker', async () => { { tw_sale_amount: 0, tw_order_quantity: 0 }, ); }); + +it('Test GA', async () => { + const t = new TestableTracker(); + t.mocking(ALL_TRACKERS.excludes(GATracker), 'sendImpression'); + await t.initialize(); + const gaTracker = t.getTrackerInstance(GATracker); + + // @ts-ignore + + gaTracker.ecommerceTracker = new GAEcommerceTracker(); + + t.sendImpression([new Impression('id', 'name')]); +}); diff --git a/src/index.ts b/src/index.ts index 4311b49..4388444 100644 --- a/src/index.ts +++ b/src/index.ts @@ -18,6 +18,7 @@ import { TwitterTracker, } from './trackers'; import { BaseTracker, EventTracker, PageMeta } from './trackers/base'; +import { Impression } from './trackers/ecommerce/ga'; export enum DeviceType { PC = 'pc', @@ -181,8 +182,8 @@ export class Tracker { } @pushEventToQueue() - public sendImpression(): EventParameters { - return []; + public sendImpression(items: Impression[]): EventParameters { + return [items]; } @pushEventToQueue() diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 42a3674..e3ff206 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,4 +1,5 @@ import { DeviceType, MainTrackerOptions } from '../index'; +import { Archiveable, Impression, Purchasable } from './ecommerce'; /* eslint-disable camelcase */ export interface PageMeta { @@ -20,9 +21,11 @@ export interface EventTracker { sendStartSubscription(args?: Record, ts?: Date): void; - sendImpression(args?: Record, ts?: Date): void; + sendImpression(items: Impression[], ts?: Date): void; sendAddPaymentInfo(args?: Record, ts?: Date): void; + + sendPurchase(tId: string, items: Purchasable[], ts?: Date): void; } export abstract class BaseTracker implements EventTracker { @@ -38,10 +41,7 @@ export abstract class BaseTracker implements EventTracker { public abstract sendSignUp(args?: Record, ts?: Date): void; - public abstract sendImpression( - args?: Record, - ts?: Date, - ): void; + public abstract sendImpression(items: Impression[], ts?: Date): void; public abstract sendStartSubscription( args?: Record, @@ -53,6 +53,8 @@ export abstract class BaseTracker implements EventTracker { ts?: Date, ): void; + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public abstract isInitialized(): boolean; public abstract async initialize(): Promise; diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index fc4b218..43c7454 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -3,6 +3,7 @@ import URL from 'url-parse'; import { PVID, RUID } from '../uid'; import { UIDFactory } from '../uid/factory'; import { BaseTracker, PageMeta } from './base'; +import { Impression } from './ecommerce'; export interface BeaconOptions { beaconSrc?: string; @@ -106,7 +107,7 @@ export class BeaconTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(args?: Record, ts?: Date): void {} + public sendImpression(items: Impression[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} diff --git a/src/trackers/ecommerce/common.ts b/src/trackers/ecommerce/common.ts new file mode 100644 index 0000000..4147216 --- /dev/null +++ b/src/trackers/ecommerce/common.ts @@ -0,0 +1,48 @@ +export interface Trackable { + section: string; + sectionFull: string; + objId: string; + position: number; + genreEng: string; + genreKor: string; + tags: Tag; + isLastItem: boolean; + recommendId: number; +} + +export interface Tag { + name: string; + category: string; + brand: string; + price: number; + quantity: number; + receiptId: number; + receiptTitle: string; +} + +export interface Displayable { + display(isLastItem: boolean): void; +} + +export interface Clickable { + click(): void; +} + +export interface Purchasable { + readonly price: number; + readonly quantity: number; + purchase(): void; +} + +export interface Archiveable { + add(to: T): void; + remove(from: T): void; +} + +export interface EcommerceTracker { + sendClick(...items: Clickable[]): void; + + sendPurchase(tId: string, ...items: Purchasable[]): void; + + sendDisplay(...items: Displayable[]): void; +} diff --git a/src/trackers/ecommerce/ga.ts b/src/trackers/ecommerce/ga.ts new file mode 100644 index 0000000..f7e2293 --- /dev/null +++ b/src/trackers/ecommerce/ga.ts @@ -0,0 +1,210 @@ +import { + Archiveable, + Clickable, + EcommerceTracker, + Purchasable, + Trackable, + Displayable, +} from './common'; + +// TODO: sectionName prop 가지고 있는 상위 class, interface 만들기 + +export class Impression implements Clickable, Displayable { + public static from(trackable: Trackable): Impression { + return new Impression( + trackable.objId, + trackable.tags.name, + trackable.sectionFull, + trackable.tags.brand, + trackable.tags.category, + null, + trackable.position + 1, + ); + } + + // TODO: change isLastItem to protected + + public constructor( + public readonly id: string, + public readonly name: string, + public readonly list?: string, + public readonly brand?: string, + public readonly category?: string, + public readonly variant?: string, + public readonly position?: number, + public readonly price?: number, + ) {} + + public click(): void { + ga('ec:addProduct', this); + ga('ec:setAction', 'click', { list: this.list }); + + ga('send', 'event', 'click', this.toString().toLowerCase(), this.list); + } + + public display(isLastItem = false): void { + GAEcommerceHelper.setImpression(this); + if (isLastItem) { + ga('send', 'event', 'display', this.toString().toLowerCase(), this.list); + } + } +} + +export class Product + implements Archiveable<'cart' | 'wishlist'>, Displayable, Purchasable { + public static from(trackable: Trackable): Product { + return new Product( + trackable.objId, + trackable.tags.name, + trackable.tags.quantity, + trackable.tags.price, + trackable.tags.category, + null, + trackable.tags.brand, + null, + trackable.position + 1, + ); + } + + constructor( + public readonly id: string, + public readonly name: string, + public readonly quantity: number, + public readonly price: number, + public readonly brand?: string, + public readonly category?: string, + public readonly variant?: string, + public readonly coupon?: string, + public readonly position?: number, + ) {} + + display(isLastItem = false): void { + GAEcommerceHelper.addProduct(this); + GAEcommerceHelper.setAction('detail'); + if (isLastItem) { + // TODO: Replace section_full + + ga('send', 'event', 'product', 'display', 'section_full'); + } + } + + public purchase(): void { + GAEcommerceHelper.addProduct(this); + } + + public add(to: 'cart' | 'wishlist'): void { + GAEcommerceHelper.addProduct(this); + GAEcommerceHelper.setAction('add'); + } + + public remove(from: 'cart' | 'wishlist'): void { + GAEcommerceHelper.addProduct(this); + GAEcommerceHelper.setAction('remove'); + } +} + +export class Promotion implements Clickable, Displayable { + public static from(trackable: Trackable): Promotion { + return new Promotion( + trackable.objId, + `[${trackable.genreKor}]${trackable.section}_${trackable.tags.name}`, + trackable.sectionFull, + trackable.position, + ); + } + + constructor( + public readonly id?: string, + public readonly name?: string, + public readonly creative?: string, + public readonly position?: number, + ) {} + + click(): void { + GAEcommerceHelper.addPromotion(this); + GAEcommerceHelper.setPromotionClick(); + ga('send', 'event', this.toString().toLowerCase(), 'click', 'section_full'); + } + + display(isLastItem = false): void { + GAEcommerceHelper.addPromotion(this); + GAEcommerceHelper.setPromotionClick(); + + if (isLastItem) { + ga( + 'send', + 'event', + this.toString().toLowerCase(), + 'display', + 'section_full', + ); + } + } +} + +export interface ActionMeta { + id?: string; + affiliation?: string; + revenue?: number; + tax?: number; + shipping?: number; + coupon?: string; + list?: string; + step?: number; + option?: string; +} + +class GAEcommerceHelper { + public static addProduct(product: Product): void { + ga('ec:addProduct', product); + } + + public static addPromotion(promotion: Promotion): void { + ga('ec:addPromo', promotion); + } + + public static setImpression(impression: Impression): void { + ga('ec:addImpression', impression); + } + + public static setProductClick(obj: Product, meta?: ActionMeta): void { + ga('ec:setAction', 'click', meta); + } + + public static setPromotionClick(): void { + ga('ec:setAction', 'promo_click'); + } + + public static setAddToCart(...obj: Product[]) { + ga('ec:setAction', 'add'); + } + + public static setAction(action: string, ...args: any[]) { + ga('ec:setAction', action); + } +} + +export class GAEcommerceTracker implements EcommerceTracker { + sendClick(...items: Clickable[]): void { + items.forEach(it => it.click()); + } + + sendDisplay(...items: Displayable[]): void { + items.forEach((it, idx) => { + const isLastItem = idx === items.length - 1; + it.display(isLastItem); + }); + } + + sendPurchase(tId: string, ...items: Purchasable[]): void { + let totalRevenue = 0; + + items.forEach(it => { + it.purchase(); + totalRevenue += it.quantity > 0 ? it.price : 0; + }); + + ga('ec:setAction', 'purchase', { id: tId, revenue: totalRevenue }); + ga('send', 'event', 'purchase', 'event', 'section_full'); + } +} diff --git a/src/trackers/ecommerce/index.ts b/src/trackers/ecommerce/index.ts new file mode 100644 index 0000000..1b21e1a --- /dev/null +++ b/src/trackers/ecommerce/index.ts @@ -0,0 +1,2 @@ +export * from './common'; +export * from './ga'; diff --git a/src/trackers/ga.ts b/src/trackers/ga.ts index c740479..7b08137 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga.ts @@ -1,5 +1,6 @@ import { loadGA } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; +import { GAEcommerceTracker, Impression, Purchasable } from './ecommerce'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -16,12 +17,11 @@ export class GATracker extends BaseTracker { super(); } + private ecommerceTracker: GAEcommerceTracker; + private refinePath(originalPath: string): string { const refiners: Array<(path: string) => string> = [ - path => (this.options.pathPrefix ? this.options.pathPrefix + path : path), - - // Pathname in some browsers doesn't start with slash character (/) - // Ref: https://app.asana.com/0/inbox/463186034180509/765912307342230/766156873493449 + path => (this.options.pathPrefix ? this.options.pathPrefix + path : path), // Ref: https://app.asana.com/0/inbox/463186034180509/765912307342230/766156873493449 // Pathname in some browsers doesn't start with slash character (/) path => (path.startsWith('/') ? path : `/${path}`), ]; @@ -36,6 +36,9 @@ export class GATracker extends BaseTracker { } else { ga('create', this.options.trackingId, 'auto'); } + ga('require', 'ec'); + + this.ecommerceTracker = new GAEcommerceTracker(); } public isInitialized(): boolean { @@ -75,12 +78,18 @@ export class GATracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(args?: Record, ts?: Date): void {} - public sendSignUp(args?: Record, ts?: Date): void {} public sendStartSubscription( args?: Record, ts?: Date, ): void {} + + public sendImpression(items: Impression[], ts?: Date): void { + this.ecommerceTracker.sendDisplay(...items); + } + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void { + this.ecommerceTracker.sendPurchase(tId, ...items); + } } diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index 865fe40..b649e55 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -1,5 +1,6 @@ import { loadGTag } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; +import { Impression } from './ecommerce'; export interface GTagOptions { trackingId: string; @@ -37,7 +38,7 @@ export class GTagTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(args?: Record, ts?: Date): void {} + public sendImpression(items: Impression[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} diff --git a/src/trackers/index.ts b/src/trackers/index.ts index 192278e..c8dee35 100644 --- a/src/trackers/index.ts +++ b/src/trackers/index.ts @@ -5,3 +5,4 @@ export * from './tagmanager'; export * from './gtag'; export * from './kakao'; export * from './twitter'; +export * from './ecommerce'; diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 7147d0c..83e4c25 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,5 +1,6 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; +import { Impression } from './ecommerce'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; @@ -50,7 +51,7 @@ export class KakaoTracker extends BaseTracker { this.tracker.signUp(); } - public sendImpression(args?: Record, ts?: Date): void { + public sendImpression(items: Impression[], ts?: Date): void { this.tracker.viewContent(); } diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 14f48d6..47c327f 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,5 +1,6 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; +import { Impression } from './ecommerce'; export interface PixelOptions { pixelId: string | string[]; @@ -48,7 +49,7 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendImpression(args?: Record, ts?: Date): void {} + public sendImpression(items: Impression[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 4a72f3e..b300a93 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,6 +2,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; +import { Impression } from './ecommerce'; export interface TagManagerOptions { trackingId: string; @@ -66,7 +67,7 @@ export class TagManagerTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(args?: Record, ts?: Date): void {} + public sendImpression(items: Impression[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 8dbcc6e..0162205 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,6 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; +import { Impression } from './ecommerce'; declare let twq: any; declare let twttr: any; @@ -56,7 +57,7 @@ export class TwitterTracker extends BaseTracker { }); } - public sendImpression(args?: Record, ts?: Date): void { + public sendImpression(items: Impression[], ts?: Date): void { this.twttr.conversion.trackPid(this.options.impressionPid, { tw_sale_amount: 0, tw_order_quantity: 0, From 93c04608ac9616ffcc4c8d9dffa060a655b76558 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 23 Sep 2020 18:49:57 +0900 Subject: [PATCH 02/39] Move Trackable, Tag interface under to Legacy.ts --- src/trackers/ecommerce/common.ts | 22 ---------- src/trackers/ecommerce/ga.ts | 69 +++++++++++++------------------- src/trackers/ecommerce/index.ts | 1 + src/trackers/ecommerce/legacy.ts | 21 ++++++++++ 4 files changed, 50 insertions(+), 63 deletions(-) create mode 100644 src/trackers/ecommerce/legacy.ts diff --git a/src/trackers/ecommerce/common.ts b/src/trackers/ecommerce/common.ts index 4147216..de8a10a 100644 --- a/src/trackers/ecommerce/common.ts +++ b/src/trackers/ecommerce/common.ts @@ -1,25 +1,3 @@ -export interface Trackable { - section: string; - sectionFull: string; - objId: string; - position: number; - genreEng: string; - genreKor: string; - tags: Tag; - isLastItem: boolean; - recommendId: number; -} - -export interface Tag { - name: string; - category: string; - brand: string; - price: number; - quantity: number; - receiptId: number; - receiptTitle: string; -} - export interface Displayable { display(isLastItem: boolean): void; } diff --git a/src/trackers/ecommerce/ga.ts b/src/trackers/ecommerce/ga.ts index f7e2293..1361013 100644 --- a/src/trackers/ecommerce/ga.ts +++ b/src/trackers/ecommerce/ga.ts @@ -3,11 +3,9 @@ import { Clickable, EcommerceTracker, Purchasable, - Trackable, Displayable, } from './common'; - -// TODO: sectionName prop 가지고 있는 상위 class, interface 만들기 +import { Trackable } from './legacy'; export class Impression implements Clickable, Displayable { public static from(trackable: Trackable): Impression { @@ -22,8 +20,6 @@ export class Impression implements Clickable, Displayable { ); } - // TODO: change isLastItem to protected - public constructor( public readonly id: string, public readonly name: string, @@ -142,16 +138,29 @@ export class Promotion implements Clickable, Displayable { } } -export interface ActionMeta { - id?: string; - affiliation?: string; - revenue?: number; - tax?: number; - shipping?: number; - coupon?: string; - list?: string; - step?: number; - option?: string; +export class GAEcommerceTracker implements EcommerceTracker { + sendClick(...items: Clickable[]): void { + items.forEach(it => it.click()); + } + + sendDisplay(...items: Displayable[]): void { + items.forEach((it, idx) => { + const isLastItem = idx === items.length - 1; + it.display(isLastItem); + }); + } + + sendPurchase(tId: string, ...items: Purchasable[]): void { + let totalRevenue = 0; + + items.forEach(it => { + it.purchase(); + totalRevenue += it.quantity > 0 ? it.price : 0; + }); + + ga('ec:setAction', 'purchase', { id: tId, revenue: totalRevenue }); + ga('send', 'event', 'purchase', 'event', 'section_full'); + } } class GAEcommerceHelper { @@ -167,7 +176,10 @@ class GAEcommerceHelper { ga('ec:addImpression', impression); } - public static setProductClick(obj: Product, meta?: ActionMeta): void { + public static setProductClick( + obj: Product, + meta?: Record, + ): void { ga('ec:setAction', 'click', meta); } @@ -183,28 +195,3 @@ class GAEcommerceHelper { ga('ec:setAction', action); } } - -export class GAEcommerceTracker implements EcommerceTracker { - sendClick(...items: Clickable[]): void { - items.forEach(it => it.click()); - } - - sendDisplay(...items: Displayable[]): void { - items.forEach((it, idx) => { - const isLastItem = idx === items.length - 1; - it.display(isLastItem); - }); - } - - sendPurchase(tId: string, ...items: Purchasable[]): void { - let totalRevenue = 0; - - items.forEach(it => { - it.purchase(); - totalRevenue += it.quantity > 0 ? it.price : 0; - }); - - ga('ec:setAction', 'purchase', { id: tId, revenue: totalRevenue }); - ga('send', 'event', 'purchase', 'event', 'section_full'); - } -} diff --git a/src/trackers/ecommerce/index.ts b/src/trackers/ecommerce/index.ts index 1b21e1a..ad43886 100644 --- a/src/trackers/ecommerce/index.ts +++ b/src/trackers/ecommerce/index.ts @@ -1,2 +1,3 @@ export * from './common'; export * from './ga'; +export * from './legacy'; diff --git a/src/trackers/ecommerce/legacy.ts b/src/trackers/ecommerce/legacy.ts new file mode 100644 index 0000000..9d64756 --- /dev/null +++ b/src/trackers/ecommerce/legacy.ts @@ -0,0 +1,21 @@ +export interface Tag { + name: string; + category: string; + brand: string; + price: number; + quantity: number; + receiptId: number; + receiptTitle: string; +} + +export interface Trackable { + section: string; + sectionFull: string; + objId: string; + position: number; + genreEng: string; + genreKor: string; + tags: Tag; + isLastItem: boolean; + recommendId: number; +} From 9df6920532b4f93eaf7966496624afcb4e99681a Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 23 Sep 2020 20:49:59 +0900 Subject: [PATCH 03/39] Add EventTracker.sendAddToCart --- src/trackers/base.ts | 16 ++++++-- src/trackers/beacon.ts | 8 +++- src/trackers/ecommerce/common.ts | 10 +++-- src/trackers/ecommerce/ga.ts | 68 ++++++++++++++++---------------- src/trackers/ga.ts | 14 ++++++- src/trackers/gtag.ts | 8 +++- src/trackers/kakao.ts | 8 +++- src/trackers/pixel.ts | 8 +++- src/trackers/tagmanager.ts | 8 +++- src/trackers/twitter.ts | 8 +++- 10 files changed, 102 insertions(+), 54 deletions(-) diff --git a/src/trackers/base.ts b/src/trackers/base.ts index e3ff206..ea35b00 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,5 +1,5 @@ import { DeviceType, MainTrackerOptions } from '../index'; -import { Archiveable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; /* eslint-disable camelcase */ export interface PageMeta { @@ -21,11 +21,13 @@ export interface EventTracker { sendStartSubscription(args?: Record, ts?: Date): void; - sendImpression(items: Impression[], ts?: Date): void; + sendImpression(items: Displayable[], ts?: Date): void; sendAddPaymentInfo(args?: Record, ts?: Date): void; sendPurchase(tId: string, items: Purchasable[], ts?: Date): void; + + sendAddToCart(items: Archiveable[], ts?: Date): void; } export abstract class BaseTracker implements EventTracker { @@ -41,7 +43,7 @@ export abstract class BaseTracker implements EventTracker { public abstract sendSignUp(args?: Record, ts?: Date): void; - public abstract sendImpression(items: Impression[], ts?: Date): void; + public abstract sendImpression(items: Displayable[], ts?: Date): void; public abstract sendStartSubscription( args?: Record, @@ -53,7 +55,13 @@ export abstract class BaseTracker implements EventTracker { ts?: Date, ): void; - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public abstract sendPurchase( + tId: string, + items: Purchasable[], + ts?: Date, + ): void; + + public abstract sendAddToCart(items: Archiveable[], ts?: Date): void; public abstract isInitialized(): boolean; diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 43c7454..9379bc7 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -3,7 +3,7 @@ import URL from 'url-parse'; import { PVID, RUID } from '../uid'; import { UIDFactory } from '../uid/factory'; import { BaseTracker, PageMeta } from './base'; -import { Impression } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; export interface BeaconOptions { beaconSrc?: string; @@ -107,7 +107,7 @@ export class BeaconTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(items: Impression[], ts?: Date): void {} + public sendImpression(items: Displayable[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} @@ -115,6 +115,10 @@ export class BeaconTracker extends BaseTracker { args?: Record, ts?: Date, ): void {} + + public sendAddToCart(items: Archiveable[], ts?: Date): void {} + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} } enum BeaconEventName { diff --git a/src/trackers/ecommerce/common.ts b/src/trackers/ecommerce/common.ts index de8a10a..f6f52fb 100644 --- a/src/trackers/ecommerce/common.ts +++ b/src/trackers/ecommerce/common.ts @@ -12,9 +12,9 @@ export interface Purchasable { purchase(): void; } -export interface Archiveable { - add(to: T): void; - remove(from: T): void; +export interface Archiveable { + add(to: 'cart' | 'wishlist'): void; + remove(from: 'cart' | 'wishlist'): void; } export interface EcommerceTracker { @@ -23,4 +23,8 @@ export interface EcommerceTracker { sendPurchase(tId: string, ...items: Purchasable[]): void; sendDisplay(...items: Displayable[]): void; + + sendAdd(to: 'cart' | 'wishlist', ...items: Archiveable[]): void; + + sendRemove(from: 'cart' | 'wishlist', ...items: Archiveable[]): void; } diff --git a/src/trackers/ecommerce/ga.ts b/src/trackers/ecommerce/ga.ts index 1361013..b0ef599 100644 --- a/src/trackers/ecommerce/ga.ts +++ b/src/trackers/ecommerce/ga.ts @@ -39,15 +39,14 @@ export class Impression implements Clickable, Displayable { } public display(isLastItem = false): void { - GAEcommerceHelper.setImpression(this); + GAHelper.addImpression(this); if (isLastItem) { ga('send', 'event', 'display', this.toString().toLowerCase(), this.list); } } } -export class Product - implements Archiveable<'cart' | 'wishlist'>, Displayable, Purchasable { +export class Product implements Archiveable, Displayable, Purchasable { public static from(trackable: Trackable): Product { return new Product( trackable.objId, @@ -75,8 +74,8 @@ export class Product ) {} display(isLastItem = false): void { - GAEcommerceHelper.addProduct(this); - GAEcommerceHelper.setAction('detail'); + GAHelper.addProduct(this); + GAHelper.setAction('detail'); if (isLastItem) { // TODO: Replace section_full @@ -85,17 +84,19 @@ export class Product } public purchase(): void { - GAEcommerceHelper.addProduct(this); + GAHelper.addProduct(this); } public add(to: 'cart' | 'wishlist'): void { - GAEcommerceHelper.addProduct(this); - GAEcommerceHelper.setAction('add'); + GAHelper.addProduct(this); + GAHelper.setAction('add'); + ga('send', 'event', to, 'click', 'section_full'); } public remove(from: 'cart' | 'wishlist'): void { - GAEcommerceHelper.addProduct(this); - GAEcommerceHelper.setAction('remove'); + GAHelper.addProduct(this); + GAHelper.setAction('remove'); + ga('send', 'event', from, 'click', 'section_full'); } } @@ -117,14 +118,13 @@ export class Promotion implements Clickable, Displayable { ) {} click(): void { - GAEcommerceHelper.addPromotion(this); - GAEcommerceHelper.setPromotionClick(); - ga('send', 'event', this.toString().toLowerCase(), 'click', 'section_full'); + GAHelper.addPromotion(this); + GAHelper.setAction('promo_click'); } display(isLastItem = false): void { - GAEcommerceHelper.addPromotion(this); - GAEcommerceHelper.setPromotionClick(); + GAHelper.addPromotion(this); + GAHelper.setAction('promo_click'); if (isLastItem) { ga( @@ -158,12 +158,25 @@ export class GAEcommerceTracker implements EcommerceTracker { totalRevenue += it.quantity > 0 ? it.price : 0; }); - ga('ec:setAction', 'purchase', { id: tId, revenue: totalRevenue }); + GAHelper.setAction('purchase', { id: tId, revenue: totalRevenue }); + GAHelper.sendEvent('purchase', 'event', 'section_full'); ga('send', 'event', 'purchase', 'event', 'section_full'); } + + sendRemove(from: 'cart' | 'wishlist', ...items: Archiveable[]): void { + items.forEach(it => { + it.remove(from); + }); + } + + sendAdd(to: 'cart' | 'wishlist', ...items: Archiveable[]): void { + items.forEach(it => { + it.add(to); + }); + } } -class GAEcommerceHelper { +class GAHelper { public static addProduct(product: Product): void { ga('ec:addProduct', product); } @@ -172,26 +185,15 @@ class GAEcommerceHelper { ga('ec:addPromo', promotion); } - public static setImpression(impression: Impression): void { + public static addImpression(impression: Impression): void { ga('ec:addImpression', impression); } - public static setProductClick( - obj: Product, - meta?: Record, - ): void { - ga('ec:setAction', 'click', meta); - } - - public static setPromotionClick(): void { - ga('ec:setAction', 'promo_click'); - } - - public static setAddToCart(...obj: Product[]) { - ga('ec:setAction', 'add'); + public static setAction(action: string, ...args: Record[]) { + ga('ec:setAction', action, ...args); } - public static setAction(action: string, ...args: any[]) { - ga('ec:setAction', action); + public static sendEvent(...args: any[]) { + ga('send', 'event', ...args); } } diff --git a/src/trackers/ga.ts b/src/trackers/ga.ts index 7b08137..4d88888 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga.ts @@ -1,6 +1,12 @@ import { loadGA } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { GAEcommerceTracker, Impression, Purchasable } from './ecommerce'; +import { + Archiveable, + Displayable, + GAEcommerceTracker, + Impression, + Purchasable, +} from './ecommerce'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -85,11 +91,15 @@ export class GATracker extends BaseTracker { ts?: Date, ): void {} - public sendImpression(items: Impression[], ts?: Date): void { + public sendImpression(items: Displayable[], ts?: Date): void { this.ecommerceTracker.sendDisplay(...items); } public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void { this.ecommerceTracker.sendPurchase(tId, ...items); } + + public sendAddToCart(items: Archiveable[], ts?: Date): void { + this.ecommerceTracker.sendAdd('cart', ...items); + } } diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index b649e55..8f5abdf 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -1,6 +1,6 @@ import { loadGTag } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Impression } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; export interface GTagOptions { trackingId: string; @@ -38,7 +38,7 @@ export class GTagTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(items: Impression[], ts?: Date): void {} + public sendImpression(items: Displayable[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} @@ -46,4 +46,8 @@ export class GTagTracker extends BaseTracker { args?: Record, ts?: Date, ): void {} + + public sendAddToCart(items: Archiveable[], ts?: Date): void {} + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 83e4c25..d18a11a 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,6 +1,6 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Impression } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; @@ -51,12 +51,16 @@ export class KakaoTracker extends BaseTracker { this.tracker.signUp(); } - public sendImpression(items: Impression[], ts?: Date): void { + public sendImpression(items: Displayable[], ts?: Date): void { this.tracker.viewContent(); } public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddToCart(items: Archiveable[], ts?: Date): void {} + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendEvent( name: string, data?: Record, diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 47c327f..4ad9946 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,6 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Impression } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; export interface PixelOptions { pixelId: string | string[]; @@ -49,7 +49,11 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendImpression(items: Impression[], ts?: Date): void {} + public sendAddToCart(items: Archiveable[], ts?: Date): void {} + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + + public sendImpression(items: Displayable[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index b300a93..b9ed7b5 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,7 +2,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Impression } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; export interface TagManagerOptions { trackingId: string; @@ -67,10 +67,14 @@ export class TagManagerTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendImpression(items: Impression[], ts?: Date): void {} + public sendImpression(items: Displayable[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} + public sendAddToCart(items: Archiveable[], ts?: Date): void {} + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendStartSubscription( args?: Record, ts?: Date, diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 0162205..07055b5 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Impression } from './ecommerce'; +import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; declare let twq: any; declare let twttr: any; @@ -57,7 +57,7 @@ export class TwitterTracker extends BaseTracker { }); } - public sendImpression(items: Impression[], ts?: Date): void { + public sendImpression(items: Displayable[], ts?: Date): void { this.twttr.conversion.trackPid(this.options.impressionPid, { tw_sale_amount: 0, tw_order_quantity: 0, @@ -66,6 +66,10 @@ export class TwitterTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddToCart(items: Archiveable[], ts?: Date): void {} + + public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendEvent( name: string, data?: Record, From 2f8c4538c4eb98c58a9bb5ddeae235b3e9797888 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 23 Sep 2020 21:21:57 +0900 Subject: [PATCH 04/39] Refactoring project structure --- src/__tests__/index.ts | 3 +- src/ecommerce/index.ts | 2 ++ .../common.ts => ecommerce/interface.ts} | 0 src/{trackers => }/ecommerce/legacy.ts | 0 src/index.ts | 4 +-- src/trackers/base.ts | 2 +- src/trackers/beacon/ecommerce.ts | 0 src/trackers/beacon/index.ts | 1 + src/trackers/{beacon.ts => beacon/tracker.ts} | 8 +++--- src/trackers/ecommerce/index.ts | 3 -- .../{ecommerce/ga.ts => ga/ecommerce.ts} | 28 +++---------------- src/trackers/ga/index.ts | 1 + src/trackers/{ga.ts => ga/tracker.ts} | 13 +++------ src/trackers/ga/utils.ts | 23 +++++++++++++++ src/trackers/gtag.ts | 2 +- src/trackers/index.ts | 6 ++-- src/trackers/kakao.ts | 2 +- src/trackers/pixel.ts | 2 +- src/trackers/tagmanager.ts | 2 +- src/trackers/twitter.ts | 2 +- 20 files changed, 51 insertions(+), 53 deletions(-) create mode 100644 src/ecommerce/index.ts rename src/{trackers/ecommerce/common.ts => ecommerce/interface.ts} (100%) rename src/{trackers => }/ecommerce/legacy.ts (100%) create mode 100644 src/trackers/beacon/ecommerce.ts create mode 100644 src/trackers/beacon/index.ts rename src/trackers/{beacon.ts => beacon/tracker.ts} (93%) delete mode 100644 src/trackers/ecommerce/index.ts rename src/trackers/{ecommerce/ga.ts => ga/ecommerce.ts} (88%) create mode 100644 src/trackers/ga/index.ts rename src/trackers/{ga.ts => ga/tracker.ts} (92%) create mode 100644 src/trackers/ga/utils.ts diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index 3eaf286..54a8f25 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -1,7 +1,6 @@ import { DeviceType, MainTrackerOptions, Tracker } from '../index'; import { BeaconTracker, - GAEcommerceTracker, GATracker, KakaoTracker, PixelTracker, @@ -9,7 +8,7 @@ import { TwitterTracker, } from '../trackers'; import { BaseTracker, EventTracker } from '../trackers/base'; -import { Impression } from '../trackers/ecommerce/ga'; +import { GAEcommerceTracker, Impression } from '../trackers/ga/ecommerce'; const ALL_TRACKERS = [ BeaconTracker, diff --git a/src/ecommerce/index.ts b/src/ecommerce/index.ts new file mode 100644 index 0000000..ffacf7b --- /dev/null +++ b/src/ecommerce/index.ts @@ -0,0 +1,2 @@ +export * from './interface'; +export * from './legacy'; diff --git a/src/trackers/ecommerce/common.ts b/src/ecommerce/interface.ts similarity index 100% rename from src/trackers/ecommerce/common.ts rename to src/ecommerce/interface.ts diff --git a/src/trackers/ecommerce/legacy.ts b/src/ecommerce/legacy.ts similarity index 100% rename from src/trackers/ecommerce/legacy.ts rename to src/ecommerce/legacy.ts diff --git a/src/index.ts b/src/index.ts index 4388444..530ab5b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ import URL from 'url-parse'; import { BeaconOptions, BeaconTracker, + Displayable, GAOptions, GATracker, GTagOptions, @@ -18,7 +19,6 @@ import { TwitterTracker, } from './trackers'; import { BaseTracker, EventTracker, PageMeta } from './trackers/base'; -import { Impression } from './trackers/ecommerce/ga'; export enum DeviceType { PC = 'pc', @@ -182,7 +182,7 @@ export class Tracker { } @pushEventToQueue() - public sendImpression(items: Impression[]): EventParameters { + public sendImpression(items: Displayable[]): EventParameters { return [items]; } diff --git a/src/trackers/base.ts b/src/trackers/base.ts index ea35b00..472408b 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,5 +1,5 @@ import { DeviceType, MainTrackerOptions } from '../index'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Purchasable } from '../ecommerce'; /* eslint-disable camelcase */ export interface PageMeta { diff --git a/src/trackers/beacon/ecommerce.ts b/src/trackers/beacon/ecommerce.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/trackers/beacon/index.ts b/src/trackers/beacon/index.ts new file mode 100644 index 0000000..c6df020 --- /dev/null +++ b/src/trackers/beacon/index.ts @@ -0,0 +1 @@ +export * from './tracker'; diff --git a/src/trackers/beacon.ts b/src/trackers/beacon/tracker.ts similarity index 93% rename from src/trackers/beacon.ts rename to src/trackers/beacon/tracker.ts index 9379bc7..4ecc089 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon/tracker.ts @@ -1,9 +1,9 @@ import URL from 'url-parse'; -import { PVID, RUID } from '../uid'; -import { UIDFactory } from '../uid/factory'; -import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { PVID, RUID } from '../../uid'; +import { UIDFactory } from '../../uid/factory'; +import { BaseTracker, PageMeta } from '../base'; +import { Archiveable, Displayable, Purchasable } from '../../ecommerce'; export interface BeaconOptions { beaconSrc?: string; diff --git a/src/trackers/ecommerce/index.ts b/src/trackers/ecommerce/index.ts deleted file mode 100644 index ad43886..0000000 --- a/src/trackers/ecommerce/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './common'; -export * from './ga'; -export * from './legacy'; diff --git a/src/trackers/ecommerce/ga.ts b/src/trackers/ga/ecommerce.ts similarity index 88% rename from src/trackers/ecommerce/ga.ts rename to src/trackers/ga/ecommerce.ts index b0ef599..7cbb993 100644 --- a/src/trackers/ecommerce/ga.ts +++ b/src/trackers/ga/ecommerce.ts @@ -4,8 +4,10 @@ import { EcommerceTracker, Purchasable, Displayable, -} from './common'; -import { Trackable } from './legacy'; + Trackable, +} from '../../ecommerce'; + +import { GAHelper } from './utils'; export class Impression implements Clickable, Displayable { public static from(trackable: Trackable): Impression { @@ -175,25 +177,3 @@ export class GAEcommerceTracker implements EcommerceTracker { }); } } - -class GAHelper { - public static addProduct(product: Product): void { - ga('ec:addProduct', product); - } - - public static addPromotion(promotion: Promotion): void { - ga('ec:addPromo', promotion); - } - - public static addImpression(impression: Impression): void { - ga('ec:addImpression', impression); - } - - public static setAction(action: string, ...args: Record[]) { - ga('ec:setAction', action, ...args); - } - - public static sendEvent(...args: any[]) { - ga('send', 'event', ...args); - } -} diff --git a/src/trackers/ga/index.ts b/src/trackers/ga/index.ts new file mode 100644 index 0000000..c6df020 --- /dev/null +++ b/src/trackers/ga/index.ts @@ -0,0 +1 @@ +export * from './tracker'; diff --git a/src/trackers/ga.ts b/src/trackers/ga/tracker.ts similarity index 92% rename from src/trackers/ga.ts rename to src/trackers/ga/tracker.ts index 4d88888..e3e34a4 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga/tracker.ts @@ -1,12 +1,7 @@ -import { loadGA } from '../utils/externalServices'; -import { BaseTracker, PageMeta } from './base'; -import { - Archiveable, - Displayable, - GAEcommerceTracker, - Impression, - Purchasable, -} from './ecommerce'; +import { loadGA } from '../../utils/externalServices'; +import { BaseTracker, PageMeta } from '../base'; +import { Archiveable, Displayable, Purchasable } from '../../ecommerce'; +import { GAEcommerceTracker } from './ecommerce'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; diff --git a/src/trackers/ga/utils.ts b/src/trackers/ga/utils.ts new file mode 100644 index 0000000..4afed57 --- /dev/null +++ b/src/trackers/ga/utils.ts @@ -0,0 +1,23 @@ +import { Impression, Product, Promotion } from './ecommerce'; + +export class GAHelper { + public static addProduct(product: Product): void { + ga('ec:addProduct', product); + } + + public static addPromotion(promotion: Promotion): void { + ga('ec:addPromo', promotion); + } + + public static addImpression(impression: Impression): void { + ga('ec:addImpression', impression); + } + + public static setAction(action: string, ...args: Record[]) { + ga('ec:setAction', action, ...args); + } + + public static sendEvent(...args: any[]) { + ga('send', 'event', ...args); + } +} diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index 8f5abdf..448653d 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -1,6 +1,6 @@ import { loadGTag } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Purchasable } from '../ecommerce'; export interface GTagOptions { trackingId: string; diff --git a/src/trackers/index.ts b/src/trackers/index.ts index c8dee35..aa9d02e 100644 --- a/src/trackers/index.ts +++ b/src/trackers/index.ts @@ -1,8 +1,8 @@ -export * from './beacon'; -export * from './ga'; +export * from './beacon/tracker'; +export * from './ga/tracker'; export * from './pixel'; export * from './tagmanager'; export * from './gtag'; export * from './kakao'; export * from './twitter'; -export * from './ecommerce'; +export * from '../ecommerce'; diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index d18a11a..a034c1c 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,6 +1,6 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Purchasable } from '../ecommerce'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 4ad9946..aa661a2 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,6 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Purchasable } from '../ecommerce'; export interface PixelOptions { pixelId: string | string[]; diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index b9ed7b5..2e3a3a8 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,7 +2,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Purchasable } from '../ecommerce'; export interface TagManagerOptions { trackingId: string; diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 07055b5..88062ba 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Impression, Purchasable } from './ecommerce'; +import { Archiveable, Displayable, Purchasable } from '../ecommerce'; declare let twq: any; declare let twttr: any; From 196fc7149e08aa6b803602118088cc0c590a5aad Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 25 Sep 2020 17:53:43 +0900 Subject: [PATCH 05/39] Revert GA Ecommerce implementation, Deprecate GATracker --- .eslintrc.js | 1 + package-lock.json | 6 + package.json | 1 + src/ecommerce/interface.ts | 42 +++---- src/ecommerce/model.ts | 37 ++++++ src/index.ts | 4 +- src/trackers/base.ts | 54 +++++---- src/trackers/beacon/tracker.ts | 32 +++++- src/trackers/ga/ecommerce.ts | 179 ----------------------------- src/trackers/ga/tracker.ts | 47 +++++--- src/trackers/ga/utils.ts | 23 ---- src/trackers/gtag.ts | 53 --------- src/trackers/gtag/ecommerce.ts | 0 src/trackers/{ga => gtag}/index.ts | 0 src/trackers/gtag/tracker.ts | 85 ++++++++++++++ src/trackers/index.ts | 2 +- src/trackers/kakao.ts | 28 ++++- src/trackers/pixel.ts | 36 ++++-- src/trackers/tagmanager.ts | 34 ++++-- src/trackers/twitter.ts | 34 ++++-- 20 files changed, 349 insertions(+), 349 deletions(-) create mode 100644 src/ecommerce/model.ts delete mode 100644 src/trackers/ga/ecommerce.ts delete mode 100644 src/trackers/ga/utils.ts delete mode 100644 src/trackers/gtag.ts create mode 100644 src/trackers/gtag/ecommerce.ts rename src/trackers/{ga => gtag}/index.ts (100%) create mode 100644 src/trackers/gtag/tracker.ts diff --git a/.eslintrc.js b/.eslintrc.js index 9519950..92f4ce2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -33,6 +33,7 @@ module.exports = { 'func-names': 0, '@typescript-eslint/no-empty-function': 1, 'max-classes-per-file': ['error', 10], + 'lines-around-comment': 0, }, ignorePatterns: ['**/node_modules/**'], }; diff --git a/package-lock.json b/package-lock.json index a6dd1cf..62bafc0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -466,6 +466,12 @@ "resolved": "https://registry.npmjs.org/@types/google.analytics/-/google.analytics-0.0.39.tgz", "integrity": "sha512-AwVtVYACQg26MJz+752H6uskn53BR7eilCOHksUGkzobZNKc7O3RFTJrbD3yKAluXy6favVdynnr9btijjcakQ==" }, + "@types/gtag.js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.3.tgz", + "integrity": "sha512-iRF/4Q3G1t0OTNMjK52tpGSQPgEsYzWQL1IdVXt9BywK6MUK3ypB7LaoEQa8sW9gPXENoU1xAyCxqJhMkB2rCA==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", diff --git a/package.json b/package.json index 5afe414..75896be 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "devDependencies": { "@ridi/eslint-config": "^5.1.0", "@types/facebook-pixel": "0.0.19", + "@types/gtag.js": "0.0.3", "@types/jest": "^24.0.12", "@types/js-cookie": "^2.2.4", "@types/url-parse": "^1.4.1", diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index f6f52fb..076ed48 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -1,30 +1,30 @@ -export interface Displayable { - display(isLastItem: boolean): void; -} +import { Product, PurchaseInfo } from './model'; -export interface Clickable { - click(): void; -} +export interface EcommerceTracker { + sendStartSubscription(args?: Record, ts?: Date): void; -export interface Purchasable { - readonly price: number; - readonly quantity: number; - purchase(): void; -} + /** + * @deprecated Use sendItemView instead. + * @see sendItemView + */ -export interface Archiveable { - add(to: 'cart' | 'wishlist'): void; - remove(from: 'cart' | 'wishlist'): void; -} + sendImpression(items: Product[], ts?: Date): void; -export interface EcommerceTracker { - sendClick(...items: Clickable[]): void; + sendItemView(items: Product[], ts?: Date): void; + + sendItemViewFromList(items: Product[], ts?: Date): void; + + sendClick(items: Product[], ts?: Date): void; + + sendAddPaymentInfo(args?: Record, ts?: Date): void; + + sendPurchase(purchaseInfo: PurchaseInfo, items: Product[], ts?: Date): void; - sendPurchase(tId: string, ...items: Purchasable[]): void; + sendRefund(purchaseInfo: PurchaseInfo, items: Product[], ts?: Date): void; - sendDisplay(...items: Displayable[]): void; + sendAddToCart(items: Product[], ts?: Date): void; - sendAdd(to: 'cart' | 'wishlist', ...items: Archiveable[]): void; + sendRemoveFromCart(items: Product[], ts?: Date): void; - sendRemove(from: 'cart' | 'wishlist', ...items: Archiveable[]): void; + sendSearch(items: Product[], ts?: Date): void; } diff --git a/src/ecommerce/model.ts b/src/ecommerce/model.ts new file mode 100644 index 0000000..7b228ce --- /dev/null +++ b/src/ecommerce/model.ts @@ -0,0 +1,37 @@ +/** + * @see https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce#action-data + */ + +export interface PurchaseInfo { + readonly id: string; + readonly affiliation?: string; + readonly tax?: number; + readonly shipping?: number; + readonly checkoutOption?: string; +} + +/** + * @see https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce#product-data + */ + +export interface Product { + readonly id: string; + readonly name: string; + readonly brand?: string; + readonly category?: string; + readonly variant?: string; + readonly price?: number; + readonly quantity?: number; + readonly coupon?: string; + readonly listPosition?: number; +} + +/** + * @see https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce#promotion-data + */ +export interface Promotion { + readonly id?: string; + readonly name?: string; + readonly creativeName?: string; + readonly positionSlot?: number; +} diff --git a/src/index.ts b/src/index.ts index 530ab5b..5316e59 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import URL from 'url-parse'; import { BeaconOptions, BeaconTracker, - Displayable, + Viewable, GAOptions, GATracker, GTagOptions, @@ -182,7 +182,7 @@ export class Tracker { } @pushEventToQueue() - public sendImpression(items: Displayable[]): EventParameters { + public sendImpression(items: Viewable[]): EventParameters { return [items]; } diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 472408b..1704ecf 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,5 +1,11 @@ import { DeviceType, MainTrackerOptions } from '../index'; -import { Archiveable, Displayable, Purchasable } from '../ecommerce'; +import { + Archiveable, + Viewable, + Purchasable, + EcommerceTracker, +} from '../ecommerce'; +import { Product, PurchaseInfo } from '../ecommerce/model'; /* eslint-disable camelcase */ export interface PageMeta { @@ -18,19 +24,9 @@ export interface EventTracker { sendEvent(name: string, data?: Record, ts?: Date): void; sendSignUp(args?: Record, ts?: Date): void; - - sendStartSubscription(args?: Record, ts?: Date): void; - - sendImpression(items: Displayable[], ts?: Date): void; - - sendAddPaymentInfo(args?: Record, ts?: Date): void; - - sendPurchase(tId: string, items: Purchasable[], ts?: Date): void; - - sendAddToCart(items: Archiveable[], ts?: Date): void; } -export abstract class BaseTracker implements EventTracker { +export abstract class BaseTracker implements EventTracker, EcommerceTracker { public mainOptions: MainTrackerOptions; public abstract sendPageView(pageMeta: PageMeta, ts?: Date): void; @@ -43,7 +39,7 @@ export abstract class BaseTracker implements EventTracker { public abstract sendSignUp(args?: Record, ts?: Date): void; - public abstract sendImpression(items: Displayable[], ts?: Date): void; + public abstract sendImpression(items: Product[], ts?: Date): void; public abstract sendStartSubscription( args?: Record, @@ -55,14 +51,6 @@ export abstract class BaseTracker implements EventTracker { ts?: Date, ): void; - public abstract sendPurchase( - tId: string, - items: Purchasable[], - ts?: Date, - ): void; - - public abstract sendAddToCart(items: Archiveable[], ts?: Date): void; - public abstract isInitialized(): boolean; public abstract async initialize(): Promise; @@ -70,4 +58,28 @@ export abstract class BaseTracker implements EventTracker { public setMainOptions(newOptions: MainTrackerOptions): void { this.mainOptions = newOptions; } + + public abstract sendAddToCart(items: Product[], ts?: Date): void; + + public abstract sendClick(items: Product[], ts?: Date): void; + + public abstract sendItemView(items: Product[], ts?: Date): void; + + public abstract sendItemViewFromList(items: Product[], ts?: Date): void; + + public abstract sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void; + + public abstract sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void; + + public abstract sendRemoveFromCart(items: Product[], ts?: Date): void; + + public abstract sendSearch(items: Product[], ts?: Date): void; } diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 4ecc089..c9302a5 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -3,7 +3,7 @@ import URL from 'url-parse'; import { PVID, RUID } from '../../uid'; import { UIDFactory } from '../../uid/factory'; import { BaseTracker, PageMeta } from '../base'; -import { Archiveable, Displayable, Purchasable } from '../../ecommerce'; +import { Product, PurchaseInfo } from '../../ecommerce/model'; export interface BeaconOptions { beaconSrc?: string; @@ -105,20 +105,40 @@ export class BeaconTracker extends BaseTracker { this.sendBeacon(name, this.lastPageMeta, data, ts); } - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - - public sendImpression(items: Displayable[], ts?: Date): void {} + public sendImpression(items: Product[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendStartSubscription( args?: Record, ts?: Date, ): void {} - public sendAddToCart(items: Archiveable[], ts?: Date): void {} + public sendAddToCart(items: Product[], ts?: Date): void {} + + public sendClick(items: Product[], ts?: Date): void {} + + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendSearch(items: Product[], ts?: Date): void {} } enum BeaconEventName { diff --git a/src/trackers/ga/ecommerce.ts b/src/trackers/ga/ecommerce.ts deleted file mode 100644 index 7cbb993..0000000 --- a/src/trackers/ga/ecommerce.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { - Archiveable, - Clickable, - EcommerceTracker, - Purchasable, - Displayable, - Trackable, -} from '../../ecommerce'; - -import { GAHelper } from './utils'; - -export class Impression implements Clickable, Displayable { - public static from(trackable: Trackable): Impression { - return new Impression( - trackable.objId, - trackable.tags.name, - trackable.sectionFull, - trackable.tags.brand, - trackable.tags.category, - null, - trackable.position + 1, - ); - } - - public constructor( - public readonly id: string, - public readonly name: string, - public readonly list?: string, - public readonly brand?: string, - public readonly category?: string, - public readonly variant?: string, - public readonly position?: number, - public readonly price?: number, - ) {} - - public click(): void { - ga('ec:addProduct', this); - ga('ec:setAction', 'click', { list: this.list }); - - ga('send', 'event', 'click', this.toString().toLowerCase(), this.list); - } - - public display(isLastItem = false): void { - GAHelper.addImpression(this); - if (isLastItem) { - ga('send', 'event', 'display', this.toString().toLowerCase(), this.list); - } - } -} - -export class Product implements Archiveable, Displayable, Purchasable { - public static from(trackable: Trackable): Product { - return new Product( - trackable.objId, - trackable.tags.name, - trackable.tags.quantity, - trackable.tags.price, - trackable.tags.category, - null, - trackable.tags.brand, - null, - trackable.position + 1, - ); - } - - constructor( - public readonly id: string, - public readonly name: string, - public readonly quantity: number, - public readonly price: number, - public readonly brand?: string, - public readonly category?: string, - public readonly variant?: string, - public readonly coupon?: string, - public readonly position?: number, - ) {} - - display(isLastItem = false): void { - GAHelper.addProduct(this); - GAHelper.setAction('detail'); - if (isLastItem) { - // TODO: Replace section_full - - ga('send', 'event', 'product', 'display', 'section_full'); - } - } - - public purchase(): void { - GAHelper.addProduct(this); - } - - public add(to: 'cart' | 'wishlist'): void { - GAHelper.addProduct(this); - GAHelper.setAction('add'); - ga('send', 'event', to, 'click', 'section_full'); - } - - public remove(from: 'cart' | 'wishlist'): void { - GAHelper.addProduct(this); - GAHelper.setAction('remove'); - ga('send', 'event', from, 'click', 'section_full'); - } -} - -export class Promotion implements Clickable, Displayable { - public static from(trackable: Trackable): Promotion { - return new Promotion( - trackable.objId, - `[${trackable.genreKor}]${trackable.section}_${trackable.tags.name}`, - trackable.sectionFull, - trackable.position, - ); - } - - constructor( - public readonly id?: string, - public readonly name?: string, - public readonly creative?: string, - public readonly position?: number, - ) {} - - click(): void { - GAHelper.addPromotion(this); - GAHelper.setAction('promo_click'); - } - - display(isLastItem = false): void { - GAHelper.addPromotion(this); - GAHelper.setAction('promo_click'); - - if (isLastItem) { - ga( - 'send', - 'event', - this.toString().toLowerCase(), - 'display', - 'section_full', - ); - } - } -} - -export class GAEcommerceTracker implements EcommerceTracker { - sendClick(...items: Clickable[]): void { - items.forEach(it => it.click()); - } - - sendDisplay(...items: Displayable[]): void { - items.forEach((it, idx) => { - const isLastItem = idx === items.length - 1; - it.display(isLastItem); - }); - } - - sendPurchase(tId: string, ...items: Purchasable[]): void { - let totalRevenue = 0; - - items.forEach(it => { - it.purchase(); - totalRevenue += it.quantity > 0 ? it.price : 0; - }); - - GAHelper.setAction('purchase', { id: tId, revenue: totalRevenue }); - GAHelper.sendEvent('purchase', 'event', 'section_full'); - ga('send', 'event', 'purchase', 'event', 'section_full'); - } - - sendRemove(from: 'cart' | 'wishlist', ...items: Archiveable[]): void { - items.forEach(it => { - it.remove(from); - }); - } - - sendAdd(to: 'cart' | 'wishlist', ...items: Archiveable[]): void { - items.forEach(it => { - it.add(to); - }); - } -} diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index e3e34a4..39b54c2 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -1,7 +1,6 @@ import { loadGA } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { Archiveable, Displayable, Purchasable } from '../../ecommerce'; -import { GAEcommerceTracker } from './ecommerce'; +import { Product, PurchaseInfo } from '../../ecommerce/model'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -13,13 +12,16 @@ export interface GAOptions { fields?: GAFields; } +/** + * @deprecated Use GTagTracker Instead + * @see GTagTracker + */ + export class GATracker extends BaseTracker { constructor(private options: GAOptions) { super(); } - private ecommerceTracker: GAEcommerceTracker; - private refinePath(originalPath: string): string { const refiners: Array<(path: string) => string> = [ path => (this.options.pathPrefix ? this.options.pathPrefix + path : path), // Ref: https://app.asana.com/0/inbox/463186034180509/765912307342230/766156873493449 // Pathname in some browsers doesn't start with slash character (/) @@ -37,9 +39,6 @@ export class GATracker extends BaseTracker { } else { ga('create', this.options.trackingId, 'auto'); } - ga('require', 'ec'); - - this.ecommerceTracker = new GAEcommerceTracker(); } public isInitialized(): boolean { @@ -77,24 +76,38 @@ export class GATracker extends BaseTracker { ga('send', fields); } - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendImpression(items: Product[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendStartSubscription( args?: Record, ts?: Date, ): void {} - public sendImpression(items: Displayable[], ts?: Date): void { - this.ecommerceTracker.sendDisplay(...items); - } + public sendAddToCart(items: Product[], ts?: Date): void {} - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void { - this.ecommerceTracker.sendPurchase(tId, ...items); - } + public sendClick(items: Product[], ts?: Date): void {} - public sendAddToCart(items: Archiveable[], ts?: Date): void { - this.ecommerceTracker.sendAdd('cart', ...items); - } + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} + + public sendSearch(items: Product[], ts?: Date): void {} } diff --git a/src/trackers/ga/utils.ts b/src/trackers/ga/utils.ts deleted file mode 100644 index 4afed57..0000000 --- a/src/trackers/ga/utils.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Impression, Product, Promotion } from './ecommerce'; - -export class GAHelper { - public static addProduct(product: Product): void { - ga('ec:addProduct', product); - } - - public static addPromotion(promotion: Promotion): void { - ga('ec:addPromo', promotion); - } - - public static addImpression(impression: Impression): void { - ga('ec:addImpression', impression); - } - - public static setAction(action: string, ...args: Record[]) { - ga('ec:setAction', action, ...args); - } - - public static sendEvent(...args: any[]) { - ga('send', 'event', ...args); - } -} diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts deleted file mode 100644 index 448653d..0000000 --- a/src/trackers/gtag.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { loadGTag } from '../utils/externalServices'; -import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Purchasable } from '../ecommerce'; - -export interface GTagOptions { - trackingId: string; -} - -declare global { - interface Window { - dataLayer?: Record[]; - } -} - -export class GTagTracker extends BaseTracker { - constructor(private options: GTagOptions) { - super(); - } - - private tagCalled = false; - - public async initialize(): Promise { - await loadGTag(this.options.trackingId); - this.tagCalled = true; - } - - public isInitialized(): boolean { - return this.tagCalled; - } - - public sendPageView(pageMeta: PageMeta, ts?: Date): void {} - - public sendEvent( - name: string, - data?: Record, - ts?: Date, - ): void {} - - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - - public sendImpression(items: Displayable[], ts?: Date): void {} - - public sendSignUp(args?: Record, ts?: Date): void {} - - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} - - public sendAddToCart(items: Archiveable[], ts?: Date): void {} - - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} -} diff --git a/src/trackers/gtag/ecommerce.ts b/src/trackers/gtag/ecommerce.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/trackers/ga/index.ts b/src/trackers/gtag/index.ts similarity index 100% rename from src/trackers/ga/index.ts rename to src/trackers/gtag/index.ts diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts new file mode 100644 index 0000000..eee43f1 --- /dev/null +++ b/src/trackers/gtag/tracker.ts @@ -0,0 +1,85 @@ +import { loadGTag } from '../../utils/externalServices'; +import { BaseTracker, PageMeta } from '../base'; +import { Product, PurchaseInfo } from '../../ecommerce/model'; + +export interface GTagOptions { + trackingId: string; +} + +declare global { + interface Window { + dataLayer?: Record[]; + } +} + +export class GTagTracker extends BaseTracker { + constructor(private options: GTagOptions) { + super(); + } + + public async initialize(): Promise { + await loadGTag(this.options.trackingId); + gtag('config', this.options.trackingId); + } + + public isInitialized(): boolean { + return typeof gtag === 'function'; + } + + public sendPageView(pageMeta: PageMeta, ts?: Date): void { + gtag('event', 'page_view', { + page_location: pageMeta.href, + page_path: pageMeta.path, + page_title: pageMeta.page, + }); + } + + public sendEvent( + name: string, + data?: Record, + ts?: Date, + ): void { + gtag('event', name, data); + } + + public sendAddPaymentInfo(args?: Record, ts?: Date): void { + gtag('event', 'add_payment_info'); + } + + public sendSignUp(args?: Record, ts?: Date): void { + gtag('event', 'sign_up', { + method: 'ridi', + }); + } + + public sendImpression(items: Product[], ts?: Date): void {} + + public sendStartSubscription( + args?: Record, + ts?: Date, + ): void {} + + public sendAddToCart(items: Product[], ts?: Date): void {} + + public sendClick(items: Product[], ts?: Date): void {} + + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} + + public sendSearch(items: Product[], ts?: Date): void {} +} diff --git a/src/trackers/index.ts b/src/trackers/index.ts index aa9d02e..483c7a5 100644 --- a/src/trackers/index.ts +++ b/src/trackers/index.ts @@ -2,7 +2,7 @@ export * from './beacon/tracker'; export * from './ga/tracker'; export * from './pixel'; export * from './tagmanager'; -export * from './gtag'; +export * from './gtag/tracker'; export * from './kakao'; export * from './twitter'; export * from '../ecommerce'; diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index a034c1c..02568ca 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,6 +1,6 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Purchasable } from '../ecommerce'; +import { Product, PurchaseInfo } from '../ecommerce/model'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; @@ -51,15 +51,35 @@ export class KakaoTracker extends BaseTracker { this.tracker.signUp(); } - public sendImpression(items: Displayable[], ts?: Date): void { + public sendImpression(items: Product[], ts?: Date): void { this.tracker.viewContent(); } public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendAddToCart(items: Archiveable[], ts?: Date): void {} + public sendAddToCart(items: Product[], ts?: Date): void {} - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendClick(items: Product[], ts?: Date): void {} + + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} + + public sendSearch(items: Product[], ts?: Date): void {} public sendEvent( name: string, diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index aa661a2..fa42838 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,6 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Purchasable } from '../ecommerce'; +import { Product, PurchaseInfo } from '../ecommerce/model'; export interface PixelOptions { pixelId: string | string[]; @@ -41,24 +41,44 @@ export class PixelTracker extends BaseTracker { } } - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendEvent( name: string, data?: Record, ts?: Date, ): void {} - public sendAddToCart(items: Archiveable[], ts?: Date): void {} - - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} - - public sendImpression(items: Displayable[], ts?: Date): void {} + public sendImpression(items: Product[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendStartSubscription( args?: Record, ts?: Date, ): void {} + + public sendAddToCart(items: Product[], ts?: Date): void {} + + public sendClick(items: Product[], ts?: Date): void {} + + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} + + public sendSearch(items: Product[], ts?: Date): void {} } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 2e3a3a8..d89bd07 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,7 +2,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Purchasable } from '../ecommerce'; +import { Product, PurchaseInfo } from '../ecommerce/model'; export interface TagManagerOptions { trackingId: string; @@ -65,18 +65,38 @@ export class TagManagerTracker extends BaseTracker { this.dataLayer.push(data); } - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - - public sendImpression(items: Displayable[], ts?: Date): void {} + public sendImpression(items: Product[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} - public sendAddToCart(items: Archiveable[], ts?: Date): void {} - - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendAddPaymentInfo(args?: Record, ts?: Date): void {} public sendStartSubscription( args?: Record, ts?: Date, ): void {} + + public sendAddToCart(items: Product[], ts?: Date): void {} + + public sendClick(items: Product[], ts?: Date): void {} + + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} + + public sendSearch(items: Product[], ts?: Date): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 88062ba..42f3eee 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Archiveable, Displayable, Purchasable } from '../ecommerce'; +import { Product, PurchaseInfo } from '../ecommerce/model'; declare let twq: any; declare let twttr: any; @@ -36,6 +36,12 @@ export class TwitterTracker extends BaseTracker { return typeof this.twq === 'function' && typeof this.twttr === 'object'; } + public sendEvent( + name: string, + data?: Record, + ts?: Date, + ): void {} + public sendPageView(pageMeta: PageMeta, ts?: Date): void { this.twq('track', 'pageView'); } @@ -57,7 +63,7 @@ export class TwitterTracker extends BaseTracker { }); } - public sendImpression(items: Displayable[], ts?: Date): void { + public sendImpression(items: Product[], ts?: Date): void { this.twttr.conversion.trackPid(this.options.impressionPid, { tw_sale_amount: 0, tw_order_quantity: 0, @@ -66,13 +72,27 @@ export class TwitterTracker extends BaseTracker { public sendAddPaymentInfo(args?: Record, ts?: Date): void {} - public sendAddToCart(items: Archiveable[], ts?: Date): void {} + public sendAddToCart(items: Product[], ts?: Date): void {} - public sendPurchase(tId: string, items: Purchasable[], ts?: Date): void {} + public sendClick(items: Product[], ts?: Date): void {} - public sendEvent( - name: string, - data?: Record, + public sendItemView(items: Product[], ts?: Date): void {} + + public sendItemViewFromList(items: Product[], ts?: Date): void {} + + public sendPurchase( + purchaseInfo: PurchaseInfo, + items: Product[], + ts?: Date, + ): void {} + + public sendRefund( + purchaseInfo: PurchaseInfo, + items: Product[], ts?: Date, ): void {} + + public sendRemoveFromCart(items: Product[], ts?: Date): void {} + + public sendSearch(items: Product[], ts?: Date): void {} } From a042803d4885b4efa7f5494bf21d6d9dfdf5d9eb Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 25 Sep 2020 19:26:21 +0900 Subject: [PATCH 06/39] Implement GtagTacker --- src/__tests__/index.ts | 29 +++++++------------- src/ecommerce/interface.ts | 2 +- src/index.ts | 25 ++++++++++------- src/trackers/base.ts | 9 ++---- src/trackers/beacon/tracker.ts | 2 +- src/trackers/ga/index.ts | 1 + src/trackers/ga/tracker.ts | 2 +- src/trackers/gtag/tracker.ts | 50 ++++++++++++++++++++++++++++------ src/trackers/index.ts | 4 +-- src/trackers/kakao.ts | 2 +- src/trackers/pixel.ts | 2 +- src/trackers/tagmanager.ts | 2 +- src/trackers/twitter.ts | 2 +- 13 files changed, 78 insertions(+), 54 deletions(-) create mode 100644 src/trackers/ga/index.ts diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index 54a8f25..3be5512 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -1,4 +1,9 @@ -import { DeviceType, MainTrackerOptions, Tracker } from '../index'; +import { + DeviceType, + EventTrackerMethodNames, + MainTrackerOptions, + Tracker, +} from '../index'; import { BeaconTracker, GATracker, @@ -7,8 +12,7 @@ import { TagManagerTracker, TwitterTracker, } from '../trackers'; -import { BaseTracker, EventTracker } from '../trackers/base'; -import { GAEcommerceTracker, Impression } from '../trackers/ga/ecommerce'; +import { BaseTracker } from '../trackers/base'; const ALL_TRACKERS = [ BeaconTracker, @@ -96,7 +100,7 @@ class TestableTracker extends Tracker { public mocking( trackers: Array BaseTracker>, - methodName: keyof EventTracker, + methodName: EventTrackerMethodNames, mockImpl: () => void = () => true, ) { const mockingTargetTrackers = this.getTrackerInstances(...trackers); @@ -107,7 +111,7 @@ class TestableTracker extends Tracker { public mockingAll( trackers: Array BaseTracker>, - methodNames: Array, + methodNames: Array, mockImpl: () => void = () => true, ) { return methodNames.map(m => this.mocking(trackers, m, mockImpl)); @@ -277,7 +281,7 @@ it('Test TwitterTracker', async () => { t.throttledFlush = t.flush.bind(t); t.sendPageView('href'); - t.sendImpression([new Impression('12', 'name')]); + t.sendImpression([]); t.sendSignUp(); t.sendStartSubscription(); @@ -299,16 +303,3 @@ it('Test TwitterTracker', async () => { { tw_sale_amount: 0, tw_order_quantity: 0 }, ); }); - -it('Test GA', async () => { - const t = new TestableTracker(); - t.mocking(ALL_TRACKERS.excludes(GATracker), 'sendImpression'); - await t.initialize(); - const gaTracker = t.getTrackerInstance(GATracker); - - // @ts-ignore - - gaTracker.ecommerceTracker = new GAEcommerceTracker(); - - t.sendImpression([new Impression('id', 'name')]); -}); diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 076ed48..670feb9 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -26,5 +26,5 @@ export interface EcommerceTracker { sendRemoveFromCart(items: Product[], ts?: Date): void; - sendSearch(items: Product[], ts?: Date): void; + sendSearch(searchTerm: string, ts?: Date): void; } diff --git a/src/index.ts b/src/index.ts index 5316e59..ceb935d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,7 @@ import URL from 'url-parse'; import { BeaconOptions, BeaconTracker, - Viewable, + EcommerceTracker, GAOptions, GATracker, GTagOptions, @@ -19,6 +19,7 @@ import { TwitterTracker, } from './trackers'; import { BaseTracker, EventTracker, PageMeta } from './trackers/base'; +import { Product } from './ecommerce/model'; export enum DeviceType { PC = 'pc', @@ -50,20 +51,24 @@ export interface ChangeableTrackerOptions { serviceProps?: ServiceProp; } -type EventParameters = Parameters; +type EventParameters = + | Parameters + | Parameters; + +export type EventTrackerMethodNames = + | keyof EventTracker + | keyof EcommerceTracker; interface QueueItem { - consumerMethodName: keyof EventTracker; + consumerMethodName: EventTrackerMethodNames; eventParams: EventParameters; ts: Date; } -function pushEventToQueue(consumerMethodName?: keyof EventTracker) { - return ( - target: any, - propertyKey: keyof EventTracker, - descriptor: PropertyDescriptor, - ) => { +function pushEventToQueue( + consumerMethodName?: T, +) { + return (target: any, propertyKey: T, descriptor: PropertyDescriptor) => { consumerMethodName = consumerMethodName || propertyKey; const originalMethod = descriptor.value; @@ -182,7 +187,7 @@ export class Tracker { } @pushEventToQueue() - public sendImpression(items: Viewable[]): EventParameters { + public sendImpression(items: Product[]): EventParameters { return [items]; } diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 1704ecf..0a2072f 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,10 +1,5 @@ import { DeviceType, MainTrackerOptions } from '../index'; -import { - Archiveable, - Viewable, - Purchasable, - EcommerceTracker, -} from '../ecommerce'; +import { EcommerceTracker } from '../ecommerce'; import { Product, PurchaseInfo } from '../ecommerce/model'; /* eslint-disable camelcase */ @@ -81,5 +76,5 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { public abstract sendRemoveFromCart(items: Product[], ts?: Date): void; - public abstract sendSearch(items: Product[], ts?: Date): void; + public abstract sendSearch(searchTerm: string, ts?: Date): void; } diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index c9302a5..3df8a5b 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -138,7 +138,7 @@ export class BeaconTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} } enum BeaconEventName { diff --git a/src/trackers/ga/index.ts b/src/trackers/ga/index.ts new file mode 100644 index 0000000..c6df020 --- /dev/null +++ b/src/trackers/ga/index.ts @@ -0,0 +1 @@ +export * from './tracker'; diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 39b54c2..7f3215a 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -109,5 +109,5 @@ export class GATracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} } diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index eee43f1..a0732c1 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -4,6 +4,8 @@ import { Product, PurchaseInfo } from '../../ecommerce/model'; export interface GTagOptions { trackingId: string; + autoPageView?: boolean; + defaultCurrency?: string; } declare global { @@ -15,11 +17,15 @@ declare global { export class GTagTracker extends BaseTracker { constructor(private options: GTagOptions) { super(); + options.defaultCurrency = options.defaultCurrency || 'KRW'; } public async initialize(): Promise { await loadGTag(this.options.trackingId); - gtag('config', this.options.trackingId); + gtag('config', this.options.trackingId, { + send_page_view: this.options.autoPageView, + }); + gtag('set', { currency: this.options.defaultCurrency }); } public isInitialized(): boolean { @@ -52,34 +58,60 @@ export class GTagTracker extends BaseTracker { }); } - public sendImpression(items: Product[], ts?: Date): void {} + public sendImpression(items: Product[], ts?: Date): void { + this.sendItemView(items, ts); + } public sendStartSubscription( args?: Record, ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Product[], ts?: Date): void { + gtag('event', 'add_to_cart', { + value: items.map(p => p.price).reduce((pre, cur) => pre + cur), + items, + }); + } public sendClick(items: Product[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Product[], ts?: Date): void { + gtag('event', 'view_item', { items }); + } - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Product[], ts?: Date): void { + gtag('event', 'view_item_list', { items }); + } public sendPurchase( purchaseInfo: PurchaseInfo, items: Product[], ts?: Date, - ): void {} + ): void { + gtag('event', 'purchase', { + purchaseInfo, + items, + }); + } public sendRefund( purchaseInfo: PurchaseInfo, items: Product[], ts?: Date, - ): void {} + ): void { + gtag('event', 'refund', { + purchaseInfo, + items, + }); + } - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Product[], ts?: Date): void { + gtag('event', 'remove_from_cart', { + value: items.map(p => p.price).reduce((pre, cur) => pre + cur), + items, + }); + } - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} } diff --git a/src/trackers/index.ts b/src/trackers/index.ts index 483c7a5..ebaec43 100644 --- a/src/trackers/index.ts +++ b/src/trackers/index.ts @@ -1,5 +1,5 @@ -export * from './beacon/tracker'; -export * from './ga/tracker'; +export * from './beacon'; +export * from './ga'; export * from './pixel'; export * from './tagmanager'; export * from './gtag/tracker'; diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 02568ca..a29204a 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -79,7 +79,7 @@ export class KakaoTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} public sendEvent( name: string, diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index fa42838..302c3cc 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -80,5 +80,5 @@ export class PixelTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index d89bd07..c6201fc 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -98,5 +98,5 @@ export class TagManagerTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 42f3eee..6f7942d 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -94,5 +94,5 @@ export class TwitterTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} - public sendSearch(items: Product[], ts?: Date): void {} + public sendSearch(searchTerm: string, ts?: Date): void {} } From aa69e2e0a914a74216e4d6c3baf919d6d5aee4bc Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 28 Sep 2020 14:26:36 +0900 Subject: [PATCH 07/39] Update sendClick parameters --- src/ecommerce/interface.ts | 4 ++-- src/ecommerce/model.ts | 8 ++++++++ src/trackers/base.ts | 4 ++-- src/trackers/beacon/tracker.ts | 4 ++-- src/trackers/ga/tracker.ts | 4 ++-- src/trackers/gtag/tracker.ts | 6 ++++-- src/trackers/kakao.ts | 4 ++-- src/trackers/pixel.ts | 4 ++-- src/trackers/tagmanager.ts | 4 ++-- src/trackers/twitter.ts | 4 ++-- 10 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 670feb9..091b254 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -1,4 +1,4 @@ -import { Product, PurchaseInfo } from './model'; +import { Product, PurchaseInfo, UIElement } from './model'; export interface EcommerceTracker { sendStartSubscription(args?: Record, ts?: Date): void; @@ -14,7 +14,7 @@ export interface EcommerceTracker { sendItemViewFromList(items: Product[], ts?: Date): void; - sendClick(items: Product[], ts?: Date): void; + sendClick(items: UIElement[], ts?: Date): void; sendAddPaymentInfo(args?: Record, ts?: Date): void; diff --git a/src/ecommerce/model.ts b/src/ecommerce/model.ts index 7b228ce..eb7c734 100644 --- a/src/ecommerce/model.ts +++ b/src/ecommerce/model.ts @@ -35,3 +35,11 @@ export interface Promotion { readonly creativeName?: string; readonly positionSlot?: number; } + +/** + * @example carousel, banner + */ + +export interface UIElement { + readonly section: string; +} diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 0a2072f..6eef53d 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,6 +1,6 @@ import { DeviceType, MainTrackerOptions } from '../index'; import { EcommerceTracker } from '../ecommerce'; -import { Product, PurchaseInfo } from '../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; /* eslint-disable camelcase */ export interface PageMeta { @@ -56,7 +56,7 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { public abstract sendAddToCart(items: Product[], ts?: Date): void; - public abstract sendClick(items: Product[], ts?: Date): void; + public abstract sendClick(items: UIElement[], ts?: Date): void; public abstract sendItemView(items: Product[], ts?: Date): void; diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 3df8a5b..81b78e6 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -3,7 +3,7 @@ import URL from 'url-parse'; import { PVID, RUID } from '../../uid'; import { UIDFactory } from '../../uid/factory'; import { BaseTracker, PageMeta } from '../base'; -import { Product, PurchaseInfo } from '../../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../../ecommerce/model'; export interface BeaconOptions { beaconSrc?: string; @@ -118,7 +118,7 @@ export class BeaconTracker extends BaseTracker { public sendAddToCart(items: Product[], ts?: Date): void {} - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void {} public sendItemView(items: Product[], ts?: Date): void {} diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 7f3215a..2357730 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -1,6 +1,6 @@ import { loadGA } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { Product, PurchaseInfo } from '../../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../../ecommerce/model'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -89,7 +89,7 @@ export class GATracker extends BaseTracker { public sendAddToCart(items: Product[], ts?: Date): void {} - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void {} public sendItemView(items: Product[], ts?: Date): void {} diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index a0732c1..10d3654 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -1,6 +1,6 @@ import { loadGTag } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { Product, PurchaseInfo } from '../../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../../ecommerce/model'; export interface GTagOptions { trackingId: string; @@ -74,7 +74,9 @@ export class GTagTracker extends BaseTracker { }); } - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void { + // TODO: Add Custom Event + } public sendItemView(items: Product[], ts?: Date): void { gtag('event', 'view_item', { items }); diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index a29204a..fb1d9c0 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,6 +1,6 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo } from '../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; @@ -59,7 +59,7 @@ export class KakaoTracker extends BaseTracker { public sendAddToCart(items: Product[], ts?: Date): void {} - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void {} public sendItemView(items: Product[], ts?: Date): void {} diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 302c3cc..8fa3297 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,6 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo } from '../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; export interface PixelOptions { pixelId: string | string[]; @@ -60,7 +60,7 @@ export class PixelTracker extends BaseTracker { public sendAddToCart(items: Product[], ts?: Date): void {} - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void {} public sendItemView(items: Product[], ts?: Date): void {} diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index c6201fc..a4d77ba 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,7 +2,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo } from '../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; export interface TagManagerOptions { trackingId: string; @@ -78,7 +78,7 @@ export class TagManagerTracker extends BaseTracker { public sendAddToCart(items: Product[], ts?: Date): void {} - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void {} public sendItemView(items: Product[], ts?: Date): void {} diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 6f7942d..0f118fc 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo } from '../ecommerce/model'; +import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; declare let twq: any; declare let twttr: any; @@ -74,7 +74,7 @@ export class TwitterTracker extends BaseTracker { public sendAddToCart(items: Product[], ts?: Date): void {} - public sendClick(items: Product[], ts?: Date): void {} + public sendClick(items: UIElement[], ts?: Date): void {} public sendItemView(items: Product[], ts?: Date): void {} From 86beb0d8e06595344c92441818c83e5f4763d86e Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 28 Sep 2020 17:40:53 +0900 Subject: [PATCH 08/39] Formatting test codes --- src/__tests__/index.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index 3be5512..04414a8 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -139,7 +139,6 @@ it('BeaconTracker sends PageView event with serviceProps', async () => { const sendBeaconMock = jest.fn(); // @ts-ignore - BeaconTracker.prototype.sendBeacon = sendBeaconMock; t.sendPageView(href, referrer); @@ -227,7 +226,6 @@ it('GATracker should send pageview event', async () => { await t.initialize(); // @ts-ignore - window.ga = jest.fn(); t.sendPageView(href, referrer); @@ -262,22 +260,17 @@ it('Test TwitterTracker', async () => { const twitterTracker = t.getTrackerInstance(TwitterTracker); // @ts-ignore - twitterTracker.twttr = { conversion: {} }; - // @ts-ignore - twitterTracker.twttr.conversion.trackPid = trackPidMock; // @ts-ignore - twitterTracker.twq = twqMock; await t.initialize(); /* Need to disable flush throttling when sending event multiple times in one test cases */ // @ts-ignore - t.throttledFlush = t.flush.bind(t); t.sendPageView('href'); From 6622e2db75cf25fa0a9f877356b167fee135246e Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 28 Sep 2020 17:42:46 +0900 Subject: [PATCH 09/39] Fix comments in EcommerceTracker interface --- src/ecommerce/interface.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 091b254..15013aa 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -4,8 +4,8 @@ export interface EcommerceTracker { sendStartSubscription(args?: Record, ts?: Date): void; /** - * @deprecated Use sendItemView instead. - * @see sendItemView + * @deprecated Use sendItemViewFromList instead. + * @see sendItemViewFromList */ sendImpression(items: Product[], ts?: Date): void; From 239ea9f076fdd487d7d0fee783ef5a3f43f012f2 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 28 Sep 2020 18:55:30 +0900 Subject: [PATCH 10/39] Add ViewPromotion Event --- src/ecommerce/interface.ts | 4 +++- src/trackers/base.ts | 13 ++++++++++++- src/trackers/beacon/tracker.ts | 19 ++++++++++++++----- src/trackers/ga/tracker.ts | 14 +++++++++++++- src/trackers/gtag/tracker.ts | 14 +++++++++++++- src/trackers/kakao.ts | 13 ++++++++++++- src/trackers/pixel.ts | 14 +++++++++++++- src/trackers/tagmanager.ts | 14 +++++++++++++- src/trackers/twitter.ts | 14 +++++++++++++- 9 files changed, 106 insertions(+), 13 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 15013aa..4fd78df 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -1,4 +1,4 @@ -import { Product, PurchaseInfo, UIElement } from './model'; +import { Product, Promotion, PurchaseInfo, UIElement } from './model'; export interface EcommerceTracker { sendStartSubscription(args?: Record, ts?: Date): void; @@ -27,4 +27,6 @@ export interface EcommerceTracker { sendRemoveFromCart(items: Product[], ts?: Date): void; sendSearch(searchTerm: string, ts?: Date): void; + + sendViewPromotion(promotion: Promotion, items?: [Product][], ts?: Date): void; } diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 6eef53d..4b95b76 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,6 +1,11 @@ import { DeviceType, MainTrackerOptions } from '../index'; import { EcommerceTracker } from '../ecommerce'; -import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../ecommerce/model'; /* eslint-disable camelcase */ export interface PageMeta { @@ -77,4 +82,10 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { public abstract sendRemoveFromCart(items: Product[], ts?: Date): void; public abstract sendSearch(searchTerm: string, ts?: Date): void; + + public abstract sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void; } diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 81b78e6..ff165dc 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -3,7 +3,13 @@ import URL from 'url-parse'; import { PVID, RUID } from '../../uid'; import { UIDFactory } from '../../uid/factory'; import { BaseTracker, PageMeta } from '../base'; -import { Product, PurchaseInfo, UIElement } from '../../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../../ecommerce/model'; +import { EcommerceTracker } from '../../ecommerce'; export interface BeaconOptions { beaconSrc?: string; @@ -16,10 +22,7 @@ export class BeaconTracker extends BaseTracker { use = true, }: BeaconOptions) { super(); - this.options = { - beaconSrc, - use, - }; + this.options = { beaconSrc, use }; } private options: BeaconOptions; @@ -139,6 +142,12 @@ export class BeaconTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } enum BeaconEventName { diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 2357730..419ed03 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -1,6 +1,12 @@ import { loadGA } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { Product, PurchaseInfo, UIElement } from '../../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../../ecommerce/model'; +import { EcommerceTracker } from '../../ecommerce'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -110,4 +116,10 @@ export class GATracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index 10d3654..8a3dc12 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -1,6 +1,12 @@ import { loadGTag } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { Product, PurchaseInfo, UIElement } from '../../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../../ecommerce/model'; +import { EcommerceTracker } from '../../ecommerce'; export interface GTagOptions { trackingId: string; @@ -116,4 +122,10 @@ export class GTagTracker extends BaseTracker { } public sendSearch(searchTerm: string, ts?: Date): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index fb1d9c0..a563808 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,6 +1,11 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../ecommerce/model'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; @@ -86,4 +91,10 @@ export class KakaoTracker extends BaseTracker { data?: Record, ts?: Date, ): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 8fa3297..d6c52dd 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,12 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../ecommerce/model'; +import { EcommerceTracker } from '../ecommerce'; export interface PixelOptions { pixelId: string | string[]; @@ -81,4 +87,10 @@ export class PixelTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index a4d77ba..954ef09 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,7 +2,13 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../ecommerce/model'; +import { EcommerceTracker } from '../ecommerce'; export interface TagManagerOptions { trackingId: string; @@ -99,4 +105,10 @@ export class TagManagerTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 0f118fc..4fb8e28 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,13 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Product, PurchaseInfo, UIElement } from '../ecommerce/model'; +import { + Product, + Promotion, + PurchaseInfo, + UIElement, +} from '../ecommerce/model'; +import { EcommerceTracker } from '../ecommerce'; declare let twq: any; declare let twttr: any; @@ -95,4 +101,10 @@ export class TwitterTracker extends BaseTracker { public sendRemoveFromCart(items: Product[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} + + public sendViewPromotion( + promotion: Promotion, + items?: [Product][], + ts?: Date, + ): void {} } From 91cd8b6105223c6f467da1baa1072c534d8ef21b Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 28 Sep 2020 19:25:19 +0900 Subject: [PATCH 11/39] Update sendAddPaymentInfo --- src/ecommerce/interface.ts | 10 ++++++++-- src/ecommerce/model.ts | 6 ++++++ src/trackers/base.ts | 4 +++- src/trackers/beacon/ecommerce.ts | 0 src/trackers/beacon/tracker.ts | 7 ++++++- src/trackers/ga/tracker.ts | 8 ++++++-- src/trackers/gtag/ecommerce.ts | 0 src/trackers/gtag/tracker.ts | 13 ++++++++++--- src/trackers/kakao.ts | 7 ++++++- src/trackers/pixel.ts | 7 ++++++- src/trackers/tagmanager.ts | 7 ++++++- src/trackers/twitter.ts | 7 ++++++- 12 files changed, 63 insertions(+), 13 deletions(-) delete mode 100644 src/trackers/beacon/ecommerce.ts delete mode 100644 src/trackers/gtag/ecommerce.ts diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 4fd78df..fd05e54 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -1,4 +1,10 @@ -import { Product, Promotion, PurchaseInfo, UIElement } from './model'; +import { + PaymentInfo, + Product, + Promotion, + PurchaseInfo, + UIElement, +} from './model'; export interface EcommerceTracker { sendStartSubscription(args?: Record, ts?: Date): void; @@ -16,7 +22,7 @@ export interface EcommerceTracker { sendClick(items: UIElement[], ts?: Date): void; - sendAddPaymentInfo(args?: Record, ts?: Date): void; + sendAddPaymentInfo(payInfo: PaymentInfo, items: Product[], ts?: Date): void; sendPurchase(purchaseInfo: PurchaseInfo, items: Product[], ts?: Date): void; diff --git a/src/ecommerce/model.ts b/src/ecommerce/model.ts index eb7c734..abff0b4 100644 --- a/src/ecommerce/model.ts +++ b/src/ecommerce/model.ts @@ -43,3 +43,9 @@ export interface Promotion { export interface UIElement { readonly section: string; } + +export interface PaymentInfo { + readonly coupon?: string; + readonly paymentType: string; + readonly value: number; +} diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 4b95b76..9d2d453 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,6 +1,7 @@ import { DeviceType, MainTrackerOptions } from '../index'; import { EcommerceTracker } from '../ecommerce'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, @@ -47,7 +48,8 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { ): void; public abstract sendAddPaymentInfo( - args?: Record, + payInfo: PaymentInfo, + items: Product[], ts?: Date, ): void; diff --git a/src/trackers/beacon/ecommerce.ts b/src/trackers/beacon/ecommerce.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index ff165dc..6f58cd5 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -4,6 +4,7 @@ import { PVID, RUID } from '../../uid'; import { UIDFactory } from '../../uid/factory'; import { BaseTracker, PageMeta } from '../base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, @@ -112,7 +113,11 @@ export class BeaconTracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void {} public sendStartSubscription( args?: Record, diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 419ed03..20eef76 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -1,12 +1,12 @@ import { loadGA } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, UIElement, } from '../../ecommerce/model'; -import { EcommerceTracker } from '../../ecommerce'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -86,7 +86,11 @@ export class GATracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void {} public sendStartSubscription( args?: Record, diff --git a/src/trackers/gtag/ecommerce.ts b/src/trackers/gtag/ecommerce.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index 8a3dc12..07ba010 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -1,12 +1,12 @@ import { loadGTag } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, UIElement, } from '../../ecommerce/model'; -import { EcommerceTracker } from '../../ecommerce'; export interface GTagOptions { trackingId: string; @@ -54,8 +54,15 @@ export class GTagTracker extends BaseTracker { gtag('event', name, data); } - public sendAddPaymentInfo(args?: Record, ts?: Date): void { - gtag('event', 'add_payment_info'); + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void { + gtag('event', 'add_payment_info', { + payInfo, + items, + }); } public sendSignUp(args?: Record, ts?: Date): void { diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index a563808..facdb94 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,6 +1,7 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, @@ -60,7 +61,11 @@ export class KakaoTracker extends BaseTracker { this.tracker.viewContent(); } - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void {} public sendAddToCart(items: Product[], ts?: Date): void {} diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index d6c52dd..ab663fe 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,7 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, @@ -57,7 +58,11 @@ export class PixelTracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void {} public sendStartSubscription( args?: Record, diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 954ef09..a520f86 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -3,6 +3,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, @@ -75,7 +76,11 @@ export class TagManagerTracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void {} public sendStartSubscription( args?: Record, diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 4fb8e28..e326f44 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -4,6 +4,7 @@ import { } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { + PaymentInfo, Product, Promotion, PurchaseInfo, @@ -76,7 +77,11 @@ export class TwitterTracker extends BaseTracker { }); } - public sendAddPaymentInfo(args?: Record, ts?: Date): void {} + public sendAddPaymentInfo( + payInfo: PaymentInfo, + items: Product[], + ts?: Date, + ): void {} public sendAddToCart(items: Product[], ts?: Date): void {} From 22633736d25b9fd5c4ad1f83bb1abf45f30e34a0 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 28 Sep 2020 19:27:57 +0900 Subject: [PATCH 12/39] Fix GTagTracker.sendImpression --- src/trackers/gtag/tracker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index 07ba010..463c695 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -72,7 +72,7 @@ export class GTagTracker extends BaseTracker { } public sendImpression(items: Product[], ts?: Date): void { - this.sendItemView(items, ts); + this.sendItemViewFromList(items, ts); } public sendStartSubscription( From 3f8668a7e148a90e0d64251a8e8a5bd9fa0a6969 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 21 Oct 2020 18:22:17 +0900 Subject: [PATCH 13/39] Update model following newer event spec --- .eslintrc.js | 3 +- src/ecommerce/constants.ts | 9 +++++ src/ecommerce/interface.ts | 26 +++++-------- src/ecommerce/model.ts | 67 ++++++++++++++++++++-------------- src/index.ts | 4 +- src/trackers/base.ts | 20 +++++----- src/trackers/beacon/tracker.ts | 21 +++++------ src/trackers/ga/tracker.ts | 20 +++++----- src/trackers/gtag/tracker.ts | 20 +++++----- src/trackers/kakao.ts | 20 +++++----- src/trackers/pixel.ts | 20 +++++----- src/trackers/tagmanager.ts | 20 +++++----- src/trackers/twitter.ts | 20 +++++----- 13 files changed, 142 insertions(+), 128 deletions(-) create mode 100644 src/ecommerce/constants.ts diff --git a/.eslintrc.js b/.eslintrc.js index 92f4ce2..ced7609 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -18,7 +18,8 @@ module.exports = { 'import/no-unresolved': 0, 'import/extensions': 0, 'no-void': 1, - 'no-shadow': 1, + 'no-shadow': 0, + '@typescript-eslint/no-shadow': 0, '@typescript-eslint/ban-ts-comment': 1, '@typescript-eslint/no-unsafe-assignment': 1, '@typescript-eslint/no-unsafe-call': 1, diff --git a/src/ecommerce/constants.ts b/src/ecommerce/constants.ts new file mode 100644 index 0000000..53eee81 --- /dev/null +++ b/src/ecommerce/constants.ts @@ -0,0 +1,9 @@ +export enum Currency { + KRW = 'KRW', + USD = 'USD', +} + +export enum ServiceType { + RIDIBOOKS = 'ridibooks', + RIDISELECT = 'ridiselect', +} diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index fd05e54..8546518 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -1,10 +1,4 @@ -import { - PaymentInfo, - Product, - Promotion, - PurchaseInfo, - UIElement, -} from './model'; +import { PaymentInfo, Item, Promotion, PurchaseInfo, UIElement } from './model'; export interface EcommerceTracker { sendStartSubscription(args?: Record, ts?: Date): void; @@ -14,25 +8,25 @@ export interface EcommerceTracker { * @see sendItemViewFromList */ - sendImpression(items: Product[], ts?: Date): void; + sendImpression(items: Item[], ts?: Date): void; - sendItemView(items: Product[], ts?: Date): void; + sendItemView(items: Item[], ts?: Date): void; - sendItemViewFromList(items: Product[], ts?: Date): void; + sendItemViewFromList(items: Item[], ts?: Date): void; sendClick(items: UIElement[], ts?: Date): void; - sendAddPaymentInfo(payInfo: PaymentInfo, items: Product[], ts?: Date): void; + sendAddPaymentInfo(payInfo: PaymentInfo, items: Item[], ts?: Date): void; - sendPurchase(purchaseInfo: PurchaseInfo, items: Product[], ts?: Date): void; + sendPurchase(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; - sendRefund(purchaseInfo: PurchaseInfo, items: Product[], ts?: Date): void; + sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; - sendAddToCart(items: Product[], ts?: Date): void; + sendAddToCart(items: Item[], ts?: Date): void; - sendRemoveFromCart(items: Product[], ts?: Date): void; + sendRemoveFromCart(items: Item[], ts?: Date): void; sendSearch(searchTerm: string, ts?: Date): void; - sendViewPromotion(promotion: Promotion, items?: [Product][], ts?: Date): void; + sendViewPromotion(promotion: Promotion, items?: [Item][], ts?: Date): void; } diff --git a/src/ecommerce/model.ts b/src/ecommerce/model.ts index abff0b4..e6870e9 100644 --- a/src/ecommerce/model.ts +++ b/src/ecommerce/model.ts @@ -1,39 +1,48 @@ +/* eslint-disable camelcase */ + /** - * @see https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce#action-data + * @see https://developers.google.com/analytics/devguides/collection/app-web/ecommerce#action_data */ +import { Currency, ServiceType } from './constants'; + export interface PurchaseInfo { - readonly id: string; - readonly affiliation?: string; - readonly tax?: number; - readonly shipping?: number; - readonly checkoutOption?: string; + readonly coupon_name: string; + readonly coupon: number; + readonly cash: number; + readonly point: number; + readonly currency: Currency; + readonly transaction_id: string; + readonly value: number; + readonly payment_type: string; } -/** - * @see https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce#product-data - */ - -export interface Product { - readonly id: string; - readonly name: string; - readonly brand?: string; - readonly category?: string; - readonly variant?: string; - readonly price?: number; - readonly quantity?: number; - readonly coupon?: string; - readonly listPosition?: number; +export interface Promotion { + readonly promotion_id: string; + readonly promotion_name: string; + readonly creative_name?: string; + readonly creative_slot?: number; } -/** - * @see https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-ecommerce#promotion-data - */ -export interface Promotion { - readonly id?: string; - readonly name?: string; - readonly creativeName?: string; - readonly positionSlot?: number; +export interface Item extends Partial { + readonly item_id: string; + readonly item_name: string; + readonly item_repr_id?: string; + readonly item_repr_name?: string; + readonly service_type: ServiceType; + readonly author_id?: number; + readonly author: string; + readonly item_provider_id: number; + readonly item_provider_name: string; + readonly item_category: string; + readonly item_genre?: string; + readonly coupon?: string; + readonly discount?: number; + readonly price?: number; + readonly currency?: Currency; + readonly index?: number; + readonly item_list_id: string; + readonly item_list_name: string; } /** @@ -49,3 +58,5 @@ export interface PaymentInfo { readonly paymentType: string; readonly value: number; } + +/* eslint-enable camelcase */ diff --git a/src/index.ts b/src/index.ts index ceb935d..2a29bbc 100644 --- a/src/index.ts +++ b/src/index.ts @@ -19,7 +19,7 @@ import { TwitterTracker, } from './trackers'; import { BaseTracker, EventTracker, PageMeta } from './trackers/base'; -import { Product } from './ecommerce/model'; +import { Item } from './ecommerce/model'; export enum DeviceType { PC = 'pc', @@ -187,7 +187,7 @@ export class Tracker { } @pushEventToQueue() - public sendImpression(items: Product[]): EventParameters { + public sendImpression(items: Item[]): EventParameters { return [items]; } diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 9d2d453..7e0cf7c 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -2,7 +2,7 @@ import { DeviceType, MainTrackerOptions } from '../index'; import { EcommerceTracker } from '../ecommerce'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -40,7 +40,7 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { public abstract sendSignUp(args?: Record, ts?: Date): void; - public abstract sendImpression(items: Product[], ts?: Date): void; + public abstract sendImpression(items: Item[], ts?: Date): void; public abstract sendStartSubscription( args?: Record, @@ -49,7 +49,7 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { public abstract sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void; @@ -61,33 +61,33 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { this.mainOptions = newOptions; } - public abstract sendAddToCart(items: Product[], ts?: Date): void; + public abstract sendAddToCart(items: Item[], ts?: Date): void; public abstract sendClick(items: UIElement[], ts?: Date): void; - public abstract sendItemView(items: Product[], ts?: Date): void; + public abstract sendItemView(items: Item[], ts?: Date): void; - public abstract sendItemViewFromList(items: Product[], ts?: Date): void; + public abstract sendItemViewFromList(items: Item[], ts?: Date): void; public abstract sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void; public abstract sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void; - public abstract sendRemoveFromCart(items: Product[], ts?: Date): void; + public abstract sendRemoveFromCart(items: Item[], ts?: Date): void; public abstract sendSearch(searchTerm: string, ts?: Date): void; public abstract sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void; } diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 6f58cd5..1e5b346 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -5,12 +5,11 @@ import { UIDFactory } from '../../uid/factory'; import { BaseTracker, PageMeta } from '../base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, } from '../../ecommerce/model'; -import { EcommerceTracker } from '../../ecommerce'; export interface BeaconOptions { beaconSrc?: string; @@ -109,13 +108,13 @@ export class BeaconTracker extends BaseTracker { this.sendBeacon(name, this.lastPageMeta, data, ts); } - public sendImpression(items: Product[], ts?: Date): void {} + public sendImpression(items: Item[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} @@ -124,33 +123,33 @@ export class BeaconTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Item[], ts?: Date): void {} public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Item[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 20eef76..1ae7f82 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -2,7 +2,7 @@ import { loadGA } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -82,13 +82,13 @@ export class GATracker extends BaseTracker { ga('send', fields); } - public sendImpression(items: Product[], ts?: Date): void {} + public sendImpression(items: Item[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} @@ -97,33 +97,33 @@ export class GATracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Item[], ts?: Date): void {} public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Item[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index 463c695..aa77a0a 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -2,7 +2,7 @@ import { loadGTag } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -56,7 +56,7 @@ export class GTagTracker extends BaseTracker { public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void { gtag('event', 'add_payment_info', { @@ -71,7 +71,7 @@ export class GTagTracker extends BaseTracker { }); } - public sendImpression(items: Product[], ts?: Date): void { + public sendImpression(items: Item[], ts?: Date): void { this.sendItemViewFromList(items, ts); } @@ -80,7 +80,7 @@ export class GTagTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void { + public sendAddToCart(items: Item[], ts?: Date): void { gtag('event', 'add_to_cart', { value: items.map(p => p.price).reduce((pre, cur) => pre + cur), items, @@ -91,17 +91,17 @@ export class GTagTracker extends BaseTracker { // TODO: Add Custom Event } - public sendItemView(items: Product[], ts?: Date): void { + public sendItemView(items: Item[], ts?: Date): void { gtag('event', 'view_item', { items }); } - public sendItemViewFromList(items: Product[], ts?: Date): void { + public sendItemViewFromList(items: Item[], ts?: Date): void { gtag('event', 'view_item_list', { items }); } public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void { gtag('event', 'purchase', { @@ -112,7 +112,7 @@ export class GTagTracker extends BaseTracker { public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void { gtag('event', 'refund', { @@ -121,7 +121,7 @@ export class GTagTracker extends BaseTracker { }); } - public sendRemoveFromCart(items: Product[], ts?: Date): void { + public sendRemoveFromCart(items: Item[], ts?: Date): void { gtag('event', 'remove_from_cart', { value: items.map(p => p.price).reduce((pre, cur) => pre + cur), items, @@ -132,7 +132,7 @@ export class GTagTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index facdb94..75b6b9f 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -2,7 +2,7 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -57,37 +57,37 @@ export class KakaoTracker extends BaseTracker { this.tracker.signUp(); } - public sendImpression(items: Product[], ts?: Date): void { + public sendImpression(items: Item[], ts?: Date): void { this.tracker.viewContent(); } public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Item[], ts?: Date): void {} public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Item[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} @@ -99,7 +99,7 @@ export class KakaoTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index ab663fe..66d5134 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -2,7 +2,7 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -54,13 +54,13 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendImpression(items: Product[], ts?: Date): void {} + public sendImpression(items: Item[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} @@ -69,33 +69,33 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Item[], ts?: Date): void {} public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Item[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index a520f86..225c339 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -4,7 +4,7 @@ import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -72,13 +72,13 @@ export class TagManagerTracker extends BaseTracker { this.dataLayer.push(data); } - public sendImpression(items: Product[], ts?: Date): void {} + public sendImpression(items: Item[], ts?: Date): void {} public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} @@ -87,33 +87,33 @@ export class TagManagerTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Item[], ts?: Date): void {} public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Item[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index e326f44..a084ab2 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -5,7 +5,7 @@ import { import { BaseTracker, PageMeta } from './base'; import { PaymentInfo, - Product, + Item, Promotion, PurchaseInfo, UIElement, @@ -70,7 +70,7 @@ export class TwitterTracker extends BaseTracker { }); } - public sendImpression(items: Product[], ts?: Date): void { + public sendImpression(items: Item[], ts?: Date): void { this.twttr.conversion.trackPid(this.options.impressionPid, { tw_sale_amount: 0, tw_order_quantity: 0, @@ -79,37 +79,37 @@ export class TwitterTracker extends BaseTracker { public sendAddPaymentInfo( payInfo: PaymentInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendAddToCart(items: Product[], ts?: Date): void {} + public sendAddToCart(items: Item[], ts?: Date): void {} public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Product[], ts?: Date): void {} + public sendItemView(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Product[], ts?: Date): void {} + public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} public sendRefund( purchaseInfo: PurchaseInfo, - items: Product[], + items: Item[], ts?: Date, ): void {} - public sendRemoveFromCart(items: Product[], ts?: Date): void {} + public sendRemoveFromCart(items: Item[], ts?: Date): void {} public sendSearch(searchTerm: string, ts?: Date): void {} public sendViewPromotion( promotion: Promotion, - items?: [Product][], + items?: [Item][], ts?: Date, ): void {} } From 468a7a2284de63196527b31a2a074708471d1d40 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 21 Oct 2020 20:23:40 +0900 Subject: [PATCH 14/39] Implement sendBeginCheckout --- .eslintrc.js | 11 ++++- src/ecommerce/index.ts | 2 +- src/ecommerce/interface.ts | 19 ++++++-- src/ecommerce/legacy.ts | 21 -------- src/ecommerce/model.ts | 62 ----------------------- src/ecommerce/models/index.ts | 2 + src/ecommerce/models/item.ts | 23 +++++++++ src/ecommerce/models/promotion.ts | 6 +++ src/ecommerce/models/transaction.ts | 12 +++++ src/index.ts | 17 +++---- src/trackers/base.ts | 63 ++---------------------- src/trackers/beacon/tracker.ts | 76 +++++++++++++++-------------- src/trackers/ga/tracker.ts | 29 +++++------ src/trackers/gtag/tracker.ts | 40 ++++----------- src/trackers/kakao.ts | 19 +++----- src/trackers/pixel.ts | 20 +++----- src/trackers/tagmanager.ts | 25 +++------- src/trackers/twitter.ts | 20 +++----- 18 files changed, 165 insertions(+), 302 deletions(-) delete mode 100644 src/ecommerce/legacy.ts delete mode 100644 src/ecommerce/model.ts create mode 100644 src/ecommerce/models/index.ts create mode 100644 src/ecommerce/models/item.ts create mode 100644 src/ecommerce/models/promotion.ts create mode 100644 src/ecommerce/models/transaction.ts diff --git a/.eslintrc.js b/.eslintrc.js index ced7609..eab1588 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,7 +8,14 @@ module.exports = { '@ridi/eslint-config/typescript', '@ridi/eslint-config/prettier', ], - overrides: [], + overrides: [ + { + files: ['src/**/models/*.ts'], + rules: { + camelcase: 0, + }, + }, + ], rules: { 'no-console': 0, semi: [2, 'always'], @@ -36,5 +43,5 @@ module.exports = { 'max-classes-per-file': ['error', 10], 'lines-around-comment': 0, }, - ignorePatterns: ['**/node_modules/**'], + ignorePatterns: ['**/node_modules/**', '**/dist/**'], }; diff --git a/src/ecommerce/index.ts b/src/ecommerce/index.ts index ffacf7b..5c51ad6 100644 --- a/src/ecommerce/index.ts +++ b/src/ecommerce/index.ts @@ -1,2 +1,2 @@ export * from './interface'; -export * from './legacy'; +export * from './models'; diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 8546518..d92e78c 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -1,4 +1,5 @@ -import { PaymentInfo, Item, Promotion, PurchaseInfo, UIElement } from './model'; +import { PurchaseInfo } from './models/transaction'; +import { Item, Promotion } from './models'; export interface EcommerceTracker { sendStartSubscription(args?: Record, ts?: Date): void; @@ -14,11 +15,19 @@ export interface EcommerceTracker { sendItemViewFromList(items: Item[], ts?: Date): void; - sendClick(items: UIElement[], ts?: Date): void; + sendAddPaymentInfo( + paymentType: string, + purchaseInfo: PurchaseInfo, + ts?: Date, + ): void; - sendAddPaymentInfo(payInfo: PaymentInfo, items: Item[], ts?: Date): void; + sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void; - sendPurchase(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; + sendPurchase( + transactionId: string, + purchaseInfo: PurchaseInfo, + ts?: Date, + ): void; sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; @@ -28,5 +37,5 @@ export interface EcommerceTracker { sendSearch(searchTerm: string, ts?: Date): void; - sendViewPromotion(promotion: Promotion, items?: [Item][], ts?: Date): void; + sendViewPromotion(promotion: Promotion, items?: Item[], ts?: Date): void; } diff --git a/src/ecommerce/legacy.ts b/src/ecommerce/legacy.ts deleted file mode 100644 index 9d64756..0000000 --- a/src/ecommerce/legacy.ts +++ /dev/null @@ -1,21 +0,0 @@ -export interface Tag { - name: string; - category: string; - brand: string; - price: number; - quantity: number; - receiptId: number; - receiptTitle: string; -} - -export interface Trackable { - section: string; - sectionFull: string; - objId: string; - position: number; - genreEng: string; - genreKor: string; - tags: Tag; - isLastItem: boolean; - recommendId: number; -} diff --git a/src/ecommerce/model.ts b/src/ecommerce/model.ts deleted file mode 100644 index e6870e9..0000000 --- a/src/ecommerce/model.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable camelcase */ - -/** - * @see https://developers.google.com/analytics/devguides/collection/app-web/ecommerce#action_data - */ - -import { Currency, ServiceType } from './constants'; - -export interface PurchaseInfo { - readonly coupon_name: string; - readonly coupon: number; - readonly cash: number; - readonly point: number; - readonly currency: Currency; - readonly transaction_id: string; - readonly value: number; - readonly payment_type: string; -} - -export interface Promotion { - readonly promotion_id: string; - readonly promotion_name: string; - readonly creative_name?: string; - readonly creative_slot?: number; -} - -export interface Item extends Partial { - readonly item_id: string; - readonly item_name: string; - readonly item_repr_id?: string; - readonly item_repr_name?: string; - readonly service_type: ServiceType; - readonly author_id?: number; - readonly author: string; - readonly item_provider_id: number; - readonly item_provider_name: string; - readonly item_category: string; - readonly item_genre?: string; - readonly coupon?: string; - readonly discount?: number; - readonly price?: number; - readonly currency?: Currency; - readonly index?: number; - readonly item_list_id: string; - readonly item_list_name: string; -} - -/** - * @example carousel, banner - */ - -export interface UIElement { - readonly section: string; -} - -export interface PaymentInfo { - readonly coupon?: string; - readonly paymentType: string; - readonly value: number; -} - -/* eslint-enable camelcase */ diff --git a/src/ecommerce/models/index.ts b/src/ecommerce/models/index.ts new file mode 100644 index 0000000..f23b885 --- /dev/null +++ b/src/ecommerce/models/index.ts @@ -0,0 +1,2 @@ +export * from './item'; +export * from './promotion'; diff --git a/src/ecommerce/models/item.ts b/src/ecommerce/models/item.ts new file mode 100644 index 0000000..f27392a --- /dev/null +++ b/src/ecommerce/models/item.ts @@ -0,0 +1,23 @@ +import { Currency, ServiceType } from '../constants'; +import { Promotion } from './promotion'; + +export interface Item extends Partial { + readonly item_id: string; + readonly item_name: string; + readonly item_repr_id?: string; + readonly item_repr_name?: string; + readonly service_type: ServiceType; + readonly author_id?: number; + readonly author: string; + readonly item_provider_id: number; + readonly item_provider_name: string; + readonly item_category: string; + readonly item_genre?: string; + readonly coupon?: string; + readonly discount?: number; + readonly price?: number; + readonly currency?: Currency; + readonly index?: number; + readonly item_list_id: string; + readonly item_list_name: string; +} diff --git a/src/ecommerce/models/promotion.ts b/src/ecommerce/models/promotion.ts new file mode 100644 index 0000000..0ab86c0 --- /dev/null +++ b/src/ecommerce/models/promotion.ts @@ -0,0 +1,6 @@ +export interface Promotion { + readonly promotion_id: string; + readonly promotion_name: string; + readonly creative_name?: string; + readonly creative_slot?: number; +} diff --git a/src/ecommerce/models/transaction.ts b/src/ecommerce/models/transaction.ts new file mode 100644 index 0000000..25b075c --- /dev/null +++ b/src/ecommerce/models/transaction.ts @@ -0,0 +1,12 @@ +import { Currency } from '../constants'; +import { Item } from './item'; + +export interface PurchaseInfo { + readonly coupon_name: string; + readonly coupon: number; + readonly cash: number; + readonly point: number; + readonly currency: Currency; + readonly value: number; + readonly items: Item[]; +} diff --git a/src/index.ts b/src/index.ts index 2a29bbc..8fbbb86 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,6 +9,7 @@ import { GATracker, GTagOptions, GTagTracker, + Item, KakaoOptions, KakaoTracker, PixelOptions, @@ -19,7 +20,6 @@ import { TwitterTracker, } from './trackers'; import { BaseTracker, EventTracker, PageMeta } from './trackers/base'; -import { Item } from './ecommerce/model'; export enum DeviceType { PC = 'pc', @@ -32,7 +32,7 @@ export type ServiceProp = Record; export interface MainTrackerOptions { debug?: boolean; development?: boolean; - userId?: string; + uId?: number; deviceType: DeviceType; serviceProps?: ServiceProp; gaOptions?: GAOptions; @@ -45,11 +45,10 @@ export interface MainTrackerOptions { twitterOptions?: TwitterOptions; } -export interface ChangeableTrackerOptions { - userId?: string; - deviceType?: DeviceType; - serviceProps?: ServiceProp; -} +type ChangeableTrackerOptions = Pick< + MainTrackerOptions, + 'uId' | 'deviceType' | 'serviceProps' +>; type EventParameters = | Parameters @@ -171,9 +170,7 @@ export class Tracker { @pushEventToQueue() public sendPageView(href: string, referrer?: string): EventParameters { - const pageMeta = this.getPageMeta(href, referrer); - - return [pageMeta]; + return [this.getPageMeta(href, referrer)]; } @pushEventToQueue() diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 7e0cf7c..f2cbc0f 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -1,12 +1,5 @@ import { DeviceType, MainTrackerOptions } from '../index'; import { EcommerceTracker } from '../ecommerce'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../ecommerce/model'; /* eslint-disable camelcase */ export interface PageMeta { @@ -27,32 +20,12 @@ export interface EventTracker { sendSignUp(args?: Record, ts?: Date): void; } +// https://github.com/Microsoft/TypeScript/issues/4670#issuecomment-326585615 +export interface BaseTracker extends EventTracker, EcommerceTracker {} + export abstract class BaseTracker implements EventTracker, EcommerceTracker { public mainOptions: MainTrackerOptions; - public abstract sendPageView(pageMeta: PageMeta, ts?: Date): void; - - public abstract sendEvent( - name: string, - data?: Record, - ts?: Date, - ): void; - - public abstract sendSignUp(args?: Record, ts?: Date): void; - - public abstract sendImpression(items: Item[], ts?: Date): void; - - public abstract sendStartSubscription( - args?: Record, - ts?: Date, - ): void; - - public abstract sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], - ts?: Date, - ): void; - public abstract isInitialized(): boolean; public abstract async initialize(): Promise; @@ -60,34 +33,4 @@ export abstract class BaseTracker implements EventTracker, EcommerceTracker { public setMainOptions(newOptions: MainTrackerOptions): void { this.mainOptions = newOptions; } - - public abstract sendAddToCart(items: Item[], ts?: Date): void; - - public abstract sendClick(items: UIElement[], ts?: Date): void; - - public abstract sendItemView(items: Item[], ts?: Date): void; - - public abstract sendItemViewFromList(items: Item[], ts?: Date): void; - - public abstract sendPurchase( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void; - - public abstract sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void; - - public abstract sendRemoveFromCart(items: Item[], ts?: Date): void; - - public abstract sendSearch(searchTerm: string, ts?: Date): void; - - public abstract sendViewPromotion( - promotion: Promotion, - items?: [Item][], - ts?: Date, - ): void; } diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 1e5b346..3271c28 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -1,15 +1,11 @@ import URL from 'url-parse'; +import _ from 'lodash'; import { PVID, RUID } from '../../uid'; import { UIDFactory } from '../../uid/factory'; import { BaseTracker, PageMeta } from '../base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../../ecommerce/model'; +import { PurchaseInfo } from '../../ecommerce/models/transaction'; +import { Item, Promotion } from '../../ecommerce/models'; export interface BeaconOptions { beaconSrc?: string; @@ -58,14 +54,16 @@ export class BeaconTracker extends BaseTracker { if (ts == null) { ts = new Date(); } + + data = _.mapKeys(data, (v, k) => _.snakeCase(k)); + const search = `?${URL.qs.stringify(pageMeta.query_params)}`; const log: BeaconLog = { event: eventName, - user_id: this.mainOptions.userId, - u_id: this.mainOptions.userId, + uid: this.mainOptions.uId, ruid: this.ruid.value, - pvid: this.pvid.value, + view_id: this.pvid.value, ...pageMeta, path: `${pageMeta.path}${search}`, data, @@ -85,18 +83,13 @@ export class BeaconTracker extends BaseTracker { public sendPageView(pageMeta: PageMeta, ts?: Date): void { this.pvid = new UIDFactory(PVID).create(); - this.sendBeacon( - BeaconEventName.PageView, - pageMeta, - this.mainOptions.serviceProps, - ts, - ); + this.sendBeacon('pageView', pageMeta, this.mainOptions.serviceProps, ts); this.lastPageMeta = pageMeta; } public sendEvent( name: string, - data: Record = {}, + data: Record = {}, ts?: Date, ): void { if (this.lastPageMeta === undefined) { @@ -110,13 +103,28 @@ export class BeaconTracker extends BaseTracker { public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(args?: Record, ts?: Date): void {} + public sendSignUp(args?: Record, ts?: Date): void { + this.sendEvent('signUp', {}, ts); + } public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, - ): void {} + ): void { + this.sendEvent( + 'addPaymentInfo', + { + paymentType, + ...purchaseInfo, + }, + ts, + ); + } + + public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { + this.sendEvent('beginCheckout', purchaseInfo, ts); + } public sendStartSubscription( args?: Record, @@ -125,17 +133,17 @@ export class BeaconTracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, - ): void {} + ): void { + this.sendEvent('purchase', purchaseInfo, ts); + } public sendRefund( purchaseInfo: PurchaseInfo, @@ -149,22 +157,18 @@ export class BeaconTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } -enum BeaconEventName { - PageView = 'pageView', -} /* eslint-disable camelcase */ interface BeaconLog extends PageMeta { - event: string; - user_id: string; - u_id: string; - ruid: string; - pvid: string; - data: Record; - ts: number; + readonly event: string; + readonly uid: number; + readonly ruid?: string; + readonly view_id: string; + readonly data: Record; + readonly ts: number; } /* eslint-enable camelcase */ diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 1ae7f82..0178c5a 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -1,12 +1,7 @@ import { loadGA } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../../ecommerce/model'; +import { PurchaseInfo } from '../../ecommerce/models/transaction'; +import { Item, Promotion } from '../../ecommerce/models'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; @@ -30,9 +25,13 @@ export class GATracker extends BaseTracker { private refinePath(originalPath: string): string { const refiners: Array<(path: string) => string> = [ - path => (this.options.pathPrefix ? this.options.pathPrefix + path : path), // Ref: https://app.asana.com/0/inbox/463186034180509/765912307342230/766156873493449 // Pathname in some browsers doesn't start with slash character (/) - - path => (path.startsWith('/') ? path : `/${path}`), + path => (this.options.pathPrefix ? this.options.pathPrefix + path : path), + path => + path.startsWith('/') + ? path + : `/${ + path // Ref: https://app.asana.com/0/inbox/463186034180509/765912307342230/766156873493449 // Pathname in some browsers doesn't start with slash character (/) + }`, ]; return refiners.reduce((value, refiner) => refiner(value), originalPath); @@ -87,8 +86,8 @@ export class GATracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, ): void {} @@ -99,15 +98,13 @@ export class GATracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, ): void {} @@ -123,7 +120,7 @@ export class GATracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index aa77a0a..a6df452 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -1,12 +1,7 @@ import { loadGTag } from '../../utils/externalServices'; import { BaseTracker, PageMeta } from '../base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../../ecommerce/model'; +import { PurchaseInfo } from '../../ecommerce/models/transaction'; +import { Item, Promotion } from '../../ecommerce/models'; export interface GTagOptions { trackingId: string; @@ -55,20 +50,15 @@ export class GTagTracker extends BaseTracker { } public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, ): void { - gtag('event', 'add_payment_info', { - payInfo, - items, - }); + gtag('event', 'add_payment_info', { purchaseInfo }); } public sendSignUp(args?: Record, ts?: Date): void { - gtag('event', 'sign_up', { - method: 'ridi', - }); + gtag('event', 'sign_up', { method: 'ridi' }); } public sendImpression(items: Item[], ts?: Date): void { @@ -87,10 +77,6 @@ export class GTagTracker extends BaseTracker { }); } - public sendClick(items: UIElement[], ts?: Date): void { - // TODO: Add Custom Event - } - public sendItemView(items: Item[], ts?: Date): void { gtag('event', 'view_item', { items }); } @@ -100,14 +86,11 @@ export class GTagTracker extends BaseTracker { } public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, ): void { - gtag('event', 'purchase', { - purchaseInfo, - items, - }); + gtag('event', 'purchase', { purchaseInfo }); } public sendRefund( @@ -115,10 +98,7 @@ export class GTagTracker extends BaseTracker { items: Item[], ts?: Date, ): void { - gtag('event', 'refund', { - purchaseInfo, - items, - }); + gtag('event', 'refund', { purchaseInfo, items }); } public sendRemoveFromCart(items: Item[], ts?: Date): void { @@ -132,7 +112,7 @@ export class GTagTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 75b6b9f..26bbb94 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,12 +1,7 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../ecommerce/model'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; +import { Item, Promotion } from '../ecommerce/models'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; @@ -62,22 +57,20 @@ export class KakaoTracker extends BaseTracker { } public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, ): void {} public sendAddToCart(items: Item[], ts?: Date): void {} - public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, ): void {} @@ -99,7 +92,7 @@ export class KakaoTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 66d5134..2c034c7 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,13 +1,7 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../ecommerce/model'; -import { EcommerceTracker } from '../ecommerce'; +import { EcommerceTracker, Item, Promotion } from '../ecommerce'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; export interface PixelOptions { pixelId: string | string[]; @@ -59,8 +53,8 @@ export class PixelTracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, ): void {} @@ -71,15 +65,13 @@ export class PixelTracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, ): void {} @@ -95,7 +87,7 @@ export class PixelTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 225c339..6371b36 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,14 +2,8 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../ecommerce/model'; -import { EcommerceTracker } from '../ecommerce'; +import { EcommerceTracker, Item, Promotion } from '../ecommerce'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; export interface TagManagerOptions { trackingId: string; @@ -62,10 +56,7 @@ export class TagManagerTracker extends BaseTracker { data: Record = {}, ts?: Date, ): void { - this.dataLayer.push({ - event: name, - data, - }); + this.dataLayer.push({ event: name, data }); } private pushDataLayer(data: Record): void { @@ -77,8 +68,8 @@ export class TagManagerTracker extends BaseTracker { public sendSignUp(args?: Record, ts?: Date): void {} public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, ): void {} @@ -89,15 +80,13 @@ export class TagManagerTracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, ): void {} @@ -113,7 +102,7 @@ export class TagManagerTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index a084ab2..3805651 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,14 +3,8 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { - PaymentInfo, - Item, - Promotion, - PurchaseInfo, - UIElement, -} from '../ecommerce/model'; -import { EcommerceTracker } from '../ecommerce'; +import { EcommerceTracker, Item, Promotion } from '../ecommerce'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; declare let twq: any; declare let twttr: any; @@ -78,22 +72,20 @@ export class TwitterTracker extends BaseTracker { } public sendAddPaymentInfo( - payInfo: PaymentInfo, - items: Item[], + paymentType: string, + purchaseInfo: PurchaseInfo, ts?: Date, ): void {} public sendAddToCart(items: Item[], ts?: Date): void {} - public sendClick(items: UIElement[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], ts?: Date, ): void {} @@ -109,7 +101,7 @@ export class TwitterTracker extends BaseTracker { public sendViewPromotion( promotion: Promotion, - items?: [Item][], + items?: Item[], ts?: Date, ): void {} } From 7b704017e265f00b8cf5ada918ca8370e8b55108 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 22 Oct 2020 16:39:06 +0900 Subject: [PATCH 15/39] Update sendSignUp parameter --- src/trackers/base.ts | 2 +- src/trackers/beacon/tracker.ts | 13 +++---------- src/trackers/ga/tracker.ts | 2 +- src/trackers/gtag/tracker.ts | 2 +- src/trackers/kakao.ts | 2 +- src/trackers/pixel.ts | 2 +- src/trackers/tagmanager.ts | 2 +- src/trackers/twitter.ts | 2 +- 8 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/trackers/base.ts b/src/trackers/base.ts index f2cbc0f..d85a0aa 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -17,7 +17,7 @@ export interface EventTracker { sendEvent(name: string, data?: Record, ts?: Date): void; - sendSignUp(args?: Record, ts?: Date): void; + sendSignUp(method: string, ts?: Date): void; } // https://github.com/Microsoft/TypeScript/issues/4670#issuecomment-326585615 diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 3271c28..34fb68e 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -103,8 +103,8 @@ export class BeaconTracker extends BaseTracker { public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(args?: Record, ts?: Date): void { - this.sendEvent('signUp', {}, ts); + public sendSignUp(method: string, ts?: Date): void { + this.sendEvent('signUp', { method }, ts); } public sendAddPaymentInfo( @@ -112,14 +112,7 @@ export class BeaconTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - this.sendEvent( - 'addPaymentInfo', - { - paymentType, - ...purchaseInfo, - }, - ts, - ); + this.sendEvent('addPaymentInfo', { paymentType, ...purchaseInfo }, ts); } public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga/tracker.ts index 0178c5a..fb172e8 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga/tracker.ts @@ -83,7 +83,7 @@ export class GATracker extends BaseTracker { public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(args?: Record, ts?: Date): void {} + public sendSignUp(method: string, ts?: Date): void {} public sendAddPaymentInfo( paymentType: string, diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index a6df452..b8b5bd9 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -57,7 +57,7 @@ export class GTagTracker extends BaseTracker { gtag('event', 'add_payment_info', { purchaseInfo }); } - public sendSignUp(args?: Record, ts?: Date): void { + public sendSignUp(method: string, ts?: Date): void { gtag('event', 'sign_up', { method: 'ridi' }); } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 26bbb94..4ced4ae 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -41,7 +41,7 @@ export class KakaoTracker extends BaseTracker { this.tracker.pageView(); } - public sendSignUp(args?: Record, ts?: Date): void { + public sendSignUp(method: string, ts?: Date): void { this.tracker.completeRegistration(); } diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 2c034c7..1f16f43 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -50,7 +50,7 @@ export class PixelTracker extends BaseTracker { public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(args?: Record, ts?: Date): void {} + public sendSignUp(method: string, ts?: Date): void {} public sendAddPaymentInfo( paymentType: string, diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 6371b36..820c4d5 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -65,7 +65,7 @@ export class TagManagerTracker extends BaseTracker { public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(args?: Record, ts?: Date): void {} + public sendSignUp(method: string, ts?: Date): void {} public sendAddPaymentInfo( paymentType: string, diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 3805651..cdc3ea1 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -47,7 +47,7 @@ export class TwitterTracker extends BaseTracker { this.twq('track', 'pageView'); } - public sendSignUp(args?: Record, ts?: Date): void { + public sendSignUp(method: string, ts?: Date): void { this.twttr.conversion.trackPid(this.options.booksSignUpPid, { tw_sale_amount: 0, tw_order_quantity: 0, From 0248926de64c96b3b1e9e5a65c0e93ccaa3f9c90 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 22 Oct 2020 17:07:17 +0900 Subject: [PATCH 16/39] Implement sendScreenView method on gtag, beacon tracker --- src/ecommerce/interface.ts | 35 +++++++++++++++++++++------------- src/trackers/beacon/tracker.ts | 13 +++++++++++++ src/trackers/gtag/tracker.ts | 13 +++++++++++-- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index d92e78c..84d7b5b 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -2,19 +2,6 @@ import { PurchaseInfo } from './models/transaction'; import { Item, Promotion } from './models'; export interface EcommerceTracker { - sendStartSubscription(args?: Record, ts?: Date): void; - - /** - * @deprecated Use sendItemViewFromList instead. - * @see sendItemViewFromList - */ - - sendImpression(items: Item[], ts?: Date): void; - - sendItemView(items: Item[], ts?: Date): void; - - sendItemViewFromList(items: Item[], ts?: Date): void; - sendAddPaymentInfo( paymentType: string, purchaseInfo: PurchaseInfo, @@ -29,6 +16,28 @@ export interface EcommerceTracker { ts?: Date, ): void; + /* TODO: Implement below methods */ + + sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ts?: Date, + ): void; + + /** + * @deprecated Use sendItemViewFromList instead. + * @see sendItemViewFromList + */ + + sendStartSubscription(args?: Record, ts?: Date): void; + + sendImpression(items: Item[], ts?: Date): void; + + sendItemView(items: Item[], ts?: Date): void; + + sendItemViewFromList(items: Item[], ts?: Date): void; + sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; sendAddToCart(items: Item[], ts?: Date): void; diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon/tracker.ts index 34fb68e..dd030a6 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon/tracker.ts @@ -107,6 +107,19 @@ export class BeaconTracker extends BaseTracker { this.sendEvent('signUp', { method }, ts); } + public sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ts?: Date, + ): void { + this.sendEvent( + 'screenView', + { screenName, previousScreenName, referrer }, + ts, + ); + } + public sendAddPaymentInfo( paymentType: string, purchaseInfo: PurchaseInfo, diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag/tracker.ts index b8b5bd9..574c309 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag/tracker.ts @@ -54,11 +54,20 @@ export class GTagTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - gtag('event', 'add_payment_info', { purchaseInfo }); + gtag('event', 'add_payment_info', { ...purchaseInfo }); } public sendSignUp(method: string, ts?: Date): void { - gtag('event', 'sign_up', { method: 'ridi' }); + gtag('event', 'sign_up', { method }); + } + + public sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ts?: Date, + ): void { + gtag('event', 'screen_view', { screen_name: screenName }); } public sendImpression(items: Item[], ts?: Date): void { From 1ac709324a3232ee4e8ffc26140c369b929bd591 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 22 Oct 2020 17:13:14 +0900 Subject: [PATCH 17/39] Remove ga, beacon, gtag tracker subdirectory --- src/trackers/{beacon/tracker.ts => beacon.ts} | 10 +++++----- src/trackers/beacon/index.ts | 1 - src/trackers/{ga/tracker.ts => ga.ts} | 8 ++++---- src/trackers/ga/index.ts | 1 - src/trackers/{gtag/tracker.ts => gtag.ts} | 8 ++++---- src/trackers/gtag/index.ts | 1 - src/trackers/index.ts | 2 +- src/trackers/pixel.ts | 2 +- src/trackers/tagmanager.ts | 2 +- src/trackers/twitter.ts | 2 +- 10 files changed, 17 insertions(+), 20 deletions(-) rename src/trackers/{beacon/tracker.ts => beacon.ts} (93%) delete mode 100644 src/trackers/beacon/index.ts rename src/trackers/{ga/tracker.ts => ga.ts} (93%) delete mode 100644 src/trackers/ga/index.ts rename src/trackers/{gtag/tracker.ts => gtag.ts} (92%) delete mode 100644 src/trackers/gtag/index.ts diff --git a/src/trackers/beacon/tracker.ts b/src/trackers/beacon.ts similarity index 93% rename from src/trackers/beacon/tracker.ts rename to src/trackers/beacon.ts index dd030a6..1667cd6 100644 --- a/src/trackers/beacon/tracker.ts +++ b/src/trackers/beacon.ts @@ -1,11 +1,11 @@ import URL from 'url-parse'; import _ from 'lodash'; -import { PVID, RUID } from '../../uid'; -import { UIDFactory } from '../../uid/factory'; -import { BaseTracker, PageMeta } from '../base'; -import { PurchaseInfo } from '../../ecommerce/models/transaction'; -import { Item, Promotion } from '../../ecommerce/models'; +import { PVID, RUID } from '../uid'; +import { UIDFactory } from '../uid/factory'; +import { BaseTracker, PageMeta } from './base'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; +import { Item, Promotion } from '../ecommerce/models'; export interface BeaconOptions { beaconSrc?: string; diff --git a/src/trackers/beacon/index.ts b/src/trackers/beacon/index.ts deleted file mode 100644 index c6df020..0000000 --- a/src/trackers/beacon/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './tracker'; diff --git a/src/trackers/ga/tracker.ts b/src/trackers/ga.ts similarity index 93% rename from src/trackers/ga/tracker.ts rename to src/trackers/ga.ts index fb172e8..a2d9608 100644 --- a/src/trackers/ga/tracker.ts +++ b/src/trackers/ga.ts @@ -1,7 +1,7 @@ -import { loadGA } from '../../utils/externalServices'; -import { BaseTracker, PageMeta } from '../base'; -import { PurchaseInfo } from '../../ecommerce/models/transaction'; -import { Item, Promotion } from '../../ecommerce/models'; +import { loadGA } from '../utils/externalServices'; +import { BaseTracker, PageMeta } from './base'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; +import { Item, Promotion } from '../ecommerce/models'; interface GAFields extends UniversalAnalytics.FieldsObject { allowAdFeatures?: boolean; diff --git a/src/trackers/ga/index.ts b/src/trackers/ga/index.ts deleted file mode 100644 index c6df020..0000000 --- a/src/trackers/ga/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './tracker'; diff --git a/src/trackers/gtag/tracker.ts b/src/trackers/gtag.ts similarity index 92% rename from src/trackers/gtag/tracker.ts rename to src/trackers/gtag.ts index 574c309..212b8ed 100644 --- a/src/trackers/gtag/tracker.ts +++ b/src/trackers/gtag.ts @@ -1,7 +1,7 @@ -import { loadGTag } from '../../utils/externalServices'; -import { BaseTracker, PageMeta } from '../base'; -import { PurchaseInfo } from '../../ecommerce/models/transaction'; -import { Item, Promotion } from '../../ecommerce/models'; +import { loadGTag } from '../utils/externalServices'; +import { BaseTracker, PageMeta } from './base'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; +import { Item, Promotion } from '../ecommerce/models'; export interface GTagOptions { trackingId: string; diff --git a/src/trackers/gtag/index.ts b/src/trackers/gtag/index.ts deleted file mode 100644 index c6df020..0000000 --- a/src/trackers/gtag/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './tracker'; diff --git a/src/trackers/index.ts b/src/trackers/index.ts index ebaec43..93975e1 100644 --- a/src/trackers/index.ts +++ b/src/trackers/index.ts @@ -2,7 +2,7 @@ export * from './beacon'; export * from './ga'; export * from './pixel'; export * from './tagmanager'; -export * from './gtag/tracker'; +export * from './gtag'; export * from './kakao'; export * from './twitter'; export * from '../ecommerce'; diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 1f16f43..251f10e 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -1,6 +1,6 @@ import { loadPixel } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { EcommerceTracker, Item, Promotion } from '../ecommerce'; +import { Item, Promotion } from '../ecommerce'; import { PurchaseInfo } from '../ecommerce/models/transaction'; export interface PixelOptions { diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 820c4d5..7802863 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,7 +2,7 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { EcommerceTracker, Item, Promotion } from '../ecommerce'; +import { Item, Promotion } from '../ecommerce'; import { PurchaseInfo } from '../ecommerce/models/transaction'; export interface TagManagerOptions { diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index cdc3ea1..60c2186 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { EcommerceTracker, Item, Promotion } from '../ecommerce'; +import { Item, Promotion } from '../ecommerce'; import { PurchaseInfo } from '../ecommerce/models/transaction'; declare let twq: any; From dabb5b5417bbffa8d1b96bdfd0402fcac7672a52 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 22 Oct 2020 17:27:22 +0900 Subject: [PATCH 18/39] Update gtag tracker following ga4 update --- src/trackers/gtag.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index 212b8ed..6bb4383 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -99,7 +99,14 @@ export class GTagTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - gtag('event', 'purchase', { purchaseInfo }); + gtag('event', 'purchase', { + transaction_id: transactionId, + ...purchaseInfo, + }); + } + + public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { + gtag('event', 'begin_checkout', purchaseInfo); } public sendRefund( From 875bfb607bc092d8fbe2dbe8e03d437263fc6e9e Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 22 Oct 2020 17:28:48 +0900 Subject: [PATCH 19/39] Implement ecommerce tracking methods on Tracker --- src/index.ts | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/index.ts b/src/index.ts index 8fbbb86..9cbd74c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,6 +20,7 @@ import { TwitterTracker, } from './trackers'; import { BaseTracker, EventTracker, PageMeta } from './trackers/base'; +import { PurchaseInfo } from './ecommerce/models/transaction'; export enum DeviceType { PC = 'pc', @@ -179,25 +180,50 @@ export class Tracker { } @pushEventToQueue() - public sendStartSubscription(): EventParameters { - return []; + public sendSignUp(method: string): EventParameters { + return [method]; } @pushEventToQueue() - public sendImpression(items: Item[]): EventParameters { - return [items]; + public sendBeginCheckout(purchaseInfo: PurchaseInfo): EventParameters { + return [purchaseInfo]; } @pushEventToQueue() - public sendAddPaymentInfo(): EventParameters { - return []; + public sendAddPaymentInfo( + paymentType: string, + purchaseInfo: PurchaseInfo, + ): EventParameters { + return [paymentType, purchaseInfo]; } @pushEventToQueue() - public sendSignUp(): EventParameters { + public sendPurchase( + transactionId: string, + purchaseInfo: PurchaseInfo, + ): EventParameters { + return [transactionId, purchaseInfo]; + } + + @pushEventToQueue() + public sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ): EventParameters { + return [screenName, previousScreenName, referrer]; + } + + @pushEventToQueue() + public sendStartSubscription(): EventParameters { return []; } + @pushEventToQueue() + public sendImpression(items: Item[]): EventParameters { + return [items]; + } + private initializedTrackers(): BaseTracker[] { return this.trackers.filter(t => t.isInitialized()); } From 485f57ee4a2b9ce241881938d24c466c4ddbb2dc Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 22 Oct 2020 17:41:35 +0900 Subject: [PATCH 20/39] Fix broken testcase --- src/__tests__/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index 04414a8..7aaff76 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -275,7 +275,7 @@ it('Test TwitterTracker', async () => { t.sendPageView('href'); t.sendImpression([]); - t.sendSignUp(); + t.sendSignUp('method'); t.sendStartSubscription(); jest.runOnlyPendingTimers(); From dd7c7fdeeb57829ddacc2ab2acf728a8d79151cc Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 23 Oct 2020 17:59:12 +0900 Subject: [PATCH 21/39] Implement Ecommerce methods on TagManagerTracker --- src/trackers/beacon.ts | 3 +- src/trackers/tagmanager.ts | 74 +++++++++++++++++++------------------- src/utils/util.ts | 5 +++ 3 files changed, 44 insertions(+), 38 deletions(-) create mode 100644 src/utils/util.ts diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 1667cd6..7c858a6 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -6,6 +6,7 @@ import { UIDFactory } from '../uid/factory'; import { BaseTracker, PageMeta } from './base'; import { PurchaseInfo } from '../ecommerce/models/transaction'; import { Item, Promotion } from '../ecommerce/models'; +import { convertKeyToSnakeCase } from '../utils/util'; export interface BeaconOptions { beaconSrc?: string; @@ -55,7 +56,7 @@ export class BeaconTracker extends BaseTracker { ts = new Date(); } - data = _.mapKeys(data, (v, k) => _.snakeCase(k)); + data = convertKeyToSnakeCase(data); const search = `?${URL.qs.stringify(pageMeta.query_params)}`; diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 7802863..6724385 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -2,8 +2,9 @@ import { MainTrackerOptions } from '..'; import { loadTagManager } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Item, Promotion } from '../ecommerce'; +import { Item } from '../ecommerce'; import { PurchaseInfo } from '../ecommerce/models/transaction'; +import { convertKeyToSnakeCase } from '../utils/util'; export interface TagManagerOptions { trackingId: string; @@ -34,7 +35,7 @@ export class TagManagerTracker extends BaseTracker { super.setMainOptions(newOptions); this.pushDataLayer(newOptions); - this.sendEvent('Options Changed', newOptions); + this.sendEvent('OptionsChanged', newOptions); } public async initialize(): Promise { @@ -48,61 +49,60 @@ export class TagManagerTracker extends BaseTracker { } public sendPageView(pageMeta: PageMeta, ts?: Date): void { - this.sendEvent('Page View', pageMeta, ts); + this.sendEvent('PageView', pageMeta, ts); } - public sendEvent( - name: string, - data: Record = {}, - ts?: Date, - ): void { - this.dataLayer.push({ event: name, data }); + public sendSignUp(method: string, ts?: Date): void { + this.sendEvent('SignUp', { method }, ts); } - private pushDataLayer(data: Record): void { - this.dataLayer.push(data); + public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { + this.sendEvent('BeginCheckout', purchaseInfo, ts); } - public sendImpression(items: Item[], ts?: Date): void {} - - public sendSignUp(method: string, ts?: Date): void {} - public sendAddPaymentInfo( paymentType: string, purchaseInfo: PurchaseInfo, ts?: Date, - ): void {} + ): void { + this.sendEvent('AddPaymentInfo', { paymentType, ...purchaseInfo }, ts); + } - public sendStartSubscription( - args?: Record, + public sendEvent( + name: string, + data: Record = {}, ts?: Date, - ): void {} + ): void { + data = convertKeyToSnakeCase(data); + this.dataLayer.push({ event: name, data }); + } - public sendAddToCart(items: Item[], ts?: Date): void {} + private pushDataLayer(data: Record): void { + this.dataLayer.push(data); + } public sendItemView(items: Item[], ts?: Date): void {} public sendItemViewFromList(items: Item[], ts?: Date): void {} - public sendPurchase( - transactionId: string, - purchaseInfo: PurchaseInfo, + public sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, ts?: Date, - ): void {} + ): void { + this.sendEvent( + 'ScreenView', + { screenName, previousScreenName, referrer }, + ts, + ); + } - public sendRefund( + public sendPurchase( + transactionId: string, purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void {} - - public sendRemoveFromCart(items: Item[], ts?: Date): void {} - - public sendSearch(searchTerm: string, ts?: Date): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], ts?: Date, - ): void {} + ): void { + this.sendEvent('Purchase', { transactionId, purchaseInfo }, ts); + } } diff --git a/src/utils/util.ts b/src/utils/util.ts new file mode 100644 index 0000000..5f65c60 --- /dev/null +++ b/src/utils/util.ts @@ -0,0 +1,5 @@ +import _ from 'lodash'; + +export function convertKeyToSnakeCase(obj: Record): Record { + return _.mapKeys(obj, (v, k) => _.snakeCase(k)); +} From 37f75a8eaca3c0280ebb3f8675edecb7c3d1783f Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 26 Oct 2020 18:04:41 +0900 Subject: [PATCH 22/39] Test Release 0.11.0-alpha.1 --- package.json | 2 +- src/trackers/kakao.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 75896be..2931f83 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.10.2", + "version": "0.11.0-alpha.1", "description": "", "main": "dist/cjs/index.js", "typings": "dist/typings/index.d.ts", diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 4ced4ae..0940f21 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -1,7 +1,7 @@ import { loadKakao } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { PurchaseInfo } from '../ecommerce/models/transaction'; import { Item, Promotion } from '../ecommerce/models'; +import { PurchaseInfo } from '../ecommerce/models/transaction'; declare let kakaoPixel: (trackingId: string) => KakaoPixel; From eb2e216d66cb3f4f07c25688ae63c1269cbe5c90 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 26 Oct 2020 20:03:59 +0900 Subject: [PATCH 23/39] Set user_id to GTagTracker --- src/trackers/gtag.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index 6bb4383..c6e1338 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -5,6 +5,7 @@ import { Item, Promotion } from '../ecommerce/models'; export interface GTagOptions { trackingId: string; + uId?: number; autoPageView?: boolean; defaultCurrency?: string; } @@ -25,6 +26,8 @@ export class GTagTracker extends BaseTracker { await loadGTag(this.options.trackingId); gtag('config', this.options.trackingId, { send_page_view: this.options.autoPageView, + // eslint-disable-next-line prettier/prettier + user_id: this.options.uId?.toString(), }); gtag('set', { currency: this.options.defaultCurrency }); } From e767edda706e451cb2b55f4dce88cb1e4a735b2a Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 26 Oct 2020 20:52:08 +0900 Subject: [PATCH 24/39] Refactoring EcommerceTracker interface - Rename sendItemView to sendViewItem - Rename sendItemViewFromList to sendViewItemFromList --- src/ecommerce/interface.ts | 6 +++--- src/trackers/beacon.ts | 28 ++-------------------------- src/trackers/ga.ts | 4 ++-- src/trackers/gtag.ts | 38 ++------------------------------------ src/trackers/kakao.ts | 4 ++-- src/trackers/pixel.ts | 4 ++-- src/trackers/tagmanager.ts | 4 ++-- src/trackers/twitter.ts | 4 ++-- 8 files changed, 17 insertions(+), 75 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 84d7b5b..15024b9 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -27,16 +27,16 @@ export interface EcommerceTracker { /** * @deprecated Use sendItemViewFromList instead. - * @see sendItemViewFromList + * @see sendViewItemFromList */ sendStartSubscription(args?: Record, ts?: Date): void; sendImpression(items: Item[], ts?: Date): void; - sendItemView(items: Item[], ts?: Date): void; + sendViewItem(items: Item[], ts?: Date): void; - sendItemViewFromList(items: Item[], ts?: Date): void; + sendViewItemFromList(items: Item[], ts?: Date): void; sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 7c858a6..85488d6 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -1,6 +1,5 @@ import URL from 'url-parse'; -import _ from 'lodash'; import { PVID, RUID } from '../uid'; import { UIDFactory } from '../uid/factory'; import { BaseTracker, PageMeta } from './base'; @@ -133,16 +132,9 @@ export class BeaconTracker extends BaseTracker { this.sendEvent('beginCheckout', purchaseInfo, ts); } - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} - - public sendAddToCart(items: Item[], ts?: Date): void {} - - public sendItemView(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Item[], ts?: Date): void {} + public sendViewItemFromList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, @@ -151,22 +143,6 @@ export class BeaconTracker extends BaseTracker { ): void { this.sendEvent('purchase', purchaseInfo, ts); } - - public sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void {} - - public sendRemoveFromCart(items: Item[], ts?: Date): void {} - - public sendSearch(searchTerm: string, ts?: Date): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], - ts?: Date, - ): void {} } /* eslint-disable camelcase */ diff --git a/src/trackers/ga.ts b/src/trackers/ga.ts index a2d9608..8ab9ad1 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga.ts @@ -98,9 +98,9 @@ export class GATracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Item[], ts?: Date): void {} + public sendViewItemFromList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index c6e1338..9da11e3 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -73,27 +73,12 @@ export class GTagTracker extends BaseTracker { gtag('event', 'screen_view', { screen_name: screenName }); } - public sendImpression(items: Item[], ts?: Date): void { - this.sendItemViewFromList(items, ts); - } - - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} - public sendAddToCart(items: Item[], ts?: Date): void { - gtag('event', 'add_to_cart', { - value: items.map(p => p.price).reduce((pre, cur) => pre + cur), - items, - }); - } - - public sendItemView(items: Item[], ts?: Date): void { + public sendViewItem(items: Item[], ts?: Date): void { gtag('event', 'view_item', { items }); } - public sendItemViewFromList(items: Item[], ts?: Date): void { + public sendViewItemFromList(items: Item[], ts?: Date): void { gtag('event', 'view_item_list', { items }); } @@ -112,26 +97,7 @@ export class GTagTracker extends BaseTracker { gtag('event', 'begin_checkout', purchaseInfo); } - public sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void { - gtag('event', 'refund', { purchaseInfo, items }); - } - - public sendRemoveFromCart(items: Item[], ts?: Date): void { - gtag('event', 'remove_from_cart', { - value: items.map(p => p.price).reduce((pre, cur) => pre + cur), - items, }); } - public sendSearch(searchTerm: string, ts?: Date): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], - ts?: Date, - ): void {} } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 0940f21..133d59b 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -64,9 +64,9 @@ export class KakaoTracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Item[], ts?: Date): void {} + public sendViewItemFromList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 251f10e..e02c686 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -65,9 +65,9 @@ export class PixelTracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Item[], ts?: Date): void {} + public sendViewItemFromList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 6724385..a53ce4b 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -81,9 +81,9 @@ export class TagManagerTracker extends BaseTracker { this.dataLayer.push(data); } - public sendItemView(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Item[], ts?: Date): void {} + public sendViewItemFromList(items: Item[], ts?: Date): void {} public sendScreenView( screenName: string, diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 60c2186..110a1cc 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -79,9 +79,9 @@ export class TwitterTracker extends BaseTracker { public sendAddToCart(items: Item[], ts?: Date): void {} - public sendItemView(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void {} - public sendItemViewFromList(items: Item[], ts?: Date): void {} + public sendViewItemFromList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, From 248ed59ca3ff192090279d6b1fc8890c74c39da3 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Mon, 26 Oct 2020 21:00:01 +0900 Subject: [PATCH 25/39] Fix method call with invalid aguments on beacon, gtag tracker --- package-lock.json | 2 +- src/ecommerce/interface.ts | 10 +++++----- src/trackers/beacon.ts | 9 +++++++-- src/trackers/gtag.ts | 24 +++++++++++++++++++----- src/trackers/tagmanager.ts | 7 +++++++ 5 files changed, 39 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62bafc0..642d1fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.10.2", + "version": "0.11.0-alpha.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 15024b9..4524b39 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -16,7 +16,9 @@ export interface EcommerceTracker { ts?: Date, ): void; - /* TODO: Implement below methods */ + sendViewItem(items: Item[], ts?: Date): void; + + sendViewItemFromList(items: Item[], ts?: Date): void; sendScreenView( screenName: string, @@ -25,6 +27,8 @@ export interface EcommerceTracker { ts?: Date, ): void; + /* TODO: Implement below methods */ + /** * @deprecated Use sendItemViewFromList instead. * @see sendViewItemFromList @@ -34,10 +38,6 @@ export interface EcommerceTracker { sendImpression(items: Item[], ts?: Date): void; - sendViewItem(items: Item[], ts?: Date): void; - - sendViewItemFromList(items: Item[], ts?: Date): void; - sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; sendAddToCart(items: Item[], ts?: Date): void; diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 85488d6..53b5aba 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -129,7 +129,7 @@ export class BeaconTracker extends BaseTracker { } public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { - this.sendEvent('beginCheckout', purchaseInfo, ts); + this.sendEvent('beginCheckout', { ...purchaseInfo }, ts); } public sendViewItem(items: Item[], ts?: Date): void {} @@ -141,8 +141,13 @@ export class BeaconTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - this.sendEvent('purchase', purchaseInfo, ts); + this.sendEvent('purchase', { transactionId, ...purchaseInfo }, ts); } + + public sendStartSubscription( + args?: Record, + ts?: Date, + ): void {} } /* eslint-disable camelcase */ diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index 9da11e3..cda6c81 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -1,7 +1,7 @@ import { loadGTag } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; import { PurchaseInfo } from '../ecommerce/models/transaction'; -import { Item, Promotion } from '../ecommerce/models'; +import { Item } from '../ecommerce/models'; export interface GTagOptions { trackingId: string; @@ -57,7 +57,13 @@ export class GTagTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - gtag('event', 'add_payment_info', { ...purchaseInfo }); + gtag('event', + 'add_payment_info', + { + payment_type: paymentType, + ...purchaseInfo, + coupon: purchaseInfo.coupon_name, + }); } public sendSignUp(method: string, ts?: Date): void { @@ -73,6 +79,9 @@ export class GTagTracker extends BaseTracker { gtag('event', 'screen_view', { screen_name: screenName }); } + public sendImpression(items: Item[], ts?: Date): void {} + + public sendViewItem(items: Item[], ts?: Date): void { gtag('event', 'view_item', { items }); @@ -94,10 +103,15 @@ export class GTagTracker extends BaseTracker { } public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { - gtag('event', 'begin_checkout', purchaseInfo); - } - + gtag('event', 'begin_checkout', { + ...purchaseInfo, + coupon: purchaseInfo.coupon_name, }); } + public sendStartSubscription( + args?: Record, + ts?: Date, + ): void {} + } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index a53ce4b..890ae60 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -105,4 +105,11 @@ export class TagManagerTracker extends BaseTracker { ): void { this.sendEvent('Purchase', { transactionId, purchaseInfo }, ts); } + + public sendImpression(items: Item[], ts?: Date): void {} + + public sendStartSubscription( + args?: Record, + ts?: Date, + ): void {} } From 1ecc60cb05bcffc7405da0fdd8f6f48637244027 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Tue, 27 Oct 2020 21:38:30 +0900 Subject: [PATCH 26/39] Implement new ecommerce methods on tagmanager, beacon tracker --- src/ecommerce/interface.ts | 15 ++++++--------- src/trackers/base.ts | 7 +++++++ src/trackers/beacon.ts | 12 ++++++++++-- src/trackers/gtag.ts | 4 ++-- src/trackers/tagmanager.ts | 12 +++++++++++- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 4524b39..058659d 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -18,24 +18,21 @@ export interface EcommerceTracker { sendViewItem(items: Item[], ts?: Date): void; - sendViewItemFromList(items: Item[], ts?: Date): void; + sendAddToPreference(items: Item[], ts?: Date): void; - sendScreenView( - screenName: string, - previousScreenName: string, - referrer?: string, - ts?: Date, - ): void; + sendAddToNewBookNotification(items: Item[], ts?: Date): void; + + sendViewItemFromList(items: Item[], ts?: Date): void; /* TODO: Implement below methods */ + sendStartSubscription(args?: Record, ts?: Date): void; + /** * @deprecated Use sendItemViewFromList instead. * @see sendViewItemFromList */ - sendStartSubscription(args?: Record, ts?: Date): void; - sendImpression(items: Item[], ts?: Date): void; sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; diff --git a/src/trackers/base.ts b/src/trackers/base.ts index d85a0aa..67faf6c 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -15,6 +15,13 @@ export interface PageMeta { export interface EventTracker { sendPageView(pageMeta: PageMeta, ts?: Date): void; + sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ts?: Date, + ): void; + sendEvent(name: string, data?: Record, ts?: Date): void; sendSignUp(method: string, ts?: Date): void; diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 53b5aba..9dc4ecd 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -132,9 +132,17 @@ export class BeaconTracker extends BaseTracker { this.sendEvent('beginCheckout', { ...purchaseInfo }, ts); } - public sendViewItem(items: Item[], ts?: Date): void {} + public sendAddToPreference(items: Item[], ts?: Date): void { + this.sendEvent('addToPreference', { items }, ts); + } + + public sendViewItem(items: Item[], ts?: Date): void { + this.sendEvent('viewItem', { items }, ts); + } - public sendViewItemFromList(items: Item[], ts?: Date): void {} + public sendAddToNewBookNotification(items: Item[], ts?: Date): void { + this.sendEvent('addToNewBookNotification', { items }, ts); + } public sendPurchase( transactionId: string, diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index cda6c81..d072288 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -79,8 +79,7 @@ export class GTagTracker extends BaseTracker { gtag('event', 'screen_view', { screen_name: screenName }); } - public sendImpression(items: Item[], ts?: Date): void {} - + public sendImpression(items: Item[], ts?: Date): void {} public sendViewItem(items: Item[], ts?: Date): void { @@ -91,6 +90,7 @@ export class GTagTracker extends BaseTracker { gtag('event', 'view_item_list', { items }); } + public sendPurchase( transactionId: string, purchaseInfo: PurchaseInfo, diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 890ae60..dfde748 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -68,6 +68,14 @@ export class TagManagerTracker extends BaseTracker { this.sendEvent('AddPaymentInfo', { paymentType, ...purchaseInfo }, ts); } + public sendAddToPreference(items: Item[], ts?: Date): void { + this.sendEvent('AddToPreference', { items }, ts); + } + + public sendAddToNewBookNotification(items: Item[], ts?: Date): void { + this.sendEvent('AddToNewBookNotification', { items }, ts); + } + public sendEvent( name: string, data: Record = {}, @@ -81,7 +89,9 @@ export class TagManagerTracker extends BaseTracker { this.dataLayer.push(data); } - public sendViewItem(items: Item[], ts?: Date): void {} + public sendViewItem(items: Item[], ts?: Date): void { + this.sendEvent('ViewItem', { items }, ts); + } public sendViewItemFromList(items: Item[], ts?: Date): void {} From add8c1e4ca6f9ab54d73aa7df99b8d7bfb7bbdbb Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 28 Oct 2020 18:44:30 +0900 Subject: [PATCH 27/39] Release 0.11.0-alpha.3 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 642d1fe..bf2eb19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.1", + "version": "0.11.0-alpha.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2931f83..021ff6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.1", + "version": "0.11.0-alpha.3", "description": "", "main": "dist/cjs/index.js", "typings": "dist/typings/index.d.ts", From 81dd3a6628781a5904a4b933dcb7ebcd7699828d Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 28 Oct 2020 18:50:19 +0900 Subject: [PATCH 28/39] Capitalize first word on beacon events --- src/trackers/beacon.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 9dc4ecd..d33fde2 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -83,7 +83,7 @@ export class BeaconTracker extends BaseTracker { public sendPageView(pageMeta: PageMeta, ts?: Date): void { this.pvid = new UIDFactory(PVID).create(); - this.sendBeacon('pageView', pageMeta, this.mainOptions.serviceProps, ts); + this.sendBeacon('PageView', pageMeta, this.mainOptions.serviceProps, ts); this.lastPageMeta = pageMeta; } @@ -104,7 +104,7 @@ export class BeaconTracker extends BaseTracker { public sendImpression(items: Item[], ts?: Date): void {} public sendSignUp(method: string, ts?: Date): void { - this.sendEvent('signUp', { method }, ts); + this.sendEvent('SignUp', { method }, ts); } public sendScreenView( @@ -114,7 +114,7 @@ export class BeaconTracker extends BaseTracker { ts?: Date, ): void { this.sendEvent( - 'screenView', + 'ScreenView', { screenName, previousScreenName, referrer }, ts, ); @@ -125,23 +125,23 @@ export class BeaconTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - this.sendEvent('addPaymentInfo', { paymentType, ...purchaseInfo }, ts); + this.sendEvent('AddPaymentInfo', { paymentType, ...purchaseInfo }, ts); } public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { - this.sendEvent('beginCheckout', { ...purchaseInfo }, ts); + this.sendEvent('BeginCheckout', { ...purchaseInfo }, ts); } public sendAddToPreference(items: Item[], ts?: Date): void { - this.sendEvent('addToPreference', { items }, ts); + this.sendEvent('AddToPreference', { items }, ts); } public sendViewItem(items: Item[], ts?: Date): void { - this.sendEvent('viewItem', { items }, ts); + this.sendEvent('ViewItem', { items }, ts); } public sendAddToNewBookNotification(items: Item[], ts?: Date): void { - this.sendEvent('addToNewBookNotification', { items }, ts); + this.sendEvent('AddToNewBookNotification', { items }, ts); } public sendPurchase( @@ -149,7 +149,7 @@ export class BeaconTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - this.sendEvent('purchase', { transactionId, ...purchaseInfo }, ts); + this.sendEvent('Purchase', { transactionId, ...purchaseInfo }, ts); } public sendStartSubscription( From 3a75a015f861fdcb5ec97082e1be5ed6de2b5fc9 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 28 Oct 2020 18:52:58 +0900 Subject: [PATCH 29/39] Release 0.11.0-alpha.4 --- package-lock.json | 2 +- package.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index bf2eb19..b66c76b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.3", + "version": "0.11.0-alpha.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 021ff6f..7990247 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.3", + "version": "0.11.0-alpha.4", "description": "", "main": "dist/cjs/index.js", "typings": "dist/typings/index.d.ts", @@ -12,7 +12,7 @@ "build": "npm run clean && npm run build:cjs && npm run build:umd", "build:cjs": "tsc", "build:umd": "webpack", - "deploy": "npm run build && npm publish -access public" + "deploy": "npm run build && npm publish -access public && npm install" }, "pre-commit": [ "lint" From 44091e8b501bdfa850768a2ea41eec37c81611f7 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Wed, 28 Oct 2020 19:03:32 +0900 Subject: [PATCH 30/39] Release 0.11.0-alpha.6 --- package-lock.json | 2 +- package.json | 2 +- src/trackers/tagmanager.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b66c76b..92e2dce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.4", + "version": "0.11.0-alpha.6", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7990247..8b72e6d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.4", + "version": "0.11.0-alpha.6", "description": "", "main": "dist/cjs/index.js", "typings": "dist/typings/index.d.ts", diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index dfde748..34427b9 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -49,7 +49,7 @@ export class TagManagerTracker extends BaseTracker { } public sendPageView(pageMeta: PageMeta, ts?: Date): void { - this.sendEvent('PageView', pageMeta, ts); + this.sendEvent('PageView', { ...pageMeta }, ts); } public sendSignUp(method: string, ts?: Date): void { @@ -57,7 +57,7 @@ export class TagManagerTracker extends BaseTracker { } public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { - this.sendEvent('BeginCheckout', purchaseInfo, ts); + this.sendEvent('BeginCheckout', { ...purchaseInfo }, ts); } public sendAddPaymentInfo( @@ -82,7 +82,7 @@ export class TagManagerTracker extends BaseTracker { ts?: Date, ): void { data = convertKeyToSnakeCase(data); - this.dataLayer.push({ event: name, data }); + this.dataLayer.push({ event: name, event_params: data }); } private pushDataLayer(data: Record): void { @@ -113,7 +113,7 @@ export class TagManagerTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void { - this.sendEvent('Purchase', { transactionId, purchaseInfo }, ts); + this.sendEvent('Purchase', { transactionId, ...purchaseInfo }, ts); } public sendImpression(items: Item[], ts?: Date): void {} From 680ccbd4fcece5843982bbf545a8f66e620576a5 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 29 Oct 2020 17:17:02 +0900 Subject: [PATCH 31/39] Reanme sendViewItemFromList to sendViewItemList --- src/ecommerce/interface.ts | 11 +++++++---- src/trackers/ga.ts | 2 +- src/trackers/gtag.ts | 5 ++--- src/trackers/kakao.ts | 2 +- src/trackers/pixel.ts | 2 +- src/trackers/twitter.ts | 5 ++++- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 058659d..2e0897b 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -22,15 +22,18 @@ export interface EcommerceTracker { sendAddToNewBookNotification(items: Item[], ts?: Date): void; - sendViewItemFromList(items: Item[], ts?: Date): void; + sendViewContent(item: Item, ts?: Date): void; - /* TODO: Implement below methods */ + sendViewItemList(items: Item[], ts?: Date): void; + /** + * @deprecated + */ sendStartSubscription(args?: Record, ts?: Date): void; /** - * @deprecated Use sendItemViewFromList instead. - * @see sendViewItemFromList + * @deprecated Use sendItemViewFList instead. + * @see sendViewItemList */ sendImpression(items: Item[], ts?: Date): void; diff --git a/src/trackers/ga.ts b/src/trackers/ga.ts index 8ab9ad1..5b94116 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga.ts @@ -100,7 +100,7 @@ export class GATracker extends BaseTracker { public sendViewItem(items: Item[], ts?: Date): void {} - public sendViewItemFromList(items: Item[], ts?: Date): void {} + public sendViewItemList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index d072288..5978ff4 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -5,7 +5,6 @@ import { Item } from '../ecommerce/models'; export interface GTagOptions { trackingId: string; - uId?: number; autoPageView?: boolean; defaultCurrency?: string; } @@ -27,7 +26,7 @@ export class GTagTracker extends BaseTracker { gtag('config', this.options.trackingId, { send_page_view: this.options.autoPageView, // eslint-disable-next-line prettier/prettier - user_id: this.options.uId?.toString(), + user_id: this.mainOptions.uId?.toString(), }); gtag('set', { currency: this.options.defaultCurrency }); } @@ -86,7 +85,7 @@ export class GTagTracker extends BaseTracker { gtag('event', 'view_item', { items }); } - public sendViewItemFromList(items: Item[], ts?: Date): void { + public sendViewItemList(items: Item[], ts?: Date): void { gtag('event', 'view_item_list', { items }); } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 133d59b..0925d75 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -66,7 +66,7 @@ export class KakaoTracker extends BaseTracker { public sendViewItem(items: Item[], ts?: Date): void {} - public sendViewItemFromList(items: Item[], ts?: Date): void {} + public sendViewItemList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index e02c686..46e496c 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -67,7 +67,7 @@ export class PixelTracker extends BaseTracker { public sendViewItem(items: Item[], ts?: Date): void {} - public sendViewItemFromList(items: Item[], ts?: Date): void {} + public sendViewItemList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 110a1cc..7710f90 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -16,6 +16,9 @@ export interface TwitterOptions { impressionPid: string; } +/** + * @deprecated Use GTM provided tag + */ export class TwitterTracker extends BaseTracker { constructor(private options: TwitterOptions) { super(); @@ -81,7 +84,7 @@ export class TwitterTracker extends BaseTracker { public sendViewItem(items: Item[], ts?: Date): void {} - public sendViewItemFromList(items: Item[], ts?: Date): void {} + public sendViewItemList(items: Item[], ts?: Date): void {} public sendPurchase( transactionId: string, From 8776a9dac8405d5940a4486d9347918561a246d6 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 29 Oct 2020 17:19:05 +0900 Subject: [PATCH 32/39] Add sendLogin event method --- src/index.ts | 4 ++++ src/trackers/base.ts | 2 ++ src/trackers/beacon.ts | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/src/index.ts b/src/index.ts index 9cbd74c..32618e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -184,6 +184,10 @@ export class Tracker { return [method]; } + @pushEventToQueue() + public sendLogin(method: string): EventParameters { + return [method]; + } @pushEventToQueue() public sendBeginCheckout(purchaseInfo: PurchaseInfo): EventParameters { return [purchaseInfo]; diff --git a/src/trackers/base.ts b/src/trackers/base.ts index 67faf6c..4fc3e4e 100644 --- a/src/trackers/base.ts +++ b/src/trackers/base.ts @@ -25,6 +25,8 @@ export interface EventTracker { sendEvent(name: string, data?: Record, ts?: Date): void; sendSignUp(method: string, ts?: Date): void; + + sendLogin(method: string, ts?: Date): void; } // https://github.com/Microsoft/TypeScript/issues/4670#issuecomment-326585615 diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index d33fde2..2c2c5cb 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -101,6 +101,10 @@ export class BeaconTracker extends BaseTracker { this.sendBeacon(name, this.lastPageMeta, data, ts); } + public sendLogin(method: string, ts?: Date): void { + this.sendEvent('Login', ts); + } + public sendImpression(items: Item[], ts?: Date): void {} public sendSignUp(method: string, ts?: Date): void { From da5766d58a9d677648c95e6ba06dce023ef8a450 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 29 Oct 2020 17:19:34 +0900 Subject: [PATCH 33/39] Implement missing ecommerce methods --- src/index.ts | 27 ++++++++++++----- src/trackers/beacon.ts | 4 +++ src/trackers/tagmanager.ts | 60 +++++++++++++++++++++----------------- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/src/index.ts b/src/index.ts index 32618e8..b996411 100644 --- a/src/index.ts +++ b/src/index.ts @@ -169,14 +169,23 @@ export class Tracker { } } + @pushEventToQueue() + public sendEvent(name: string, data: any = {}): EventParameters { + return [name, data]; + } + @pushEventToQueue() public sendPageView(href: string, referrer?: string): EventParameters { return [this.getPageMeta(href, referrer)]; } @pushEventToQueue() - public sendEvent(name: string, data: any = {}): EventParameters { - return [name, data]; + public sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ): EventParameters { + return [screenName, previousScreenName, referrer]; } @pushEventToQueue() @@ -188,6 +197,7 @@ export class Tracker { public sendLogin(method: string): EventParameters { return [method]; } + @pushEventToQueue() public sendBeginCheckout(purchaseInfo: PurchaseInfo): EventParameters { return [purchaseInfo]; @@ -210,12 +220,13 @@ export class Tracker { } @pushEventToQueue() - public sendScreenView( - screenName: string, - previousScreenName: string, - referrer?: string, - ): EventParameters { - return [screenName, previousScreenName, referrer]; + public sendViewItem(items: Item[], ts?: Date): EventParameters { + return [items]; + } + + @pushEventToQueue() + public sendViewContent(item: Item, ts?: Date): EventParameters { + return [item]; } @pushEventToQueue() diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 2c2c5cb..73e9c17 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -144,6 +144,10 @@ export class BeaconTracker extends BaseTracker { this.sendEvent('ViewItem', { items }, ts); } + public sendViewContent(item: Item, ts?: Date): void { + this.sendEvent('ViewContent', { item }, ts); + } + public sendAddToNewBookNotification(items: Item[], ts?: Date): void { this.sendEvent('AddToNewBookNotification', { items }, ts); } diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 34427b9..35f33e8 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -31,6 +31,10 @@ export class TagManagerTracker extends BaseTracker { return window.dataLayer; } + private pushDataLayer(data: Record): void { + this.dataLayer.push(data); + } + public setMainOptions(newOptions: MainTrackerOptions): void { super.setMainOptions(newOptions); @@ -44,6 +48,15 @@ export class TagManagerTracker extends BaseTracker { this.tagCalled = true; } + public sendEvent( + name: string, + data: Record = {}, + ts?: Date, + ): void { + data = convertKeyToSnakeCase(data); + this.pushDataLayer({ event: name, event_params: data, ts }); + } + public isInitialized(): boolean { return this.tagCalled; } @@ -52,10 +65,27 @@ export class TagManagerTracker extends BaseTracker { this.sendEvent('PageView', { ...pageMeta }, ts); } + public sendScreenView( + screenName: string, + previousScreenName: string, + referrer?: string, + ts?: Date, + ): void { + this.sendEvent( + 'ScreenView', + { screenName, previousScreenName, referrer }, + ts, + ); + } + public sendSignUp(method: string, ts?: Date): void { this.sendEvent('SignUp', { method }, ts); } + public sendLogin(method: string, ts?: Date): void { + this.sendEvent('Login', { method }, ts); + } + public sendBeginCheckout(purchaseInfo: PurchaseInfo, ts?: Date): void { this.sendEvent('BeginCheckout', { ...purchaseInfo }, ts); } @@ -76,38 +106,16 @@ export class TagManagerTracker extends BaseTracker { this.sendEvent('AddToNewBookNotification', { items }, ts); } - public sendEvent( - name: string, - data: Record = {}, - ts?: Date, - ): void { - data = convertKeyToSnakeCase(data); - this.dataLayer.push({ event: name, event_params: data }); - } - - private pushDataLayer(data: Record): void { - this.dataLayer.push(data); - } - public sendViewItem(items: Item[], ts?: Date): void { this.sendEvent('ViewItem', { items }, ts); } - public sendViewItemFromList(items: Item[], ts?: Date): void {} - - public sendScreenView( - screenName: string, - previousScreenName: string, - referrer?: string, - ts?: Date, - ): void { - this.sendEvent( - 'ScreenView', - { screenName, previousScreenName, referrer }, - ts, - ); + public sendViewContent(item: Item, ts?: Date): void { + this.sendEvent('ViewContent', { item }, ts); } + public sendViewItemList(items: Item[], ts?: Date): void {} + public sendPurchase( transactionId: string, purchaseInfo: PurchaseInfo, From 96fa11feb16525df465a67932b1f18a455420b08 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 29 Oct 2020 17:36:30 +0900 Subject: [PATCH 34/39] Remove unimplemented ecommerce methods --- src/__tests__/index.ts | 4 ++-- src/ecommerce/interface.ts | 10 ---------- src/trackers/ga.ts | 20 -------------------- src/trackers/kakao.ts | 18 ------------------ src/trackers/pixel.ts | 18 ------------------ src/trackers/twitter.ts | 20 +------------------- 6 files changed, 3 insertions(+), 87 deletions(-) diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index 7aaff76..848a618 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -144,7 +144,7 @@ it('BeaconTracker sends PageView event with serviceProps', async () => { jest.runOnlyPendingTimers(); expect(sendBeaconMock).toHaveBeenCalledWith( - 'pageView', + 'PageView', dummpyPageMeta, { prop1: 'value1', prop2: 'value2' }, expect.any(Date), @@ -237,7 +237,7 @@ it('GATracker should send pageview event', async () => { ); }); -it('Test TwitterTracker', async () => { +it.skip('Test TwitterTracker', async () => { const t = new TestableTracker({ twitterOptions: { mainPid: 'mainPid', diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 2e0897b..2dd6265 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -37,14 +37,4 @@ export interface EcommerceTracker { */ sendImpression(items: Item[], ts?: Date): void; - - sendRefund(purchaseInfo: PurchaseInfo, items: Item[], ts?: Date): void; - - sendAddToCart(items: Item[], ts?: Date): void; - - sendRemoveFromCart(items: Item[], ts?: Date): void; - - sendSearch(searchTerm: string, ts?: Date): void; - - sendViewPromotion(promotion: Promotion, items?: Item[], ts?: Date): void; } diff --git a/src/trackers/ga.ts b/src/trackers/ga.ts index 5b94116..b71fbff 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga.ts @@ -81,8 +81,6 @@ export class GATracker extends BaseTracker { ga('send', fields); } - public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(method: string, ts?: Date): void {} public sendAddPaymentInfo( @@ -96,8 +94,6 @@ export class GATracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Item[], ts?: Date): void {} - public sendViewItem(items: Item[], ts?: Date): void {} public sendViewItemList(items: Item[], ts?: Date): void {} @@ -107,20 +103,4 @@ export class GATracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void {} - - public sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void {} - - public sendRemoveFromCart(items: Item[], ts?: Date): void {} - - public sendSearch(searchTerm: string, ts?: Date): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], - ts?: Date, - ): void {} } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 0925d75..3780c1f 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -62,8 +62,6 @@ export class KakaoTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Item[], ts?: Date): void {} - public sendViewItem(items: Item[], ts?: Date): void {} public sendViewItemList(items: Item[], ts?: Date): void {} @@ -74,25 +72,9 @@ export class KakaoTracker extends BaseTracker { ts?: Date, ): void {} - public sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void {} - - public sendRemoveFromCart(items: Item[], ts?: Date): void {} - - public sendSearch(searchTerm: string, ts?: Date): void {} - public sendEvent( name: string, data?: Record, ts?: Date, ): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], - ts?: Date, - ): void {} } diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 46e496c..8e190ea 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -63,8 +63,6 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Item[], ts?: Date): void {} - public sendViewItem(items: Item[], ts?: Date): void {} public sendViewItemList(items: Item[], ts?: Date): void {} @@ -74,20 +72,4 @@ export class PixelTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void {} - - public sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void {} - - public sendRemoveFromCart(items: Item[], ts?: Date): void {} - - public sendSearch(searchTerm: string, ts?: Date): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], - ts?: Date, - ): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index 7710f90..bc7bfa1 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -3,7 +3,7 @@ import { loadTwitterUniversal, } from '../utils/externalServices'; import { BaseTracker, PageMeta } from './base'; -import { Item, Promotion } from '../ecommerce'; +import { Item } from '../ecommerce'; import { PurchaseInfo } from '../ecommerce/models/transaction'; declare let twq: any; @@ -80,8 +80,6 @@ export class TwitterTracker extends BaseTracker { ts?: Date, ): void {} - public sendAddToCart(items: Item[], ts?: Date): void {} - public sendViewItem(items: Item[], ts?: Date): void {} public sendViewItemList(items: Item[], ts?: Date): void {} @@ -91,20 +89,4 @@ export class TwitterTracker extends BaseTracker { purchaseInfo: PurchaseInfo, ts?: Date, ): void {} - - public sendRefund( - purchaseInfo: PurchaseInfo, - items: Item[], - ts?: Date, - ): void {} - - public sendRemoveFromCart(items: Item[], ts?: Date): void {} - - public sendSearch(searchTerm: string, ts?: Date): void {} - - public sendViewPromotion( - promotion: Promotion, - items?: Item[], - ts?: Date, - ): void {} } From 74847048e6e75b051cbb79399fe3a35d9a84003a Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Thu, 29 Oct 2020 17:42:42 +0900 Subject: [PATCH 35/39] Release 0.11.0-alpha.7 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 92e2dce..48033ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.6", + "version": "0.11.0-alpha.7", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8b72e6d..096191b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ridi/event-tracker", - "version": "0.11.0-alpha.6", + "version": "0.11.0-alpha.7", "description": "", "main": "dist/cjs/index.js", "typings": "dist/typings/index.d.ts", From 80459a3d40c7ff12d223620624ec746e6696ce2f Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 30 Oct 2020 17:30:16 +0900 Subject: [PATCH 36/39] Remove redundant ecommerce methods --- src/__tests__/index.ts | 2 -- src/ecommerce/interface.ts | 12 ------------ src/trackers/beacon.ts | 7 ------- src/trackers/ga.ts | 5 ----- src/trackers/gtag.ts | 3 --- src/trackers/kakao.ts | 11 ----------- src/trackers/pixel.ts | 7 ------- src/trackers/tagmanager.ts | 7 ------- src/trackers/twitter.ts | 17 ----------------- 9 files changed, 71 deletions(-) diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index 848a618..dd7044c 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -249,9 +249,7 @@ it.skip('Test TwitterTracker', async () => { t.mockingAll(ALL_TRACKERS.excludes(TwitterTracker), [ 'sendPageView', - 'sendImpression', 'sendSignUp', - 'sendStartSubscription', ]); const trackPidMock = jest.fn(); diff --git a/src/ecommerce/interface.ts b/src/ecommerce/interface.ts index 2dd6265..2e4bc29 100644 --- a/src/ecommerce/interface.ts +++ b/src/ecommerce/interface.ts @@ -25,16 +25,4 @@ export interface EcommerceTracker { sendViewContent(item: Item, ts?: Date): void; sendViewItemList(items: Item[], ts?: Date): void; - - /** - * @deprecated - */ - sendStartSubscription(args?: Record, ts?: Date): void; - - /** - * @deprecated Use sendItemViewFList instead. - * @see sendViewItemList - */ - - sendImpression(items: Item[], ts?: Date): void; } diff --git a/src/trackers/beacon.ts b/src/trackers/beacon.ts index 73e9c17..5d220af 100644 --- a/src/trackers/beacon.ts +++ b/src/trackers/beacon.ts @@ -105,8 +105,6 @@ export class BeaconTracker extends BaseTracker { this.sendEvent('Login', ts); } - public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(method: string, ts?: Date): void { this.sendEvent('SignUp', { method }, ts); } @@ -159,11 +157,6 @@ export class BeaconTracker extends BaseTracker { ): void { this.sendEvent('Purchase', { transactionId, ...purchaseInfo }, ts); } - - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} } /* eslint-disable camelcase */ diff --git a/src/trackers/ga.ts b/src/trackers/ga.ts index b71fbff..d70652b 100644 --- a/src/trackers/ga.ts +++ b/src/trackers/ga.ts @@ -89,11 +89,6 @@ export class GATracker extends BaseTracker { ts?: Date, ): void {} - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} - public sendViewItem(items: Item[], ts?: Date): void {} public sendViewItemList(items: Item[], ts?: Date): void {} diff --git a/src/trackers/gtag.ts b/src/trackers/gtag.ts index 5978ff4..73cde3f 100644 --- a/src/trackers/gtag.ts +++ b/src/trackers/gtag.ts @@ -78,9 +78,6 @@ export class GTagTracker extends BaseTracker { gtag('event', 'screen_view', { screen_name: screenName }); } - public sendImpression(items: Item[], ts?: Date): void {} - - public sendViewItem(items: Item[], ts?: Date): void { gtag('event', 'view_item', { items }); } diff --git a/src/trackers/kakao.ts b/src/trackers/kakao.ts index 3780c1f..693fdf4 100644 --- a/src/trackers/kakao.ts +++ b/src/trackers/kakao.ts @@ -45,17 +45,6 @@ export class KakaoTracker extends BaseTracker { this.tracker.completeRegistration(); } - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void { - this.tracker.signUp(); - } - - public sendImpression(items: Item[], ts?: Date): void { - this.tracker.viewContent(); - } - public sendAddPaymentInfo( paymentType: string, purchaseInfo: PurchaseInfo, diff --git a/src/trackers/pixel.ts b/src/trackers/pixel.ts index 8e190ea..821f069 100644 --- a/src/trackers/pixel.ts +++ b/src/trackers/pixel.ts @@ -48,8 +48,6 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendImpression(items: Item[], ts?: Date): void {} - public sendSignUp(method: string, ts?: Date): void {} public sendAddPaymentInfo( @@ -58,11 +56,6 @@ export class PixelTracker extends BaseTracker { ts?: Date, ): void {} - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} - public sendViewItem(items: Item[], ts?: Date): void {} public sendViewItemList(items: Item[], ts?: Date): void {} diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index 35f33e8..fb2917a 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -123,11 +123,4 @@ export class TagManagerTracker extends BaseTracker { ): void { this.sendEvent('Purchase', { transactionId, ...purchaseInfo }, ts); } - - public sendImpression(items: Item[], ts?: Date): void {} - - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void {} } diff --git a/src/trackers/twitter.ts b/src/trackers/twitter.ts index bc7bfa1..4dd4987 100644 --- a/src/trackers/twitter.ts +++ b/src/trackers/twitter.ts @@ -57,23 +57,6 @@ export class TwitterTracker extends BaseTracker { }); } - public sendStartSubscription( - args?: Record, - ts?: Date, - ): void { - this.twttr.conversion.trackPid(this.options.selectStartSubscriptionPid, { - tw_sale_amount: 0, - tw_order_quantity: 0, - }); - } - - public sendImpression(items: Item[], ts?: Date): void { - this.twttr.conversion.trackPid(this.options.impressionPid, { - tw_sale_amount: 0, - tw_order_quantity: 0, - }); - } - public sendAddPaymentInfo( paymentType: string, purchaseInfo: PurchaseInfo, From 15d03e3db527cb018876ed85d7c8f3f08949fb7d Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 30 Oct 2020 17:34:10 +0900 Subject: [PATCH 37/39] Update Item propeties --- src/ecommerce/models/item.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ecommerce/models/item.ts b/src/ecommerce/models/item.ts index f27392a..5d91331 100644 --- a/src/ecommerce/models/item.ts +++ b/src/ecommerce/models/item.ts @@ -18,6 +18,6 @@ export interface Item extends Partial { readonly price?: number; readonly currency?: Currency; readonly index?: number; - readonly item_list_id: string; - readonly item_list_name: string; + readonly item_list_id?: string; + readonly item_list_name?: string; } From ba553068eeb2bc8d3ff0b721ea35aa1efc876a31 Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 30 Oct 2020 17:43:03 +0900 Subject: [PATCH 38/39] Cleanup redundant method --- src/index.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index b996411..3e890e1 100644 --- a/src/index.ts +++ b/src/index.ts @@ -229,16 +229,6 @@ export class Tracker { return [item]; } - @pushEventToQueue() - public sendStartSubscription(): EventParameters { - return []; - } - - @pushEventToQueue() - public sendImpression(items: Item[]): EventParameters { - return [items]; - } - private initializedTrackers(): BaseTracker[] { return this.trackers.filter(t => t.isInitialized()); } From 927a79248fa2ff14857f09f3fe742c258cc84ffb Mon Sep 17 00:00:00 2001 From: Sangbong Lee Date: Fri, 30 Oct 2020 19:44:59 +0900 Subject: [PATCH 39/39] Prevent init tracker twice in gtm tag --- src/__tests__/index.ts | 2 -- src/trackers/tagmanager.ts | 9 ++++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/__tests__/index.ts b/src/__tests__/index.ts index dd7044c..43f53c3 100644 --- a/src/__tests__/index.ts +++ b/src/__tests__/index.ts @@ -272,9 +272,7 @@ it.skip('Test TwitterTracker', async () => { t.throttledFlush = t.flush.bind(t); t.sendPageView('href'); - t.sendImpression([]); t.sendSignUp('method'); - t.sendStartSubscription(); jest.runOnlyPendingTimers(); diff --git a/src/trackers/tagmanager.ts b/src/trackers/tagmanager.ts index fb2917a..7e79bbb 100644 --- a/src/trackers/tagmanager.ts +++ b/src/trackers/tagmanager.ts @@ -36,10 +36,13 @@ export class TagManagerTracker extends BaseTracker { } public setMainOptions(newOptions: MainTrackerOptions): void { - super.setMainOptions(newOptions); + if (this.mainOptions) { + this.sendEvent('OptionsChanged', newOptions); + } else { + this.pushDataLayer(newOptions); + } - this.pushDataLayer(newOptions); - this.sendEvent('OptionsChanged', newOptions); + super.setMainOptions(newOptions); } public async initialize(): Promise {