diff --git a/native/media/image-modal.react.js b/native/media/image-modal.react.js --- a/native/media/image-modal.react.js +++ b/native/media/image-modal.react.js @@ -6,7 +6,11 @@ import type { MediaInfo, Dimensions } from 'lib/types/media-types.js'; import Multimedia from './multimedia.react.js'; -import { useIntentionalSaveMedia, copyMediaIOS } from './save-media.js'; +import { + useIntentionalSaveMedia, + type IntentionalSaveMediaIDs, + copyMediaIOS, +} from './save-media.js'; import FullScreenViewModal from '../components/full-screen-view-modal.react.js'; import { displayActionResultModal } from '../navigation/action-result-modal.js'; import type { AppNavigationProp } from '../navigation/app-navigator.react.js'; @@ -24,7 +28,7 @@ +mediaInfo: MediaInfo, +initialCoordinates: LayoutCoordinates, +verticalBounds: VerticalBounds, - +item: ChatMultimediaMessageInfoItem, + +item?: ?ChatMultimediaMessageInfoItem, }; type Props = { @@ -40,12 +44,16 @@ const intentionalSaveMedia = useIntentionalSaveMedia(); + const messageInfo = item?.messageInfo; const onPressSave = React.useCallback(() => { const uploadID = mediaInfo.id; - const { id: messageServerID, localID: messageLocalID } = item.messageInfo; - const ids = { uploadID, messageServerID, messageLocalID }; + let ids: ?IntentionalSaveMediaIDs; + if (messageInfo) { + const { id: messageServerID, localID: messageLocalID } = messageInfo; + ids = { uploadID, messageServerID, messageLocalID }; + } return intentionalSaveMedia(mediaInfo, ids); - }, [intentionalSaveMedia, item.messageInfo, mediaInfo]); + }, [intentionalSaveMedia, messageInfo, mediaInfo]); const onPressCopyIOS = React.useCallback(async () => { const { success } = await copyMediaIOS(mediaInfo); diff --git a/native/media/save-media.js b/native/media/save-media.js --- a/native/media/save-media.js +++ b/native/media/save-media.js @@ -48,13 +48,15 @@ import { displayActionResultModal } from '../navigation/action-result-modal.js'; import { requestAndroidPermission } from '../utils/android-permissions.js'; +export type IntentionalSaveMediaIDs = { + +uploadID?: ?string, + +messageServerID?: ?string, + +messageLocalID?: ?string, +}; + export type IntentionalSaveMedia = ( mediaInfo: MediaInfo, - ids: { - uploadID: string, - messageServerID: ?string, - messageLocalID: ?string, - }, + ids?: ?IntentionalSaveMediaIDs, ) => Promise; function useIntentionalSaveMedia(): IntentionalSaveMedia { @@ -62,14 +64,7 @@ const mediaReportsEnabled = useIsReportEnabled('mediaReports'); const invalidTokenLogOut = useInvalidCSATLogOut(); return React.useCallback( - async ( - mediaInfo: MediaInfo, - ids: { - uploadID: string, - messageServerID: ?string, - messageLocalID: ?string, - }, - ) => { + async (mediaInfo: MediaInfo, ids?: ?IntentionalSaveMediaIDs) => { const start = Date.now(); const { uri: mediaURI, blobURI, holder, encryptionKey } = mediaInfo; const uri = mediaURI ?? blobURI ?? holder; @@ -122,8 +117,11 @@ const totalTime = Date.now() - start; const mediaMission = { steps, result, userTime, totalTime }; - const { uploadID, messageServerID, messageLocalID } = ids; - const uploadIDIsLocal = isLocalUploadID(uploadID); + const uploadID = ids?.uploadID; + const messageServerID = ids?.messageServerID; + const messageLocalID = ids?.messageLocalID; + + const uploadIDIsLocal = uploadID ? isLocalUploadID(uploadID) : false; const report: ClientMediaMissionReportCreationRequest = { type: reportTypes.MEDIA_MISSION, time: Date.now(), diff --git a/native/media/video-playback-modal.react.js b/native/media/video-playback-modal.react.js --- a/native/media/video-playback-modal.react.js +++ b/native/media/video-playback-modal.react.js @@ -57,7 +57,7 @@ +mediaInfo: MediaInfo, +initialCoordinates: LayoutCoordinates, +verticalBounds: VerticalBounds, - +item: ChatMultimediaMessageInfoItem, + +item?: ?ChatMultimediaMessageInfoItem, }; type ReactNativeVideoOnProgressData = {