Page MenuHomePhabricator

D7511.diff
No OneTemporary

D7511.diff

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<void> {
+ 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);

File Metadata

Mime Type
text/plain
Expires
Mon, Oct 7, 3:45 PM (20 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2255165
Default Alt Text
D7511.diff (4 KB)

Event Timeline