본문으로 건너뛰기

tdsEvent.addEventListener

TDS(Toss Design System) 이벤트를 구독합니다. 현재 navigationAccessoryEvent(상단 네비게이션 악세서리 버튼 클릭)를 지원합니다. partner.addAccessoryButton으로 버튼을 등록한 뒤 이 메서드로 클릭 이벤트를 수신합니다.

시그니처

import { tdsEvent } from '@apps-in-toss/web-framework';

type TdsEvent = {
navigationAccessoryEvent: {
onEvent: (data: { id: string }) => void;
onError?: (error: Error) => void;
options: undefined;
};
};

declare const tdsEvent: {
addEventListener: <K extends keyof TdsEvent>(
event: K,
handlers: {
onEvent: TdsEvent[K]['onEvent'];
onError?: TdsEvent[K]['onError'];
options?: TdsEvent[K]['options'];
}
) => () => void;
};

파라미터

이름타입필수설명
event'navigationAccessoryEvent'구독할 이벤트 이름.
handlers.onEvent(data: { id: string }) => void이벤트 발생 시 호출되는 핸들러. data.idpartner.addAccessoryButton에 등록한 버튼 ID.
handlers.onError(error: Error) => void이벤트 처리 중 에러 발생 시 호출되는 핸들러.
handlers.optionsundefined현재 사용하지 않음.
필드타입설명
idstringpartner.addAccessoryButton에 등록한 버튼의 고유 ID.

반환값

  • () => void — cleanup 함수. 이벤트 구독을 해제합니다. useEffect 반환값으로 사용하세요.

권한

권한이 필요하지 않습니다 — tdsEvent.addEventListener는 별도의 PermissionName에 바인딩되지 않습니다.

예제

최소 예제 — navigationAccessoryEvent

import { tdsEvent } from '@apps-in-toss/web-framework';
import { useEffect } from 'react';

function Page() {
useEffect(() => {
const cleanup = tdsEvent.addEventListener('navigationAccessoryEvent', {
onEvent: ({ id }) => {
console.log('악세서리 버튼 클릭:', id);
},
});
return cleanup;
}, []);

return <main>{/* 페이지 콘텐츠 */}</main>;
}

실전 예제 — partner.addAccessoryButton과 함께 사용

import { partner, tdsEvent } from '@apps-in-toss/web-framework';
import { useEffect, useState } from 'react';
import { useNavigate } from 'react-router-dom';

function ArticlePage() {
const navigate = useNavigate();
const [isLiked, setIsLiked] = useState(false);

useEffect(() => {
// 1. 상단 네비게이션에 하트 버튼 추가
partner.addAccessoryButton({
id: 'like-button',
title: '좋아요',
icon: { name: 'icon-heart-mono' },
});

// 2. 버튼 클릭 이벤트 구독
const cleanup = tdsEvent.addEventListener('navigationAccessoryEvent', {
onEvent: ({ id }) => {
if (id === 'like-button') {
setIsLiked((prev) => !prev);
}
},
});

return () => {
cleanup();
// 페이지를 벗어날 때 버튼 제거
partner.removeAccessoryButton();
};
}, []);

return (
<main>
<p>좋아요 상태: {isLiked ? '❤️ 좋아요' : '🤍 좋아요 안 함'}</p>
</main>
);
}

직접 실행해 보기

sdk-example의 Events 페이지에서 navigationAccessoryEvent를 직접 구독하고 결과를 확인할 수 있습니다.

sdk-example에서 실행해 보기

관련 API

관련 가이드

외부 참조