1
1
import { useRouter } from 'expo-router' ;
2
2
import { useFragment } from 'react-relay' ;
3
- import { graphql } from 'relay-runtime' ;
3
+ import { graphql , SelectorStoreUpdater } from 'relay-runtime' ;
4
4
import { useMutation } from '~/api' ;
5
+ import { useRemoveMessage_account$key } from '~/api/__generated__/useRemoveMessage_account.graphql' ;
5
6
import { useRemoveMessage_message$key } from '~/api/__generated__/useRemoveMessage_message.graphql' ;
6
- import { useRemoveMessageMutation } from '~/api/__generated__/useRemoveMessageMutation.graphql' ;
7
+ import {
8
+ useRemoveMessageMutation ,
9
+ useRemoveMessageMutation$data ,
10
+ } from '~/api/__generated__/useRemoveMessageMutation.graphql' ;
11
+ import { useRemoveMessageUpdatableQuery } from '~/api/__generated__/useRemoveMessageUpdatableQuery.graphql' ;
7
12
import { useConfirmRemoval } from '~/hooks/useConfirm' ;
8
13
import { useSelectedAccount } from '~/hooks/useSelectedAccount' ;
9
14
15
+ graphql `
16
+ fragment useRemoveMessage_assignable_message on Message @assignable {
17
+ __typename
18
+ }
19
+ ` ;
20
+
21
+ const Account = graphql `
22
+ fragment useRemoveMessage_account on Account {
23
+ address
24
+ proposals {
25
+ id
26
+ ...useRemoveMessage_assignable_message
27
+ }
28
+ pendingProposals: proposals(input: { pending: true }) {
29
+ id
30
+ ...useRemoveMessage_assignable_message
31
+ }
32
+ }
33
+ ` ;
34
+
10
35
const Message = graphql `
11
36
fragment useRemoveMessage_message on Message {
12
37
id
13
38
signature
14
39
}
15
40
` ;
16
41
17
- export function useRemoveMessage ( messageFrag : useRemoveMessage_message$key ) {
18
- const m = useFragment ( Message , messageFrag ) ;
42
+ export interface RemoveMessageParams {
43
+ account : useRemoveMessage_account$key ;
44
+ message : useRemoveMessage_message$key ;
45
+ }
46
+
47
+ export function useRemoveMessage ( params : RemoveMessageParams ) {
48
+ const account = useFragment ( Account , params . account ) ;
49
+ const m = useFragment ( Message , params . message ) ;
19
50
const router = useRouter ( ) ;
20
- const account = useSelectedAccount ( ) ;
21
51
const confirmRemoval = useConfirmRemoval ( {
22
52
message : 'Are you sure you want to remove this message proposal?' ,
23
53
} ) ;
@@ -35,11 +65,50 @@ export function useRemoveMessage(messageFrag: useRemoveMessage_message$key) {
35
65
36
66
return async ( ) => {
37
67
if ( await confirmRemoval ( ) ) {
38
- await commit ( { proposal : m . id } ) ;
68
+ router . replace ( {
69
+ pathname : '/(nav)/[account]/(home)/activity' ,
70
+ params : { account : account . address } ,
71
+ } ) ;
72
+
73
+ const updater : SelectorStoreUpdater < useRemoveMessageMutation$data > = ( store , data ) => {
74
+ const id = data ?. removeMessage ;
75
+ if ( ! id ) return ;
76
+
77
+ // Remove from proposals
78
+ const { updatableData } = store . readUpdatableQuery < useRemoveMessageUpdatableQuery > (
79
+ graphql `
80
+ query useRemoveMessageUpdatableQuery($address: UAddress!) @updatable {
81
+ account(address: $address) {
82
+ proposals {
83
+ ...useProposeMessage_assignable_proposal
84
+ }
85
+ pendingProposals: proposals(input: { pending: true }) {
86
+ ...useProposeMessage_assignable_proposal
87
+ }
88
+ }
89
+ }
90
+ ` ,
91
+ { address : account . address } ,
92
+ ) ;
93
+
94
+ if ( updatableData . account ) {
95
+ // @ts -expect-error one __typename is 'string' the other is 'Transaction'
96
+ updatableData . account . proposals = account . proposals . filter ( ( p ) => p . id !== id ) ;
97
+ // @ts -expect-error one __typename is 'string' the other is 'Transaction'
98
+ updatableData . account . pendingProposals = account . pendingProposals . filter (
99
+ ( p ) => p . id !== id ,
100
+ ) ;
101
+ }
102
+ } ;
39
103
40
- account
41
- ? router . push ( { pathname : '/(nav)/[account]/(home)/activity' , params : { account } } )
42
- : router . back ( ) ;
104
+ await commit (
105
+ { proposal : m . id } ,
106
+ {
107
+ optimisticResponse : { removeMessage : m . id } ,
108
+ optimisticUpdater : updater ,
109
+ updater,
110
+ } ,
111
+ ) ;
43
112
}
44
113
} ;
45
114
}
0 commit comments