Skip to content

Commit 102f46d

Browse files
author
Alex Patterson
committed
upload working with snack message
1 parent 7406f29 commit 102f46d

File tree

4 files changed

+72
-7
lines changed

4 files changed

+72
-7
lines changed

frontend/admin/src/components/YouTube/YouTubeUpload.tsx

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
import { red, grey } from '@material-ui/core/colors';
1111

1212
import YouTubeIcon from '@material-ui/icons/YouTube';
13-
import { userYouTubeApiToken } from '@/services/api';
13+
import { uploadVideo, userYouTubeApiToken } from '@/services/api';
1414
import { UserInfoExtended } from '@/models/user.model';
1515
import { useUser } from '@/utils/auth/useUser';
1616
import React, { useEffect, useMemo, useState } from 'react';
@@ -22,6 +22,9 @@ import DialogContent from '@material-ui/core/DialogContent';
2222
import DialogContentText from '@material-ui/core/DialogContentText';
2323
import DialogTitle from '@material-ui/core/DialogTitle';
2424
import DialogActions from '@material-ui/core/DialogActions';
25+
import Snackbar from '@material-ui/core/Snackbar';
26+
27+
import firebase from 'firebase/app';
2528

2629
const useStyles = makeStyles((theme: Theme) =>
2730
createStyles({
@@ -71,7 +74,6 @@ export default function YouTubeUpload(): JSX.Element {
7174
refresh_token: string;
7275
}> | null>(null);
7376
const [open, setOpen] = useState(false);
74-
7577
useEffect(() => {
7678
if (user && user.uid) {
7779
setUserToken$(userYouTubeApiToken(user));
@@ -102,6 +104,38 @@ export default function YouTubeUpload(): JSX.Element {
102104
setOpen(false);
103105
};
104106

107+
const [snackOpen, setSnackOpen] = useState(false);
108+
const [uploadPercentage, setUploadPercentage] = useState(0);
109+
const handleSnackOpen = () => {
110+
setSnackOpen(true);
111+
};
112+
const handleSnackClose = () => {
113+
setSnackOpen(true);
114+
};
115+
116+
const [upload$, setUpload$] = useState<Observable<{
117+
progress: number;
118+
snapshot: firebase.storage.UploadTaskSnapshot;
119+
}> | null>(null);
120+
useEffect(() => {
121+
if (!upload$) {
122+
return;
123+
}
124+
const sub = upload$?.subscribe((u) => {
125+
handleClose();
126+
handleSnackOpen();
127+
setUploadPercentage(u.progress);
128+
console.log('Snapshot', u.snapshot);
129+
});
130+
return () => {
131+
if (sub) sub.unsubscribe();
132+
};
133+
}, [upload$]);
134+
135+
const onUploadVideo = () => {
136+
acceptedFiles.map((file: any) => setUpload$(uploadVideo('/alex', file)));
137+
};
138+
105139
const {
106140
getRootProps,
107141
getInputProps,
@@ -202,11 +236,17 @@ export default function YouTubeUpload(): JSX.Element {
202236
<Button color="secondary" onClick={handleClose}>
203237
Cancel
204238
</Button>
205-
<Button variant="contained" onClick={handleClose}>
206-
Subscribe
239+
<Button variant="contained" onClick={onUploadVideo}>
240+
Upload
207241
</Button>
208242
</DialogActions>
209243
</Dialog>
244+
<Snackbar
245+
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
246+
open={snackOpen}
247+
onClose={handleSnackClose}
248+
message={`Uploading ${uploadPercentage}`}
249+
/>
210250
</>
211251
)}
212252
</>

frontend/admin/src/models/post.model.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export interface CoverMedia {
4040
export enum MediaSource {
4141
video = 'video',
4242
cloudinary = 'cloudinary',
43+
youtube = 'youtube',
4344
}
4445

4546
export enum PostStatus {

frontend/admin/src/services/api.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ import {
88
} from './../models/post.model';
99
import firebase from 'firebase/app';
1010
import initFirebase from '@/utils/initFirebase';
11-
import { docData, collectionData, doc } from 'rxfire/firestore';
11+
import { docData, collectionData } from 'rxfire/firestore';
1212
import { httpsCallable } from 'rxfire/functions';
13-
import { filter, map, switchMap, take } from 'rxjs/operators';
13+
import { getDownloadURL, getMetadata, percentage, put } from 'rxfire/storage';
14+
import { filter, map, switchMap } from 'rxjs/operators';
1415
import { Post, MediaType } from '@/models/post.model';
1516
import { v4 as uuid } from 'uuid';
16-
import { from } from 'rxjs';
17+
import { from, Observable } from 'rxjs';
1718
import { Course, Section } from '@/models/course.model.ts';
1819
import { Cloudinary } from '@/models/cloudinary.model';
1920
import { Video } from '@/models/video.model';
@@ -30,6 +31,12 @@ const functions$ = from(initFirebase()).pipe(
3031
map((app) => app.functions() as firebase.functions.Functions)
3132
);
3233

34+
const storage$ = from(initFirebase()).pipe(
35+
filter((app) => app !== undefined),
36+
map((app) => app as firebase.app.App),
37+
map((app) => app.storage() as firebase.storage.Storage)
38+
);
39+
3340
/* POST */
3441
export const postDataObservable = (path: string) => {
3542
return firestore$.pipe(
@@ -436,3 +443,18 @@ export const deleteUserYouTubeApiToken = (user: UserInfoExtended) => {
436443
})
437444
);
438445
};
446+
447+
export const uploadVideo = (
448+
storagePath: string,
449+
blob: any
450+
): Observable<{
451+
progress: number;
452+
snapshot: firebase.storage.UploadTaskSnapshot;
453+
}> => {
454+
return storage$.pipe(
455+
switchMap((storage) => {
456+
const dataRef = storage.ref(storagePath);
457+
return percentage(dataRef.put(blob));
458+
})
459+
);
460+
};

frontend/admin/src/utils/initFirebase.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default async function initFirebase() {
1313
await import('firebase/remote-config');
1414
await import('firebase/messaging');
1515
await import('firebase/functions');
16+
await import('firebase/storage');
1617
if (!firebase.default.apps.length) {
1718
firebase.default.initializeApp(config);
1819
if (process.env.NEXT_PUBLIC_CCD_EMULATED) {
@@ -29,6 +30,7 @@ export default async function initFirebase() {
2930
firebase.default.analytics();
3031
firebase.default.remoteConfig();
3132
firebase.default.messaging();
33+
firebase.default.storage();
3234
}
3335
return firebase.default.app();
3436
} catch (err) {

0 commit comments

Comments
 (0)