diff --git a/lib/components/base-edit-thread-avatar-provider.react.js b/lib/components/base-edit-thread-avatar-provider.react.js --- a/lib/components/base-edit-thread-avatar-provider.react.js +++ b/lib/components/base-edit-thread-avatar-provider.react.js @@ -104,26 +104,16 @@ }; const action = changeThreadSettingsActionTypes.started; - dispatchActionPromise( - changeThreadSettingsActionTypes, - (async () => { - updateThreadAvatarMediaUploadInProgress(false); - try { - return await changeThreadSettingsCall(updateThreadRequest); - } catch (e) { - displayFailureAlert(); - throw e; - } - })(), - { - customKeyName: `${action}:${threadID}:avatar`, - }, - ); + updateThreadAvatarMediaUploadInProgress(false); + const promise = changeThreadSettingsCall(updateThreadRequest); + dispatchActionPromise(changeThreadSettingsActionTypes, promise, { + customKeyName: `${action}:${threadID}:avatar`, + }); + await promise; }, [ changeThreadSettingsCall, dispatchActionPromise, - displayFailureAlert, updateThreadAvatarMediaUploadInProgress, uploadSelectedMedia, ], diff --git a/native/avatars/avatar-hooks.js b/native/avatars/avatar-hooks.js --- a/native/avatars/avatar-hooks.js +++ b/native/avatars/avatar-hooks.js @@ -308,6 +308,31 @@ return selectFromGalleryAndUpdateUserAvatar; } +function useNativeUpdateThreadImageAvatar(): ( + selection: NativeMediaSelection, + threadID: string, +) => Promise { + const editThreadAvatarContext = React.useContext(EditThreadAvatarContext); + invariant(editThreadAvatarContext, 'editThreadAvatarContext must be defined'); + const { updateImageThreadAvatar } = editThreadAvatarContext; + + const nativeUpdateThreadImageAvatar = React.useCallback( + async ( + selection: NativeMediaSelection, + threadID: string, + ): Promise => { + try { + await updateImageThreadAvatar(selection, threadID); + } catch { + displayAvatarUpdateFailureAlert(); + } + }, + [updateImageThreadAvatar], + ); + + return nativeUpdateThreadImageAvatar; +} + function useSelectFromGalleryAndUpdateThreadAvatar(): ( threadID: string, ) => Promise { @@ -463,4 +488,5 @@ useNativeSetUserAvatar, useNativeUpdateUserImageAvatar, useSelectFromGalleryAndUpdateThreadAvatar, + useNativeUpdateThreadImageAvatar, }; diff --git a/native/media/thread-avatar-camera-modal.react.js b/native/media/thread-avatar-camera-modal.react.js --- a/native/media/thread-avatar-camera-modal.react.js +++ b/native/media/thread-avatar-camera-modal.react.js @@ -6,6 +6,7 @@ import { EditThreadAvatarContext } from 'lib/components/base-edit-thread-avatar-provider.react.js'; import type { PhotoCapture } from 'lib/types/media-types.js'; +import { useNativeUpdateThreadImageAvatar } from '../avatars/avatar-hooks.js'; import CameraModal from '../media/camera-modal.react.js'; import type { AppNavigationProp } from '../navigation/app-navigator.react.js'; import type { NavigationRoute } from '../navigation/route-names.js'; @@ -25,13 +26,12 @@ const editThreadAvatarContext = React.useContext(EditThreadAvatarContext); invariant(editThreadAvatarContext, 'editThreadAvatarContext should be set'); - const { updateImageThreadAvatar } = editThreadAvatarContext; + + const nativeUpdateThreadImageAvatar = useNativeUpdateThreadImageAvatar(); const sendPhoto = React.useCallback( - (capture: PhotoCapture) => { - updateImageThreadAvatar(capture, threadID); - }, - [threadID, updateImageThreadAvatar], + (capture: PhotoCapture) => nativeUpdateThreadImageAvatar(capture, threadID), + [threadID, nativeUpdateThreadImageAvatar], ); return ;