aboutsummaryrefslogtreecommitdiff
path: root/src/store
diff options
context:
space:
mode:
authorShravya Ramesh <37447613+shravyaramesh@users.noreply.github.com>2021-07-23 16:01:16 -0700
committerGitHub <noreply@github.com>2021-07-23 16:01:16 -0700
commit93b0bdb6d5d3070ece012626f9d9d6634f0eb0d8 (patch)
treede1aab12445184023db6b7f1e5dce94e8416d233 /src/store
parent6fcfb36b37dd51d3e9d5baf025b896cc6f6045ee (diff)
parent2f64db843b80229d08f8f0ae7e1d80b24ac38c12 (diff)
Merge branch 'master' into tma936-pause-video
Diffstat (limited to 'src/store')
-rw-r--r--src/store/actions/user.ts98
-rw-r--r--src/store/initialStates.ts2
-rw-r--r--src/store/reducers/userReducer.ts5
3 files changed, 103 insertions, 2 deletions
diff --git a/src/store/actions/user.ts b/src/store/actions/user.ts
index b1cb8719..1acbb519 100644
--- a/src/store/actions/user.ts
+++ b/src/store/actions/user.ts
@@ -1,13 +1,21 @@
import AsyncStorage from '@react-native-community/async-storage';
-import {StreamChat} from 'stream-chat';
import {Action, ThunkAction} from '@reduxjs/toolkit';
+import {StreamChat} from 'stream-chat';
import {
getProfilePic,
+ handlePresignedURL,
+ handleVideoUpload,
loadProfileInfo,
+ postMomentTags,
removeBadgesService,
sendSuggestedPeopleLinked,
} from '../../services';
-import {UniversityBadge, UserType} from '../../types/types';
+import {
+ MomentUploadProgressBarType,
+ MomentUploadStatusType,
+ UniversityBadge,
+ UserType,
+} from '../../types/types';
import {getTokenOrLogout} from '../../utils';
import {
clearHeaderAndProfileImages,
@@ -15,6 +23,7 @@ import {
profileBadgesUpdated,
profileCompletionStageUpdated,
setIsOnboardedUser,
+ setMomentUploadProgressBar,
setNewNotificationReceived,
setNewVersionAvailable,
setReplyPosted,
@@ -275,3 +284,88 @@ export const suggestedPeopleAnimatedTutorialFinished =
);
}
};
+
+/**
+ * state is now UploadingToS3:
+ * - get presigned url (backend creates the moment object)
+ * - upload moment tags
+ * - upload video to s3
+ * state is now WaitingForDoneProcessing
+ */
+export const handleVideoMomentUpload =
+ (
+ videoUri: string,
+ videoLength: number,
+ momentCategory: string,
+ formattedTags: {
+ x: number;
+ y: number;
+ z: number;
+ user_id: string;
+ }[],
+ ): ThunkAction<Promise<void>, RootState, unknown, Action<string>> =>
+ async (dispatch) => {
+ try {
+ const handleError = (reason: string) => {
+ console.error('Moment video upload failed,', reason);
+ dispatch({
+ type: setMomentUploadProgressBar.type,
+ payload: {
+ momentUploadProgressBar: {
+ ...momentUploadProgressBar,
+ status: MomentUploadStatusType.Error,
+ },
+ },
+ });
+ };
+ let momentUploadProgressBar: MomentUploadProgressBarType = {
+ status: MomentUploadStatusType.UploadingToS3,
+ momentId: '',
+ originalVideoDuration: videoLength,
+ };
+ // set progress bar as loading
+ dispatch({
+ type: setMomentUploadProgressBar.type,
+ payload: {momentUploadProgressBar},
+ });
+ // get a presigned url for the video
+ const presignedURLResponse = await handlePresignedURL(momentCategory);
+ if (!presignedURLResponse) {
+ handleError('Presigned URL failed');
+ return;
+ }
+ const momentId = presignedURLResponse.moment_id;
+ const fileHash = presignedURLResponse.response_url.fields.key;
+ // upload moment tags, now that we have a moment id
+ const momentTagResponse = await postMomentTags(momentId, formattedTags);
+ if (!momentTagResponse) {
+ handleError('Upload moment tags failed');
+ return;
+ }
+ if (!fileHash) {
+ handleError('Unable to parse file hash from presigned response');
+ return;
+ }
+ // upload video to s3
+ const videoUploadResponse = await handleVideoUpload(
+ videoUri,
+ presignedURLResponse,
+ );
+ if (!videoUploadResponse) {
+ handleError('Video upload failed');
+ return;
+ }
+ dispatch({
+ type: setMomentUploadProgressBar.type,
+ payload: {
+ momentUploadProgressBar: {
+ ...momentUploadProgressBar,
+ status: MomentUploadStatusType.WaitingForDoneProcessing,
+ momentId,
+ },
+ },
+ });
+ } catch (error) {
+ console.log(error);
+ }
+ };
diff --git a/src/store/initialStates.ts b/src/store/initialStates.ts
index 92a1e456..7d8cf439 100644
--- a/src/store/initialStates.ts
+++ b/src/store/initialStates.ts
@@ -10,6 +10,7 @@ import {
import {
CommentThreadType,
MomentPostType,
+ MomentUploadProgressBarType,
UniversityType,
} from './../types/types';
@@ -48,6 +49,7 @@ export const NO_USER_DATA = {
profile: <ProfileInfoType>NO_PROFILE,
avatar: <string | undefined>undefined,
cover: <string | undefined>undefined,
+ momentUploadProgressBar: <MomentUploadProgressBarType | undefined>undefined,
isOnboardedUser: false,
newVersionAvailable: false,
newNotificationReceived: false,
diff --git a/src/store/reducers/userReducer.ts b/src/store/reducers/userReducer.ts
index 4692c5d3..617c60be 100644
--- a/src/store/reducers/userReducer.ts
+++ b/src/store/reducers/userReducer.ts
@@ -85,6 +85,10 @@ const userDataSlice = createSlice({
state.avatar = '';
state.cover = '';
},
+
+ setMomentUploadProgressBar: (state, action) => {
+ state.momentUploadProgressBar = action.payload.momentUploadProgressBar;
+ },
},
});
@@ -102,5 +106,6 @@ export const {
clearHeaderAndProfileImages,
profileBadgesUpdated,
profileBadgeRemoved,
+ setMomentUploadProgressBar,
} = userDataSlice.actions;
export const userDataReducer = userDataSlice.reducer;