Changeset View
Changeset View
Standalone View
Standalone View
native/input/input-state-container.react.js
// @flow | // @flow | ||||
import invariant from 'invariant'; | import invariant from 'invariant'; | ||||
import * as React from 'react'; | import * as React from 'react'; | ||||
import { Platform } from 'react-native'; | import { Platform } from 'react-native'; | ||||
import * as Upload from 'react-native-background-upload'; | import * as Upload from 'react-native-background-upload'; | ||||
import { useDispatch } from 'react-redux'; | import { useDispatch } from 'react-redux'; | ||||
import { createSelector } from 'reselect'; | import { createSelector } from 'reselect'; | ||||
import { | import { | ||||
createLocalMessageActionType, | createLocalMessageActionType, | ||||
sendMultimediaMessageActionTypes, | sendMultimediaMessageActionTypes, | ||||
legacySendMultimediaMessage, | sendMultimediaMessage, | ||||
sendTextMessageActionTypes, | sendTextMessageActionTypes, | ||||
sendTextMessage, | sendTextMessage, | ||||
} from 'lib/actions/message-actions'; | } from 'lib/actions/message-actions'; | ||||
import { queueReportsActionType } from 'lib/actions/report-actions'; | import { queueReportsActionType } from 'lib/actions/report-actions'; | ||||
import { newThread } from 'lib/actions/thread-actions'; | import { newThread } from 'lib/actions/thread-actions'; | ||||
import { | import { | ||||
uploadMultimedia, | uploadMultimedia, | ||||
updateMultimediaMessageMediaActionType, | updateMultimediaMessageMediaActionType, | ||||
Show All 27 Lines | |||||
import { | import { | ||||
messageTypes, | messageTypes, | ||||
type RawMessageInfo, | type RawMessageInfo, | ||||
type RawMultimediaMessageInfo, | type RawMultimediaMessageInfo, | ||||
type SendMessageResult, | type SendMessageResult, | ||||
type SendMessagePayload, | type SendMessagePayload, | ||||
} from 'lib/types/message-types'; | } from 'lib/types/message-types'; | ||||
import type { RawImagesMessageInfo } from 'lib/types/messages/images'; | import type { RawImagesMessageInfo } from 'lib/types/messages/images'; | ||||
import type { RawMediaMessageInfo } from 'lib/types/messages/media'; | import type { | ||||
MediaMessageServerDBContent, | |||||
RawMediaMessageInfo, | |||||
} from 'lib/types/messages/media'; | |||||
import type { RawTextMessageInfo } from 'lib/types/messages/text'; | import type { RawTextMessageInfo } from 'lib/types/messages/text'; | ||||
import type { Dispatch } from 'lib/types/redux-types'; | import type { Dispatch } from 'lib/types/redux-types'; | ||||
import { | import { | ||||
type MediaMissionReportCreationRequest, | type MediaMissionReportCreationRequest, | ||||
reportTypes, | reportTypes, | ||||
} from 'lib/types/report-types'; | } from 'lib/types/report-types'; | ||||
import type { | import type { | ||||
ClientNewThreadRequest, | ClientNewThreadRequest, | ||||
▲ Show 20 Lines • Show All 51 Lines • ▼ Show 20 Lines | type Props = { | ||||
+uploadMultimedia: ( | +uploadMultimedia: ( | ||||
multimedia: Object, | multimedia: Object, | ||||
extras: MultimediaUploadExtras, | extras: MultimediaUploadExtras, | ||||
callbacks: MultimediaUploadCallbacks, | callbacks: MultimediaUploadCallbacks, | ||||
) => Promise<UploadMultimediaResult>, | ) => Promise<UploadMultimediaResult>, | ||||
+sendMultimediaMessage: ( | +sendMultimediaMessage: ( | ||||
threadID: string, | threadID: string, | ||||
localID: string, | localID: string, | ||||
mediaIDs: $ReadOnlyArray<string>, | mediaMessageContents: $ReadOnlyArray<MediaMessageServerDBContent>, | ||||
) => Promise<SendMessageResult>, | ) => Promise<SendMessageResult>, | ||||
+sendTextMessage: ( | +sendTextMessage: ( | ||||
threadID: string, | threadID: string, | ||||
localID: string, | localID: string, | ||||
text: string, | text: string, | ||||
) => Promise<SendMessageResult>, | ) => Promise<SendMessageResult>, | ||||
+newThread: (request: ClientNewThreadRequest) => Promise<NewThreadResult>, | +newThread: (request: ClientNewThreadRequest) => Promise<NewThreadResult>, | ||||
}; | }; | ||||
▲ Show 20 Lines • Show All 185 Lines • ▼ Show 20 Lines | class InputStateContainer extends React.PureComponent<Props, State> { | ||||
async sendMultimediaMessageAction( | async sendMultimediaMessageAction( | ||||
messageInfo: RawMultimediaMessageInfo, | messageInfo: RawMultimediaMessageInfo, | ||||
): Promise<SendMessagePayload> { | ): Promise<SendMessagePayload> { | ||||
const { localID, threadID } = messageInfo; | const { localID, threadID } = messageInfo; | ||||
invariant( | invariant( | ||||
localID !== null && localID !== undefined, | localID !== null && localID !== undefined, | ||||
'localID should be set', | 'localID should be set', | ||||
); | ); | ||||
const mediaIDs = []; | const mediaMessageContents: MediaMessageServerDBContent[] = messageInfo.media.map( | ||||
for (const { id } of messageInfo.media) { | media => { | ||||
mediaIDs.push(id); | if (media.type === 'photo') { | ||||
return { type: 'photo', uploadID: media.id }; | |||||
} else { | |||||
return { | |||||
type: 'video', | |||||
uploadID: media.id, | |||||
thumbnailUploadID: media.thumbnailID, | |||||
}; | |||||
} | } | ||||
}, | |||||
); | |||||
try { | try { | ||||
const result = await this.props.sendMultimediaMessage( | const result = await this.props.sendMultimediaMessage( | ||||
threadID, | threadID, | ||||
localID, | localID, | ||||
mediaIDs, | mediaMessageContents, | ||||
); | ); | ||||
return { | return { | ||||
localID, | localID, | ||||
serverID: result.id, | serverID: result.id, | ||||
threadID, | threadID, | ||||
time: result.time, | time: result.time, | ||||
interface: result.interface, | interface: result.interface, | ||||
}; | }; | ||||
▲ Show 20 Lines • Show All 1,034 Lines • ▼ Show 20 Lines | const ongoingMessageCreation = useSelector( | ||||
combineLoadingStatuses( | combineLoadingStatuses( | ||||
mediaCreationLoadingStatusSelector(state), | mediaCreationLoadingStatusSelector(state), | ||||
textCreationLoadingStatusSelector(state), | textCreationLoadingStatusSelector(state), | ||||
) === 'loading', | ) === 'loading', | ||||
); | ); | ||||
const hasWiFi = useSelector(state => state.connectivity.hasWiFi); | const hasWiFi = useSelector(state => state.connectivity.hasWiFi); | ||||
const calendarQuery = useCalendarQuery(); | const calendarQuery = useCalendarQuery(); | ||||
const callUploadMultimedia = useServerCall(uploadMultimedia); | const callUploadMultimedia = useServerCall(uploadMultimedia); | ||||
const callSendMultimediaMessage = useServerCall( | const callSendMultimediaMessage = useServerCall(sendMultimediaMessage); | ||||
legacySendMultimediaMessage, | |||||
); | |||||
const callSendTextMessage = useServerCall(sendTextMessage); | const callSendTextMessage = useServerCall(sendTextMessage); | ||||
const callNewThread = useServerCall(newThread); | const callNewThread = useServerCall(newThread); | ||||
const dispatchActionPromise = useDispatchActionPromise(); | const dispatchActionPromise = useDispatchActionPromise(); | ||||
const dispatch = useDispatch(); | const dispatch = useDispatch(); | ||||
const mediaReportsEnabled = useIsReportEnabled('mediaReports'); | const mediaReportsEnabled = useIsReportEnabled('mediaReports'); | ||||
return ( | return ( | ||||
<InputStateContainer | <InputStateContainer | ||||
Show All 20 Lines |