| 53 | } |
| 54 | |
| 55 | export function useActorRef<TLogic extends AnyActorLogic>( |
| 56 | machine: TLogic, |
| 57 | ...[options, observerOrListener]: IsNotNever< |
| 58 | RequiredActorOptionsKeys<TLogic> |
| 59 | > extends true |
| 60 | ? [ |
| 61 | options: ActorOptions<TLogic> & { |
| 62 | [K in RequiredActorOptionsKeys<TLogic>]: unknown; |
| 63 | }, |
| 64 | observerOrListener?: |
| 65 | | Observer<SnapshotFrom<TLogic>> |
| 66 | | ((value: SnapshotFrom<TLogic>) => void) |
| 67 | ] |
| 68 | : [ |
| 69 | options?: ActorOptions<TLogic>, |
| 70 | observerOrListener?: |
| 71 | | Observer<SnapshotFrom<TLogic>> |
| 72 | | ((value: SnapshotFrom<TLogic>) => void) |
| 73 | ] |
| 74 | ): Actor<TLogic> { |
| 75 | const actorRef = useIdleActorRef(machine, options); |
| 76 | |
| 77 | useEffect(() => { |
| 78 | if (!observerOrListener) { |
| 79 | return; |
| 80 | } |
| 81 | const sub = actorRef.subscribe(toObserver(observerOrListener)); |
| 82 | return () => { |
| 83 | sub.unsubscribe(); |
| 84 | }; |
| 85 | }, [observerOrListener]); |
| 86 | |
| 87 | useEffect(() => { |
| 88 | actorRef.start(); |
| 89 | |
| 90 | return () => { |
| 91 | stopRootWithRehydration(actorRef); |
| 92 | }; |
| 93 | }, [actorRef]); |
| 94 | |
| 95 | return actorRef; |
| 96 | } |