Skip to content

Commit

Permalink
feat: add html5 courseware uploading (#1023)
Browse files Browse the repository at this point in the history
* refactor(flat-components): add h5 courseware icons

* feat(desktop): add ice courseware upload

* feat(web): add ice courseware upload

* refactor(web): translate html5 courseware src

* refactor(desktop): translate html5 courseware src

* refactor(web): update query h5 error code
  • Loading branch information
crimx committed Oct 21, 2021
1 parent 189c953 commit 4c25b01
Show file tree
Hide file tree
Showing 19 changed files with 519 additions and 98 deletions.
2 changes: 2 additions & 0 deletions config/.env.development
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ CLOUD_STORAGE_OSS_ALIBABA_ACCESS_KEY=LTAI5t9Gb6tzQzzLmB6cTVf7
CLOUD_STORAGE_OSS_ALIBABA_BUCKET=flat-storage
CLOUD_STORAGE_OSS_ALIBABA_REGION=oss-cn-hangzhou

CLOUD_STORAGE_DOMAIN=https://flat-storage-[region].whiteboard.agora.io

FLAT_SERVER_DOMAIN=flat-api-dev.whiteboard.agora.io
UPDATE_DOMAIN=https://flat-storage.oss-cn-hangzhou.aliyuncs.com/versions
FLAT_WEB_DOMAIN=flat-web-dev.whiteboard.agora.io
Expand Down
2 changes: 2 additions & 0 deletions config/.env.production
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ CLOUD_STORAGE_OSS_ALIBABA_ACCESS_KEY=LTAI5t9Gb6tzQzzLmB6cTVf7
CLOUD_STORAGE_OSS_ALIBABA_BUCKET=flat-storage
CLOUD_STORAGE_OSS_ALIBABA_REGION=oss-cn-hangzhou

CLOUD_STORAGE_DOMAIN=https://flat-storage-[region].whiteboard.agora.io

FLAT_SERVER_DOMAIN=flat-api.whiteboard.agora.io
UPDATE_DOMAIN=https://flat-storage.oss-cn-hangzhou.aliyuncs.com/versions
FLAT_WEB_DOMAIN=flat-web.whiteboard.agora.io
Expand Down
41 changes: 41 additions & 0 deletions desktop/renderer-app/src/api-middleware/h5-converting.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import Axios from "axios";
import { ServerRequestError } from "../utils/error/server-request-error";

export type H5ConvertingStatusType = "Converting" | "Finished" | "Failed";

export type H5ConvertingStatusResultNormal = {
status: Exclude<H5ConvertingStatusType, "Failed">;
error?: undefined;
};

export type H5ConvertingStatusResultFailed = {
status: "Failed";
error: Error;
};

export type H5ConvertingStatusResult =
| H5ConvertingStatusResultNormal
| H5ConvertingStatusResultFailed;

export async function queryH5ConvertingStatus(fileURL: string): Promise<H5ConvertingStatusResult> {
try {
const response = await Axios.head(fileURL.replace(/[^/]+$/, "") + "result");
if (response.headers["x-oss-meta-success"] !== "true") {
const errorCode = Number(response.headers["x-oss-meta-error-code"]);
if (errorCode > 0) {
return {
status: "Failed",
error: new ServerRequestError(errorCode),
};
}
if (response.status >= 200 && response.status < 500) {
return { status: "Converting" };
}
return { status: "Failed", error: new Error(response.statusText) };
}
return { status: "Finished" };
} catch (e) {
console.warn(e);
return { status: "Converting" };
}
}
2 changes: 2 additions & 0 deletions desktop/renderer-app/src/constants/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ export const CLOUD_STORAGE_OSS_ALIBABA_CONFIG = Object.freeze({
region: process.env.CLOUD_STORAGE_OSS_ALIBABA_REGION,
});

export const CLOUD_STORAGE_DOMAIN = process.env.CLOUD_STORAGE_DOMAIN;

export const AGORA = Object.freeze({
APP_ID: process.env.AGORA_APP_ID,
});
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { FileUUID } from "flat-components";

/**
* @returns true: keep polling, false: stop
*/
export type ConvertTask = () => Promise<boolean>;

export class ConvertStatusManager {
private tasks = new Map<FileUUID, { ticket: number; executor: ConvertTask }>();

public hasTask(fileUUID: FileUUID): boolean {
return this.tasks.has(fileUUID);
}

public async addTask(
fileUUID: FileUUID,
executor: ConvertTask,
interval = 1500,
): Promise<void> {
const task = this.tasks.get(fileUUID);
if (task) {
task.executor = executor;
} else if (!(await executor())) {
const ticket = window.setInterval(async () => {
const task = this.tasks.get(fileUUID);
if (!task) {
window.clearInterval(ticket);
} else if (await task.executor()) {
this.cancelTask(fileUUID);
}
}, interval);
this.tasks.set(fileUUID, { executor, ticket });
}
}

public cancelTask(fileUUID: FileUUID): void {
const task = this.tasks.get(fileUUID);
if (task) {
window.clearInterval(task.ticket);
this.tasks.delete(fileUUID);
}
}

public cancelAllTasks(): void {
this.tasks.forEach(task => {
window.clearInterval(task.ticket);
});
this.tasks.clear();
}
}
57 changes: 45 additions & 12 deletions desktop/renderer-app/src/pages/CloudStoragePage/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import { SceneDefinition } from "white-web-sdk";
import { useTranslation } from "react-i18next";
import { RequestErrorCode } from "../../constants/error-code";
import { ServerRequestError } from "../../utils/error/server-request-error";
import { getFileExt } from "../../utils/file";
import { CLOUD_STORAGE_DOMAIN } from "../../constants/process";

export interface CloudStoragePageProps {
compact?: boolean;
Expand Down Expand Up @@ -54,28 +56,33 @@ export const CloudStoragePage = observer<CloudStoragePageProps>(function CloudSt

void message.info(t("Inserting-courseware-tips"));

const ext = (/\.[^.]+$/.exec(file.fileName) || [""])[0].toLowerCase();
const ext = getFileExt(file.fileName);

switch (ext) {
case ".jpg":
case ".jpeg":
case ".png":
case ".webp": {
case "jpg":
case "jpeg":
case "png":
case "webp": {
await insertImage(file);
break;
}
case ".mp3":
case ".mp4": {
case "mp3":
case "mp4": {
insertMediaFile(file);
break;
}
case ".doc":
case ".docx":
case ".ppt":
case ".pptx":
case ".pdf": {
case "doc":
case "docx":
case "ppt":
case "pptx":
case "pdf": {
await insertDocs(file, ext);
break;
}
case "ice": {
await insertIce(file);
break;
}
default: {
console.log(
`[cloud storage]: insert unknown format "${file.fileName}" into whiteboard`,
Expand Down Expand Up @@ -195,4 +202,30 @@ export const CloudStoragePage = observer<CloudStoragePageProps>(function CloudSt
void message.error(t("unable-to-insert-courseware"));
}
}

async function insertIce(file: CloudStorageFile): Promise<void> {
try {
const src =
CLOUD_STORAGE_DOMAIN.replace("[region]", file.region) +
new URL(file.fileURL).pathname.replace(/[^/]+$/, "") +
"ice/index.html";

if (src && whiteboard?.windowManager) {
await whiteboard.windowManager.addApp({
kind: "IframeBridge",
options: {
title: file.fileName,
},
attributes: {
src,
},
});
} else {
void message.error(t("unable-to-insert-courseware"));
}
} catch (e) {
console.error(e);
void message.error(t("unable-to-insert-courseware"));
}
}
});

0 comments on commit 4c25b01

Please sign in to comment.