11import { useCallback , useMemo , useState } from 'react' ;
22import { useStreamMutation , type StreamMutationId , type UseStreamMutationState } from './useStreamMutation.js' ;
3- import { useStream } from './useStream.js' ;
3+ import { useStream , type UseStreamResult } from './useStream.js' ;
44import { useStreamFiClient } from '../context/useStreamFiClient.js' ;
55
66export interface CancelSettlement {
@@ -14,7 +14,7 @@ export interface CancelSettlement {
1414 cancellationFeeAmount ?: bigint ;
1515}
1616
17- export type CancelStreamFn = ( ) => Promise < void > ;
17+ export type CancelStreamFn = ( ) => Promise < string > ;
1818
1919export interface UseCancelStreamResult extends UseStreamMutationState {
2020 /** Opens the in-app confirmation flow; does not contact the wallet. */
@@ -53,7 +53,7 @@ function settlementFor(stream: {
5353
5454export function useCancelStream ( streamId : StreamMutationId ) : UseCancelStreamResult {
5555 const { client } = useStreamFiClient ( ) ;
56- const { stream } = useStream ( streamId ) ;
56+ const { stream, setStream } = useStream ( streamId ) as UseStreamResult ;
5757 const mutation = useStreamMutation ( streamId , ( client , id ) => client . streams . cancel ( id ) ) ;
5858 const [ isConfirming , setIsConfirming ] = useState ( false ) ;
5959 const settlement = useMemo ( ( ) => stream ? settlementFor ( stream ) : null , [ stream ] ) ;
@@ -63,17 +63,35 @@ export function useCancelStream(streamId: StreamMutationId): UseCancelStreamResu
6363 // mutations. A real ConduitClient always exposes streams.get, so browser
6464 // callers follow the confirmation path above.
6565 if ( typeof client ?. streams ?. get !== 'function' ) {
66- await mutation . mutate ( ) ;
66+ const previous = stream ;
67+ if ( stream ) {
68+ setStream ( ( current ) => current ? { ...current , cancelled : true , paused : false , pausedAt : 0 } : current ) ;
69+ }
70+ try {
71+ await mutation . mutate ( ) ;
72+ } catch ( error ) {
73+ if ( previous ) setStream ( previous ) ;
74+ throw error ;
75+ }
6776 return ;
6877 }
6978 setIsConfirming ( true ) ;
70- } , [ client , mutation . mutate ] ) ;
79+ } , [ client , mutation , setStream , stream ] ) ;
7180 const dismissCancel = useCallback ( ( ) => setIsConfirming ( false ) , [ ] ) ;
7281 const confirmCancel = useCallback ( async ( ) => {
7382 if ( ! settlement ) throw new Error ( 'Stream settlement is not available yet.' ) ;
83+ const previous = stream ;
84+ if ( stream ) {
85+ setStream ( ( current ) => current ? { ...current , cancelled : true , paused : false , pausedAt : 0 } : current ) ;
86+ }
7487 setIsConfirming ( false ) ;
75- return mutation . mutate ( ) ;
76- } , [ mutation . mutate , settlement ] ) ;
88+ try {
89+ return await mutation . mutate ( ) ;
90+ } catch ( error ) {
91+ if ( previous ) setStream ( previous ) ;
92+ throw error ;
93+ }
94+ } , [ mutation , setStream , settlement , stream ] ) ;
7795 const reset = useCallback ( ( ) => {
7896 setIsConfirming ( false ) ;
7997 mutation . reset ( ) ;
0 commit comments