Page MenuHomePhorge

D7646.1768606020.diff
No OneTemporary

Size
6 KB
Referenced Files
None
Subscribers
None

D7646.1768606020.diff

diff --git a/native/avatars/edit-thread-avatar-provider.react.js b/native/avatars/edit-thread-avatar-provider.react.js
--- a/native/avatars/edit-thread-avatar-provider.react.js
+++ b/native/avatars/edit-thread-avatar-provider.react.js
@@ -10,7 +10,10 @@
import { createLoadingStatusSelector } from 'lib/selectors/loading-selectors.js';
import type { UpdateUserAvatarRemoveRequest } from 'lib/types/avatar-types.js';
import type { LoadingStatus } from 'lib/types/loading-types.js';
-import type { MediaLibrarySelection } from 'lib/types/media-types.js';
+import type {
+ MediaLibrarySelection,
+ NativeMediaSelection,
+} from 'lib/types/media-types.js';
import type { UpdateThreadRequest } from 'lib/types/thread-types.js';
import {
useDispatchActionPromise,
@@ -25,6 +28,7 @@
export type EditThreadAvatarContextType = {
+threadAvatarSaveInProgress: boolean,
+selectFromGalleryAndUpdateThreadAvatar: () => Promise<void>,
+ +updateImageThreadAvatar: (selection: NativeMediaSelection) => Promise<void>,
+removeThreadAvatar: () => void,
};
@@ -81,7 +85,7 @@
);
const updateImageThreadAvatar = React.useCallback(
- async (selection: ?MediaLibrarySelection) => {
+ async (selection: ?NativeMediaSelection) => {
const imageAvatarUpdateRequest = await uploadThreadAvatarSelectedMedia(
selection,
);
@@ -159,11 +163,13 @@
() => ({
threadAvatarSaveInProgress,
selectFromGalleryAndUpdateThreadAvatar,
+ updateImageThreadAvatar,
removeThreadAvatar,
}),
[
removeThreadAvatar,
selectFromGalleryAndUpdateThreadAvatar,
+ updateImageThreadAvatar,
threadAvatarSaveInProgress,
],
);
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
@@ -11,7 +11,10 @@
import EditAvatarBadge from './edit-avatar-badge.react.js';
import { EditThreadAvatarContext } from './edit-thread-avatar-provider.react.js';
import ThreadAvatar from './thread-avatar.react.js';
-import { EmojiThreadAvatarCreationRouteName } from '../navigation/route-names.js';
+import {
+ EmojiThreadAvatarCreationRouteName,
+ ThreadAvatarCameraModalRouteName,
+} from '../navigation/route-names.js';
import { useStyles } from '../themes/colors.js';
type Props = {
@@ -42,10 +45,18 @@
});
}, [navigate, threadInfo.containingThreadID, threadInfo.id]);
+ const navigateToCamera = React.useCallback(() => {
+ navigate<'ThreadAvatarCameraModal'>({
+ name: ThreadAvatarCameraModalRouteName,
+ params: { threadID: threadInfo.id },
+ });
+ }, [navigate, threadInfo.id]);
+
const actionSheetConfig = React.useMemo(() => {
const configOptions = [
{ id: 'emoji', onPress: navigateToThreadEmojiAvatarCreation },
{ id: 'image', onPress: selectFromGalleryAndUpdateThreadAvatar },
+ { id: 'camera', onPress: navigateToCamera },
];
if (threadInfo.avatar) {
@@ -54,6 +65,7 @@
return configOptions;
}, [
+ navigateToCamera,
navigateToThreadEmojiAvatarCreation,
removeThreadAvatar,
selectFromGalleryAndUpdateThreadAvatar,
diff --git a/native/media/thread-avatar-camera-modal.react.js b/native/media/thread-avatar-camera-modal.react.js
new file mode 100644
--- /dev/null
+++ b/native/media/thread-avatar-camera-modal.react.js
@@ -0,0 +1,35 @@
+// @flow
+
+import invariant from 'invariant';
+import * as React from 'react';
+
+import type { PhotoCapture } from 'lib/types/media-types.js';
+
+import { EditThreadAvatarContext } from '../avatars/edit-thread-avatar-provider.react.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';
+
+type Props = {
+ +navigation: AppNavigationProp<'ThreadAvatarCameraModal'>,
+ +route: NavigationRoute<'ThreadAvatarCameraModal'>,
+};
+
+function ThreadAvatarCameraModal(props: Props): React.Node {
+ const { navigation } = props;
+
+ const editThreadAvatarContext = React.useContext(EditThreadAvatarContext);
+ invariant(editThreadAvatarContext, 'editThreadAvatarContext should be set');
+ const { updateImageThreadAvatar } = editThreadAvatarContext;
+
+ const sendPhoto = React.useCallback(
+ (capture: PhotoCapture) => {
+ updateImageThreadAvatar(capture);
+ },
+ [updateImageThreadAvatar],
+ );
+
+ return <CameraModal handlePhotoCapture={sendPhoto} navigation={navigation} />;
+}
+
+export default ThreadAvatarCameraModal;
diff --git a/native/navigation/app-navigator.react.js b/native/navigation/app-navigator.react.js
--- a/native/navigation/app-navigator.react.js
+++ b/native/navigation/app-navigator.react.js
@@ -15,6 +15,7 @@
import type { RootNavigationProp } from './root-navigator.react.js';
import {
UserAvatarCameraModalRouteName,
+ ThreadAvatarCameraModalRouteName,
ImageModalRouteName,
MultimediaMessageTooltipModalRouteName,
ActionResultModalRouteName,
@@ -35,6 +36,7 @@
import KeyboardStateContainer from '../keyboard/keyboard-state-container.react.js';
import ChatCameraModal from '../media/chat-camera-modal.react.js';
import ImageModal from '../media/image-modal.react.js';
+import ThreadAvatarCameraModal from '../media/thread-avatar-camera-modal.react.js';
import UserAvatarCameraModal from '../media/user-avatar-camera-modal.react.js';
import VideoPlaybackModal from '../media/video-playback-modal.react.js';
import RelationshipListItemTooltipModal from '../profile/relationship-list-item-tooltip-modal.react.js';
@@ -141,6 +143,10 @@
name={UserAvatarCameraModalRouteName}
component={UserAvatarCameraModal}
/>
+ <App.Screen
+ name={ThreadAvatarCameraModalRouteName}
+ component={ThreadAvatarCameraModal}
+ />
<App.Screen
name={VideoPlaybackModalRouteName}
component={VideoPlaybackModal}
diff --git a/native/navigation/route-names.js b/native/navigation/route-names.js
--- a/native/navigation/route-names.js
+++ b/native/navigation/route-names.js
@@ -74,6 +74,7 @@
export const SubchannelsListModalRouteName = 'SubchannelsListModal';
export const TabNavigatorRouteName = 'TabNavigator';
export const TextMessageTooltipModalRouteName = 'TextMessageTooltipModal';
+export const ThreadAvatarCameraModalRouteName = 'ThreadAvatarCameraModal';
export const ThreadPickerModalRouteName = 'ThreadPickerModal';
export const ThreadSettingsMemberTooltipModalRouteName =
'ThreadSettingsMemberTooltipModal';
@@ -119,6 +120,7 @@
+ActionResultModal: ActionResultModalParams,
+ChatCameraModal: ChatCameraModalParams,
+UserAvatarCameraModal: void,
+ +ThreadAvatarCameraModal: void,
+VideoPlaybackModal: VideoPlaybackModalParams,
...TooltipModalParamList,
};

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 16, 11:27 PM (20 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5946432
Default Alt Text
D7646.1768606020.diff (6 KB)

Event Timeline