UNPKG

olympus-r-17plugins

Version:

A plugin of Olympus for 17zuoye.

539 lines (538 loc) 20.2 kB
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 = {}));