Skip to content

Commit ab7c036

Browse files
committed
small refactor and fix resending image in replies
1 parent ca824d7 commit ab7c036

File tree

2 files changed

+72
-51
lines changed

2 files changed

+72
-51
lines changed

src/hooks/useResendPendingMessages.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ export function useResendPendingMessages() {
1717

1818
const admNodes = computed<NodeStatusResult[]>(() => store.getters['nodes/adm'])
1919
const ipfsNodes = computed<NodeStatusResult[]>(() => store.getters['nodes/ipfs'])
20-
const admNodesOnline = computed(() => admNodes.value.some((node) => node.status === 'online'))
21-
const ipfsNodesOnline = computed(() => ipfsNodes.value.some((node) => node.status === 'online'))
20+
const areAdmNodesOnline = computed(() => admNodes.value.some((node) => node.status === 'online'))
21+
const areIpfsNodesOnline = computed(() =>
22+
ipfsNodes.value.some((node) => node.status === 'online')
23+
)
2224
const pendingMessages = computed<Record<string, PendingMessage>>(
2325
() => store.state.chat.pendingMessages
2426
)
2527

26-
watchImmediate([admNodesOnline, ipfsNodesOnline], ([admOnline, ipfsOnline]) => {
28+
watchImmediate([areAdmNodesOnline, areIpfsNodesOnline], ([admOnline, ipfsOnline]) => {
2729
const hasMessagesWithFiles = Object.values(pendingMessages.value).some(
2830
(message) => message.files && message.files.length > 0
2931
)

src/store/modules/chat/index.js

Lines changed: 67 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ const actions = {
763763
* @param {string} replyToId Optional
764764
* @returns {Promise}
765765
*/
766-
async sendMessage({ commit, rootState }, { message, recipientId, replyToId }) {
766+
async sendMessage({ commit, rootState, dispatch }, { message, recipientId, replyToId }) {
767767
let id
768768
try {
769769
const type = replyToId
@@ -811,16 +811,18 @@ const actions = {
811811
})
812812
} catch (error) {
813813
if (isAllNodesOfflineError(error)) {
814+
// if the error is caused by connection we keep the message in PENDING status
815+
// and try to resend it after the connection is restored
816+
817+
// timeout for self deleting out of pending messages
814818
const timeout = setTimeout(() => {
815-
commit('updateMessage', {
816-
id,
817-
status: TS.REJECTED,
818-
partnerId: recipientId
819+
dispatch('rejectPendingMessage', {
820+
messageId: id,
821+
recipientId
819822
})
823+
}, Number(CryptosInfo.ADM.timeout.message))
820824

821-
commit('deletePendingMessage', id)
822-
}, +CryptosInfo.ADM.timeout.message)
823-
825+
// put the message into pending messages object
824826
commit('addPendingMessage', {
825827
messageId: id,
826828
type: MessageType.BASIC_ENCRYPTED_MESSAGE,
@@ -856,7 +858,10 @@ const actions = {
856858
* @param {string} replyToId Optional
857859
* @returns {Promise}
858860
*/
859-
async sendAttachment({ commit, rootState }, { files, message, recipientId, replyToId }) {
861+
async sendAttachment(
862+
{ commit, rootState, dispatch },
863+
{ files, message, recipientId, replyToId }
864+
) {
860865
const recipientPublicKey = await getPublicKey(recipientId)
861866
const senderPublicKey = await getPublicKey(rootState.address)
862867

@@ -949,24 +954,26 @@ const actions = {
949954
return res
950955
})
951956
.catch((err) => {
952-
// update `message.status` to 'REJECTED'
957+
// update `message.status` to 'REJECTED' if the error is not caused by connection
953958
if (!isAllNodesOfflineError(err)) {
954959
commit('updateMessage', {
955960
id: messageObject.id,
956961
status: TS.REJECTED,
957962
partnerId: recipientId
958963
})
959964
} else {
965+
// if the error is caused by connection we keep the message in PENDING status
966+
// and try to resend it after the connection is restored
967+
968+
// timeout for self deleting out of pending messages
960969
const timeout = setTimeout(() => {
961-
commit('updateMessage', {
962-
id: messageObject.id,
963-
status: TS.REJECTED,
964-
partnerId: recipientId
970+
dispatch('rejectPendingMessage', {
971+
messageId: messageObject.id,
972+
recipientId
965973
})
974+
}, Number(CryptosInfo.ADM.timeout.attachment))
966975

967-
commit('deletePendingMessage', messageObject.id)
968-
}, +CryptosInfo.ADM.timeout.attachment)
969-
976+
// put the message into pending messages object
970977
commit('addPendingMessage', {
971978
messageId: messageObject.id,
972979
type: MessageType.RICH_CONTENT_MESSAGE,
@@ -992,7 +999,7 @@ const actions = {
992999
* @param {number} id Message Id
9931000
* @returns {Promise}
9941001
*/
995-
resendMessage({ getters, commit }, { recipientId, messageId }) {
1002+
resendMessage({ getters, commit, dispatch }, { recipientId, messageId }) {
9961003
const message = getters.partnerMessageById(recipientId, messageId)
9971004

9981005
// update message status from `rejected` to `sent`
@@ -1020,24 +1027,20 @@ const actions = {
10201027
throw new Error(i18n.global.t('chats.message_rejected'))
10211028
}
10221029

1023-
commit('updateMessage', {
1024-
id: messageId,
1025-
realId: res.transactionId,
1026-
status: TS.REGISTERED,
1027-
partnerId: recipientId
1030+
dispatch('registerPendingMessage', {
1031+
transactionId: res.transactionId,
1032+
messageId,
1033+
recipientId
10281034
})
10291035

10301036
return res
10311037
})
10321038
.catch((error) => {
10331039
if (!isAllNodesOfflineError(error)) {
1034-
commit('updateMessage', {
1040+
dispatch('rejectPendingMessage', {
10351041
messageId,
1036-
status: TS.REJECTED,
1037-
partnerId: recipientId
1042+
recipientId
10381043
})
1039-
1040-
commit('deletePendingMessage', messageId)
10411044
}
10421045

10431046
throw error
@@ -1054,12 +1057,14 @@ const actions = {
10541057
* @param {FileData[]} files
10551058
* @returns {Promise}
10561059
*/
1057-
async resendAttachment({ getters, commit }, { recipientId, messageId, files }) {
1060+
async resendAttachment({ getters, commit, dispatch }, { recipientId, messageId, files }) {
10581061
const message = getters.partnerMessageById(recipientId, messageId)
10591062
if (!message) {
10601063
return Promise.reject(new Error('Message not found in history'))
10611064
}
10621065

1066+
// in case the files were not fully uploaded or uploaded incorrectly we
1067+
// reupload them from scratch to resend a message with attachments
10631068
const cidsOld = files.map((file) => [file.cid, file.preview?.cid]).filter(Boolean)
10641069
for (const [cid] of cidsOld) {
10651070
commit('attachment/resetUploadProgress', { cid }, { root: true })
@@ -1083,21 +1088,18 @@ const actions = {
10831088
}
10841089

10851090
if (!isAllNodesOfflineError(err)) {
1086-
commit('updateMessage', {
1087-
id: messageId,
1088-
status: TS.REJECTED,
1089-
partnerId: recipientId
1091+
dispatch('rejectPendingMessage', {
1092+
messageId,
1093+
recipientId
10901094
})
10911095

1092-
commit('deletePendingMessage', messageId)
1093-
10941096
throw err
10951097
}
10961098
}
10971099

1098-
const newAsset = message.replyToId
1100+
const newAsset = message.isReply
10991101
? {
1100-
replyto_id: message.replyToId,
1102+
replyto_id: message.asset.replyto_id,
11011103
reply_message: attachmentAsset(files, message.message, uploadData.cids)
11021104
}
11031105
: attachmentAsset(files, message.message, uploadData.cids)
@@ -1117,29 +1119,46 @@ const actions = {
11171119
if (!res.success) {
11181120
throw new Error(i18n.global.t('chats.message_rejected'))
11191121
}
1120-
commit('updateMessage', {
1121-
id: messageId,
1122-
realId: res.transactionId,
1123-
status: TS.REGISTERED,
1124-
partnerId: recipientId
1122+
dispatch('registerPendingMessage', {
1123+
transactionId: res.transactionId,
1124+
messageId,
1125+
recipientId
11251126
})
11261127
return res
11271128
})
11281129
.catch((err) => {
11291130
if (!isAllNodesOfflineError(err)) {
1130-
commit('updateMessage', {
1131-
id: messageId,
1132-
status: TS.REJECTED,
1133-
partnerId: recipientId
1131+
dispatch('rejectPendingMessage', {
1132+
messageId,
1133+
recipientId
11341134
})
1135-
1136-
commit('deletePendingMessage', messageId)
11371135
}
11381136

11391137
throw err
11401138
})
11411139
},
11421140

1141+
registerPendingMessage({ commit }, { messageId, recipientId, transactionId }) {
1142+
commit('updateMessage', {
1143+
id: messageId,
1144+
realId: transactionId,
1145+
status: TS.REGISTERED,
1146+
partnerId: recipientId
1147+
})
1148+
1149+
commit('deletePendingMessage', messageId)
1150+
},
1151+
1152+
rejectPendingMessage({ commit }, { messageId, recipientId }) {
1153+
commit('updateMessage', {
1154+
messageId,
1155+
status: TS.REJECTED,
1156+
partnerId: recipientId
1157+
})
1158+
1159+
commit('deletePendingMessage', messageId)
1160+
},
1161+
11431162
/**
11441163
* React to a message with emoji.
11451164
* After confirmation, `id` and `status` will be updated.

0 commit comments

Comments
 (0)