olympus-r-17plugins
Version:
A plugin of Olympus for 17zuoye.
539 lines (538 loc) • 20.2 kB
JavaScript
import * as tslib_1 from "tslib";
import { core } from "olympus-r/core/Core";
import { audioManager } from "olympus-r/engine/audio/AudioManager";
import AudioMessage from "olympus-r/engine/audio/AudioMessage";
import { bridgeManager } from "olympus-r/engine/bridge/BridgeManager";
import Shell from "olympus-r/engine/env/Shell";
import Dictionary from 'olympus-r/utils/Dictionary';
import { cloneObject, extendObject } from "olympus-r/utils/ObjectUtil";
import { getQueryParams, joinQueryParams } from "olympus-r/utils/URLUtil";
import { environment17, Network } from "./Environment17";
var Shell17 = /** @class */ (function (_super) {
tslib_1.__extends(Shell17, _super);
function Shell17() {
return _super !== null && _super.apply(this, arguments) || this;
}
Object.defineProperty(Shell17.prototype, "type", {
get: function () {
return "17zuoye";
},
enumerable: true,
configurable: true
});
Object.defineProperty(Shell17.prototype, "platform", {
get: function () {
return Platform.WEB;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Shell17.prototype, "clientType", {
get: function () {
return ClientType.UNKNOWN;
},
enumerable: true,
configurable: true
});
/**
* 初始化一起作业外壳
*
* @memberof Shell17
*/
Shell17.prototype.initShell17 = function () {
this.initAudio();
};
/**
* 调用外壳通过window.external传递进来的接口
*
* @param {string} funcName 接口名
* @param {...any[]} paramsList 参数列表
* @returns {*}
*/
Shell17.prototype.callExternal = function (funcName) {
var paramsList = [];
for (var _i = 1; _i < arguments.length; _i++) {
paramsList[_i - 1] = arguments[_i];
}
console.log("原生浏览器端不提供该方法实现");
return new Promise(function (resolve, reject) { resolve(); });
};
Shell17.prototype.getInitParams = function (refresh) {
var _this = this;
return new Promise(function (resolve, reject) {
if (refresh || _this._initParams == null) {
var temp = {
client_type: "pc",
client_name: "17PC",
network: Network.PC,
};
_this._initParams = _this.mergeInitParams(temp);
}
resolve(_this._initParams);
});
};
// 合并 getInitParams 和 url上的参数,url优先
Shell17.prototype.mergeInitParams = function (result) {
var params = {};
var query = getQueryParams(window.location.href);
extendObject(params, result);
extendObject(params, query);
return params;
};
Shell17.prototype.innerJump = function (name) {
console.log("原生浏览器端不提供该方法实现");
};
Shell17.prototype.homeworkHTMLLoaded = function () {
console.log("原生浏览器端不提供该方法实现");
};
Shell17.prototype.updateTitle = function (str, txtColor, bgColor) {
document.title = str;
};
Shell17.prototype.redirectToLogin = function (from) {
this.getInitParams().then(function (params) {
window.location.href = params.domain;
});
};
Shell17.prototype.openFairylandPage = function (params) {
var initParams = cloneObject(this.getInitParams());
initParams = extendObject(initParams, params.initParams);
var url = joinQueryParams(params.url, initParams);
window.open(url, params.name);
};
Shell17.prototype.pageQueueNew = function (params) {
var initParams = cloneObject(this.getInitParams());
initParams = extendObject(initParams, params.initParams);
var url = joinQueryParams(params.url, initParams);
window.open(url, params.name);
};
Shell17.prototype.pageQueueBack = function (params) {
// 原生浏览器上因为无法执行后退,直接套用pageQueueNew
params.url = params.url || window.location.href;
params.name = params.name || new Date().getTime().toString();
this.pageQueueNew(params);
};
Shell17.prototype.pageQueueRefresh = function (params) {
if (params && params.url) {
// 如果传递了url,则跳转
var initParams = cloneObject(this.getInitParams());
initParams = extendObject(initParams, params.initParams);
var url = joinQueryParams(params.url, initParams);
window.location.href = url;
}
else {
// 没有传递url,则只刷新
window.location.reload(true);
}
};
Shell17.prototype.pageQueueQuit = function (params) {
window.close();
};
Shell17.prototype.disMissView = function () {
window.close();
};
Shell17.prototype.showlog = function (msg) {
console.log(msg);
};
Shell17.prototype.log_b = function (data) {
var oriData = {
appName: navigator.appName,
appCodeName: navigator.appCodeName,
appVersion: navigator.appVersion,
os: navigator.platform,
network: navigator.onLine,
time: new Date().toLocaleString(),
type: "log_normal",
use_proxy: false,
user_agent: navigator.userAgent,
wifi_info: null
};
extendObject(oriData, data);
var url = joinQueryParams(window.location.protocol + "//log.17zuoye.cn/log", {
_c: "app_17homework_pc:normal",
_l: 3,
_t: Date.now(),
_log: encodeURIComponent(JSON.stringify(oriData))
});
// 在网页上添加一个url是上面的img标签
var img = document.createElement("img");
img.src = url;
img.style.display = "none";
document.body.appendChild(img);
};
Shell17.prototype.payOrder = function (params) {
console.log("原生浏览器端不提供该方法实现");
};
/**
* 触发外壳事件
*
* @param {string} type 事件类型
* @param {...any[]} args 事件参数列表
* @memberof Shell17
*/
Shell17.prototype.trigger = function (type) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
// 包装为一个CustomEvent
var event = new CustomEvent("_17m." + type, { detail: args });
// 直接在document中派发
document.dispatchEvent(event);
};
/**
* 添加外壳监听
*
* @param {string} type 监听类型
* @param {(...args:any[])=>void} handler 处理函数
* @param {boolean} [once=false] 是否一次性监听
* @memberof Shell17
*/
Shell17.prototype.bindTrigger = function (type, handler, once) {
var _this = this;
if (once === void 0) { once = false; }
var wrapper = function (event) {
// 如果是一次性监听则移除监听
if (once)
_this.unbindTrigger(type, handler);
// 获取参数
var detail = event.detail;
// 调用回调
if (detail instanceof Array)
handler.call.apply(handler, [_this].concat(detail));
else
handler.call(_this, detail);
};
document.addEventListener("_17m." + type, wrapper, false);
// 将包装方法记录到原始方法上(偷个懒)
handler["__bindTrigger_wrapper_" + type + "__"] = wrapper;
};
/**
* 移除外壳监听
*
* @param {string} type 监听类型
* @param {(...args:any[])=>void} handler 处理函数
* @memberof Shell17
*/
Shell17.prototype.unbindTrigger = function (type, handler) {
var wrapper = handler["__bindTrigger_wrapper_" + type + "__"];
if (wrapper) {
document.removeEventListener("_17m." + type, wrapper, false);
delete handler["__bindTrigger_wrapper_" + type + "__"];
}
};
Shell17.prototype.hasGPU = function (callback) {
// 原生浏览器使用自动判断GPU
callback(GPUStatus.AUTO);
};
Shell17.prototype.startRecord = function (params) {
console.log("原生浏览器端不提供该方法实现");
};
Shell17.prototype.stopRecord = function (params) {
console.log("原生浏览器端不提供该方法实现");
};
Shell17.prototype.startPlayback = function (params) {
console.log("原生浏览器端不提供该方法实现");
};
Shell17.prototype.stopPlayback = function (params) {
console.log("原生浏览器端不提供该方法实现");
};
/*************************** 下面是本地存储接口 ***************************/
/**
* 获取本地存储
*
* @param {string} key 要获取值的键
* @returns {string} 获取的值
* @memberof Shell
*/
Shell17.prototype.localStorageGet = function (key) {
var storageKey = environment17.env + "." + environment17.app + ":" + key;
return _super.prototype.localStorageGet.call(this, storageKey);
};
/**
* 设置本地存储
*
* @param {string} key 要设置的键
* @param {string} value 要设置的值
* @memberof Shell
*/
Shell17.prototype.localStorageSet = function (key, value) {
var storageKey = environment17.env + "." + environment17.app + ":" + key;
_super.prototype.localStorageSet.call(this, storageKey, value);
};
/**
* 移除本地存储
*
* @param {string} key 要移除的键
* @memberof Shell
*/
Shell17.prototype.localStorageRemove = function (key) {
var storageKey = environment17.env + "." + environment17.app + ":" + key;
_super.prototype.localStorageRemove.call(this, storageKey);
};
/**
* 清空本地存储
*
* @memberof Shell
*/
Shell17.prototype.localStorageClear = function () {
_super.prototype.localStorageClear.call(this);
};
/*************************** 下面是音频接口 ***************************/
Shell17.prototype.initAudio = function () {
core.listen(AudioMessage.AUDIO_PLAY_STARTED, function () {
});
core.listen(AudioMessage.AUDIO_PLAY_PROGRESS, function (url, curTime, totalTime) {
try {
window["vox"] &&
vox.task &&
vox.task.playAudioProgress &&
vox.task.playAudioProgress(url, "playing", curTime * 0.001, totalTime * 0.001);
// 转发事件
core.dispatch("playAudioProgress", url, "playing", curTime * 0.001, totalTime * 0.001);
}
catch (err) {
}
});
core.listen(AudioMessage.AUDIO_PLAY_STOPPED, function (url) {
try {
window["vox"] &&
vox.task &&
vox.task.playAudioProgress &&
vox.task.playAudioProgress(url, "paused");
// 转发事件
core.dispatch("playAudioProgress", url, "paused");
}
catch (err) {
}
});
core.listen(AudioMessage.AUDIO_PLAY_ENDED, function (url) {
try {
window["vox"] &&
vox.task &&
vox.task.playAudioProgress &&
vox.task.playAudioProgress(url, "ended");
// 转发事件
core.dispatch("playAudioProgress", url, "ended");
}
catch (err) {
}
});
};
/**
* 开始下载音频
*
* @param {string} url 音频地址
* @memberof Shell17
*/
Shell17.prototype.loadAudio = function (url) {
audioManager.loadSound(url);
try {
window["vox"] &&
vox.task &&
vox.task.loadAudioProgress &&
vox.task.loadAudioProgress(url, "init", 0, 1);
// 转发事件
core.dispatch("loadAudioProgress", url, "init", 0, 1);
window["vox"] &&
vox.task &&
vox.task.loadAudioProgress &&
vox.task.loadAudioProgress(url, "loading", 0.5, 1);
// 转发事件
core.dispatch("loadAudioProgress", url, "loading", 0.5, 1);
window["vox"] &&
vox.task &&
vox.task.loadAudioProgress &&
vox.task.loadAudioProgress(url, "loaded", 1, 1);
// 转发事件
core.dispatch("loadAudioProgress", url, "loaded", 1, 1);
}
catch (err) {
}
};
/**
* 开始播放音频
*
* @param {string} url 音频地址
* @memberof Shell17
*/
Shell17.prototype.playAudio = function (url) {
audioManager.playSound({ url: url });
};
/**
* 暂停播放音频
*
* @param {string} url 音频地址
* @memberof Shell17
*/
Shell17.prototype.pauseAudio = function (url) {
try {
window["vox"] &&
vox.task &&
vox.task.playAudioProgress &&
vox.task.playAudioProgress(url, "stop");
// 转发事件
core.dispatch("playAudioProgress", url, "stop");
}
catch (err) {
}
audioManager.pauseSound(url);
};
/**
* 音频跳转到指定位置
*
* @param {string} url 音频地址
* @param {number} time 跳转位置(毫秒)
* @memberof Shell17
*/
Shell17.prototype.seekAudio = function (url, time) {
audioManager.seekSound(url, time);
};
/**
* 停止播放音频
*
* @param {string} url 音频地址
* @memberof Shell17
*/
Shell17.prototype.stopAudio = function (url) {
try {
window["vox"] &&
vox.task &&
vox.task.playAudioProgress &&
vox.task.playAudioProgress(url, "stop");
// 转发事件
core.dispatch("playAudioProgress", url, "stop");
}
catch (err) {
}
audioManager.stopSound(url);
};
/*************************** 下面是视频接口 ***************************/
Shell17.prototype.playerVideo = function (params) {
var _this = this;
// 创建一个简单的关闭按钮
var btnClose = document.createElement("div");
btnClose.style.position = "relative";
btnClose.style.color = "#4789f2";
btnClose.style.fontSize = "2rem";
btnClose.style.fontWeight = "bold";
btnClose.style.paddingRight = "1rem";
btnClose.style.textAlign = "right";
btnClose.textContent = "x";
document.body.appendChild(btnClose);
// 创建一个video标签
var video = document.createElement("video");
video.style.position = "relative";
video.style.width = document.body.clientWidth + "px";
video.style.height = "calc(" + document.body.clientHeight + "px - 3rem)";
video.src = environment17.toCDNHostURL(params.urlList[0]);
video.controls = true;
video.autoplay = true;
document.body.appendChild(video);
// 隐藏当前所有的显示
var bridgeDict = new Dictionary();
for (var _i = 0, _a = bridgeManager.bridges; _i < _a.length; _i++) {
var bridge = _a[_i];
// 暂存显示状态
bridgeDict.set(bridge, bridge.htmlWrapper.style.display);
// 暂时设置为隐藏
bridge.htmlWrapper.style.display = "none";
}
// 添加window.resize事件
var resizeHandler = function () {
video.style.width = document.body.clientWidth + "px";
video.style.height = "calc(" + document.body.clientHeight + "px - 3rem)";
};
window.addEventListener("resize", resizeHandler);
// 添加关闭监听
var closeHandler = function () {
// 移除事件
window.removeEventListener("resize", resizeHandler);
btnClose.removeEventListener("click", closeHandler);
// 移除显示
video.pause();
video.parentElement && video.parentElement.removeChild(video);
btnClose.parentElement && btnClose.parentElement.removeChild(btnClose);
// 恢复所有桥的显示
bridgeDict.forEach(function (bridge, value) {
bridge.htmlWrapper.style.display = value;
});
// 派发外壳事件
_this.trigger("playVideoProgress", {
url: params.urlList[0],
state: "unload",
currentTime: video.currentTime,
duration: video.duration
});
};
btnClose.addEventListener("click", closeHandler);
// 模仿外壳,添加视频播放事件
video.onloadeddata = function () {
_this.trigger("playVideoProgress", {
url: params.urlList[0],
state: "init",
currentTime: video.currentTime,
duration: video.duration
});
};
video.ontimeupdate = function () {
if (!video.paused) {
_this.trigger("playVideoProgress", {
url: params.urlList[0],
state: "playing",
currentTime: video.currentTime,
duration: video.duration
});
}
};
video.onpause = function () {
_this.trigger("playVideoProgress", {
url: params.urlList[0],
state: "paused",
currentTime: video.currentTime,
duration: video.duration
});
};
video.onended = function () {
_this.trigger("playVideoProgress", {
url: params.urlList[0],
state: "ended",
currentTime: video.currentTime,
duration: video.duration
});
};
video.onerror = function () {
_this.trigger("playVideoProgress", {
url: params.urlList[0],
state: "error",
currentTime: video.currentTime,
duration: video.duration
});
};
};
return Shell17;
}(Shell));
export default Shell17;
/**
* GPU开启状态
*/
export var GPUStatus;
(function (GPUStatus) {
GPUStatus[GPUStatus["AUTO"] = 0] = "AUTO";
GPUStatus[GPUStatus["OPEN"] = 1] = "OPEN";
GPUStatus[GPUStatus["CLOSE"] = 2] = "CLOSE";
})(GPUStatus || (GPUStatus = {}));
export var Platform;
(function (Platform) {
Platform[Platform["WEB"] = 0] = "WEB";
Platform[Platform["IOS17"] = 1] = "IOS17";
Platform[Platform["Android17"] = 2] = "Android17";
Platform[Platform["WXApp"] = 3] = "WXApp";
})(Platform || (Platform = {}));
export var ClientType;
(function (ClientType) {
ClientType[ClientType["UNKNOWN"] = 0] = "UNKNOWN";
ClientType[ClientType["STUDENT"] = 1] = "STUDENT";
ClientType[ClientType["TEACHER"] = 2] = "TEACHER";
ClientType[ClientType["PARENT"] = 3] = "PARENT";
ClientType[ClientType["YUNKETANG"] = 4] = "YUNKETANG";
})(ClientType || (ClientType = {}));