export const broker = {
listeners: {},
publish: (key, message) =>
broker.listeners[key]?.forEach(listener => listener(message)),
subscribe: (key, listener) => {
if(!broker.listeners[key]) {
broker.listeners[key] = [listener]
return
}
broker.listeners[key].push(listener)
}
}
Toast가 axios interceptor에서 이벤트 리스너를 등록하여 구독하게 하는 기능도 구현이 가능
export const errorBroker = new EventTarget();
export const SHOW_TOAST_KEY= 'SHOW_TOAST'
axios.interceptors.response.use(
(res) => {
},
(err) => {
errorBrocker.dispatchEvent(new CustomEvent(SHOW_TOAST_KEY, {
detail: err
}))
return Promise.reject(err)
}
)
export default function Toast() {
const [errorMessage, setErrorMessage] = useState('');
const toast = useCallback((message) => {
setErrorMessage(message)
setTimeout(()=> setErrorMessage('', 3000)
}, [])
useEffect(()=>{
errorBroker.addEventListener(SHOW_TOAST_KEY, (e)=> toast(e.detail.message))
return () => errorBroker.removeEventListener(toast)
}, [toast])
return {errorMessage && <> ... </>}
}
'TIL' 카테고리의 다른 글
[espree] espree를 사용해서 jsx를 파싱 해보기 (0) | 2025.01.08 |
---|---|
createRoot (0) | 2024.12.16 |
TIL location.hash, history, router (0) | 2024.06.22 |
TIL 시맨틱, XMLHttpRequest, 이벤트 위임 제약 (0) | 2024.06.22 |
웹 서비스를 제공하는 방식 (0) | 2024.06.19 |