import { SingleSubject } from "ai-mstech-subject"; import { BaseObservable as IBaseObservable } from "/SingleSubject"; import { useCallback, useEffect, useState } from "react"; import { Subscription } from "rxjs"; type TypeFunc = () => string; type Type = string; interface BaseObservable { type: Type | TypeFunc, payload: T; } export default function useSubject( type: Type | TypeFunc, callback: (data: T) => void ) { const [subscribe, setSubscribe] = useState(null); const observer = useCallback( ({ type: actionType, payload }: BaseObservable) => { let _type: Type; if (typeof actionType === 'function') { _type = actionType(); } else { _type = actionType; } if (_type === type) { callback(payload) } }, [] ); function remove() { if (subscribe) { SingleSubject.delete(subscribe); setSubscribe(null); } } function reConnect() { if (!subscribe) { const _subscribe = SingleSubject.add({ next: observer as (ob: IBaseObservable) => void, error: () => { }, complete: () => { }, }); setSubscribe(_subscribe); } } useEffect(() => { reConnect(); return () => { remove(); }; }, []) }