@adstage/web-sdk
Version:
AdStage Web SDK - Production-ready marketing platform SDK with React Provider support for seamless integration
156 lines (140 loc) • 5.46 kB
text/typescript
import { AdEventType } from '../types/advertisement';
import type { AdSlot, Advertisement } from '../types/advertisement';
/**
* 광고 클릭 이벤트 핸들러 유틸리티
* 모든 광고 타입에서 일관된 클릭 이벤트 처리를 위한 공통 컴포넌트
*/
export class AdClickHandler {
/**
* 광고 요소에 클릭 이벤트를 추가하는 공통 함수
* @param element - 클릭 이벤트를 추가할 DOM 요소
* @param advertisement - 광고 데이터
* @param slot - 광고 슬롯 정보
* @param trackEventCallback - 이벤트 추적 콜백 함수
* @param debug - 디버그 모드
* @param adTypeLabel - 광고 타입 라벨 (로그용, 선택사항)
*/
static addClickEvent(
element: HTMLElement,
advertisement: Advertisement,
slot: AdSlot,
trackEventCallback: (adId: string, slotId: string, eventType: AdEventType) => void,
debug: boolean = false,
adTypeLabel?: string
): void {
// linkUrl이 없으면 클릭 이벤트 추가하지 않음
if (!advertisement.linkUrl) {
return;
}
// 커서 스타일 설정
element.style.cursor = 'pointer';
// 클릭 이벤트 리스너 추가
element.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
// 이벤트 추적
if (trackEventCallback) {
trackEventCallback(advertisement._id, slot.id, AdEventType.CLICK);
}
// 링크 이동
window.open(advertisement.linkUrl!, '_blank');
// 디버그 로그
if (debug) {
const typeLabel = adTypeLabel || String(slot.adType).toLowerCase();
console.log(`🔗 ${typeLabel} ad clicked: ${advertisement._id} -> ${advertisement.linkUrl}`);
}
});
}
/**
* 렌더러에서 사용할 수 있는 간편한 클릭 이벤트 추가 함수
* BaseAdRenderer를 상속받은 클래스에서 사용
* @param element - 클릭 이벤트를 추가할 DOM 요소
* @param advertisement - 광고 데이터
* @param slot - 광고 슬롯 정보
* @param createEventTrackingCallback - 이벤트 추적 콜백 생성 함수
* @param debug - 디버그 모드
* @param adTypeLabel - 광고 타입 라벨 (로그용, 선택사항)
*/
static addClickEventForRenderer(
element: HTMLElement,
advertisement: Advertisement,
slot: AdSlot,
createEventTrackingCallback: () => (adId: string, slotId: string, eventType: AdEventType) => void,
debug: boolean = false,
adTypeLabel?: string
): void {
// linkUrl이 없으면 클릭 이벤트 추가하지 않음
if (!advertisement.linkUrl) {
return;
}
// 커서 스타일 설정
element.style.cursor = 'pointer';
// 클릭 이벤트 리스너 추가
element.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
// 이벤트 추적 콜백 생성
const trackEventCallback = createEventTrackingCallback();
trackEventCallback(advertisement._id, slot.id, AdEventType.CLICK);
// 링크 이동
window.open(advertisement.linkUrl!, '_blank');
// 디버그 로그
if (debug) {
const typeLabel = adTypeLabel || String(slot.adType).toLowerCase();
console.log(`🔗 ${typeLabel} ad clicked: ${advertisement._id} -> ${advertisement.linkUrl}`);
}
});
}
/**
* 슬라이더/매니저에서 사용할 수 있는 클릭 이벤트 추가 함수
* 이미 trackEventCallback이 준비된 상황에서 사용
* @param element - 클릭 이벤트를 추가할 DOM 요소
* @param advertisement - 광고 데이터
* @param slot - 광고 슬롯 정보
* @param trackEventCallback - 준비된 이벤트 추적 콜백
* @param debug - 디버그 모드
* @param adTypeLabel - 광고 타입 라벨 (로그용, 선택사항)
*/
static addClickEventForSlider(
element: HTMLElement,
advertisement: Advertisement,
slot: AdSlot,
trackEventCallback: (adId: string, slotId: string, eventType: AdEventType) => void,
debug: boolean = false,
adTypeLabel?: string
): void {
this.addClickEvent(element, advertisement, slot, trackEventCallback, debug, adTypeLabel);
}
/**
* 클릭 가능한 광고인지 확인하는 헬퍼 함수
* @param advertisement - 광고 데이터
* @returns linkUrl이 있으면 true, 없으면 false
*/
static isClickable(advertisement: Advertisement): boolean {
return Boolean(advertisement.linkUrl);
}
/**
* 여러 요소에 대해 일괄적으로 클릭 이벤트를 추가하는 함수
* @param elements - 클릭 이벤트를 추가할 DOM 요소들
* @param advertisements - 광고 데이터 배열 (elements와 같은 순서)
* @param slot - 광고 슬롯 정보
* @param trackEventCallback - 이벤트 추적 콜백
* @param debug - 디버그 모드
* @param adTypeLabel - 광고 타입 라벨 (로그용, 선택사항)
*/
static addClickEventsBatch(
elements: HTMLElement[],
advertisements: Advertisement[],
slot: AdSlot,
trackEventCallback: (adId: string, slotId: string, eventType: AdEventType) => void,
debug: boolean = false,
adTypeLabel?: string
): void {
elements.forEach((element, index) => {
const advertisement = advertisements[index];
if (advertisement) {
this.addClickEvent(element, advertisement, slot, trackEventCallback, debug, adTypeLabel);
}
});
}
}