본문으로 건너뛰기

graniteEvent.addEventListener

Granite(토스 내부 UI 프레임워크) 이벤트를 구독합니다. 현재 backEvent(뒤로 가기 버튼)와 homeEvent(홈 버튼) 두 가지 이벤트를 지원합니다. 반환된 cleanup 함수를 호출하면 구독이 해제됩니다.

시그니처

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

type GraniteEvent = {
backEvent: {
onEvent: () => void;
onError?: (error: Error) => void;
options?: void;
};
homeEvent: {
onEvent: () => void;
onError?: (error: Error) => void;
options?: void;
};
};

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

파라미터

이름타입필수설명
event'backEvent' | 'homeEvent'구독할 이벤트 이름.
handlers.onEvent() => void이벤트 발생 시 호출되는 핸들러. 페이로드 없음.
handlers.onError(error: Error) => void이벤트 처리 중 에러 발생 시 호출되는 핸들러.
handlers.optionsvoid현재 사용하지 않음.

이벤트 타입

이벤트발화 시점
backEvent하드웨어 또는 소프트웨어 뒤로 가기 버튼을 누를 때
homeEvent홈 버튼을 누를 때

반환값

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

backEvent를 구독하면 기본 뒤로 가기 동작이 억제됩니다. onEvent 핸들러 내에서 직접 내비게이션 로직(예: history.back(), 라우터의 navigate(-1))을 구현해야 합니다.

권한

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

예제

최소 예제 — backEvent

import { graniteEvent } from '@apps-in-toss/web-framework';
import { useEffect } from 'react';
import { useNavigate } from 'react-router-dom';

function Page() {
const navigate = useNavigate();

useEffect(() => {
const cleanup = graniteEvent.addEventListener('backEvent', {
onEvent: () => {
navigate(-1);
},
});
return cleanup;
}, [navigate]);

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

최소 예제 — homeEvent

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

function Page() {
useEffect(() => {
const cleanup = graniteEvent.addEventListener('homeEvent', {
onEvent: () => {
// 홈 버튼 눌림 처리 (예: 진행 중인 작업 저장)
console.log('홈 버튼이 눌렸습니다.');
},
});
return cleanup;
}, []);

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

실전 예제 — 편집 중 뒤로 가기 확인 다이얼로그

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

function EditPage() {
const navigate = useNavigate();
const [isDirty, setIsDirty] = useState(false);

useEffect(() => {
const cleanup = graniteEvent.addEventListener('backEvent', {
onEvent: () => {
if (isDirty) {
// 저장되지 않은 변경사항이 있을 때 확인
const confirmed = window.confirm('변경사항이 저장되지 않았습니다. 나가시겠습니까?');
if (!confirmed) return;
}
navigate(-1);
},
});
return cleanup;
}, [isDirty, navigate]);

return (
<form onChange={() => setIsDirty(true)}>
{/* 편집 폼 */}
</form>
);
}

직접 실행해 보기

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

sdk-example에서 실행해 보기

관련 API

관련 가이드

외부 참조