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 @@ -6,6 +6,10 @@ import { Platform } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; +import { + changeThreadSettings, + changeThreadSettingsActionTypes, +} from 'lib/actions/thread-actions.js'; import { uploadMultimedia } from 'lib/actions/upload-actions.js'; import { updateUserAvatar, @@ -21,6 +25,7 @@ MediaMissionFailure, UploadMultimediaResult, } from 'lib/types/media-types.js'; +import type { UpdateThreadRequest } from 'lib/types/thread-types.js'; import { useDispatchActionPromise, useServerCall, @@ -178,6 +183,74 @@ return selectFromGalleryAndUpdateUserAvatar; } +function useSelectFromGalleryAndUpdateThreadAvatar( + threadID: string, +): () => Promise { + const dispatchActionPromise = useDispatchActionPromise(); + const changeThreadSettingsCall = useServerCall(changeThreadSettings); + + const selectFromGallery = useSelectFromGallery(); + const processSelectedMedia = useProcessSelectedMedia(); + const uploadProcessedMedia = useUploadProcessedMedia(); + + const selectFromGalleryAndUpdateThreadAvatar = React.useCallback(async () => { + const selection: ?MediaLibrarySelection = await selectFromGallery(); + if (!selection) { + console.log('MEDIA_SELECTION_FAILED'); + return; + } + + const processedMedia = await processSelectedMedia(selection); + if (!processedMedia.success) { + console.log('MEDIA_PROCESSING_FAILED'); + // TODO (atul): Clean up any temporary files. + return; + } + + let uploadedMedia: ?UploadMultimediaResult; + try { + uploadedMedia = await uploadProcessedMedia(processedMedia); + // TODO (atul): Clean up any temporary files. + } catch { + console.log('MEDIA_UPLOAD_FAILED'); + // TODO (atul): Clean up any temporary files. + return; + } + + if (!uploadedMedia) { + console.log('MEDIA_UPLOAD_FAILED'); + // TODO (atul): Clean up any temporary files. + return; + } + + const imageAvatarUpdateRequest: ImageAvatarDBContent = { + type: 'image', + uploadID: uploadedMedia.id, + }; + + const updateThreadRequest: UpdateThreadRequest = { + threadID, + changes: { + avatar: imageAvatarUpdateRequest, + }, + }; + + dispatchActionPromise( + changeThreadSettingsActionTypes, + changeThreadSettingsCall(updateThreadRequest), + ); + }, [ + changeThreadSettingsCall, + dispatchActionPromise, + processSelectedMedia, + selectFromGallery, + threadID, + uploadProcessedMedia, + ]); + + return selectFromGalleryAndUpdateThreadAvatar; +} + type ShowAvatarActionSheetOptions = { +id: 'emoji' | 'image' | 'cancel', +onPress?: () => mixed, @@ -276,4 +349,5 @@ useProcessSelectedMedia, useShowAvatarActionSheet, useSelectFromGalleryAndUpdateUserAvatar, + useSelectFromGalleryAndUpdateThreadAvatar, }; diff --git a/native/avatars/edit-thread-avatar.react.js b/native/avatars/edit-thread-avatar.react.js --- a/native/avatars/edit-thread-avatar.react.js +++ b/native/avatars/edit-thread-avatar.react.js @@ -6,7 +6,7 @@ import type { RawThreadInfo, ThreadInfo } from 'lib/types/thread-types.js'; import { - useSelectFromGalleryAndUpdateUserAvatar, + useSelectFromGalleryAndUpdateThreadAvatar, useShowAvatarActionSheet, } from './avatar-hooks.js'; import EditAvatarBadge from './edit-avatar-badge.react.js'; @@ -20,15 +20,15 @@ function EditThreadAvatar(props: Props): React.Node { const { threadInfo, onPressEmojiAvatarFlow, disabled } = props; - const selectFromGalleryAndUpdateUserAvatar = - useSelectFromGalleryAndUpdateUserAvatar(); + const selectFromGalleryAndUpdateThreadAvatar = + useSelectFromGalleryAndUpdateThreadAvatar(threadInfo.id); const actionSheetConfig = React.useMemo( () => [ { id: 'emoji', onPress: onPressEmojiAvatarFlow }, - { id: 'image', onPress: selectFromGalleryAndUpdateUserAvatar }, + { id: 'image', onPress: selectFromGalleryAndUpdateThreadAvatar }, ], - [onPressEmojiAvatarFlow, selectFromGalleryAndUpdateUserAvatar], + [onPressEmojiAvatarFlow, selectFromGalleryAndUpdateThreadAvatar], ); const showAvatarActionSheet = useShowAvatarActionSheet(actionSheetConfig);