1e484b35bSopenharmony_ci/* 2e484b35bSopenharmony_ci * Licensed to the Apache Software Foundation (ASF) under one 3e484b35bSopenharmony_ci * or more contributor license agreements. See the NOTICE file 4e484b35bSopenharmony_ci * distributed with this work for additional information 5e484b35bSopenharmony_ci * regarding copyright ownership. The ASF licenses this file 6e484b35bSopenharmony_ci * to you under the Apache License, Version 2.0 (the 7e484b35bSopenharmony_ci * "License"); you may not use this file except in compliance 8e484b35bSopenharmony_ci * with the License. You may obtain a copy of the License at 9e484b35bSopenharmony_ci * 10e484b35bSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 11e484b35bSopenharmony_ci * 12e484b35bSopenharmony_ci * Unless required by applicable law or agreed to in writing, 13e484b35bSopenharmony_ci * software distributed under the License is distributed on an 14e484b35bSopenharmony_ci * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15e484b35bSopenharmony_ci * KIND, either express or implied. See the License for the 16e484b35bSopenharmony_ci * specific language governing permissions and limitations 17e484b35bSopenharmony_ci * under the License. 18e484b35bSopenharmony_ci */ 19e484b35bSopenharmony_ci 20e484b35bSopenharmony_ciimport { Log } from '../../utils/index'; 21e484b35bSopenharmony_ciimport Watcher from '../reactivity/watcher'; 22e484b35bSopenharmony_ciimport Element from '../../vdom/Element'; 23e484b35bSopenharmony_ciimport Vm from './index'; 24e484b35bSopenharmony_ci 25e484b35bSopenharmony_ci/** 26e484b35bSopenharmony_ci * Enum for Page lifecycle hooks. 27e484b35bSopenharmony_ci * @enum {string} 28e484b35bSopenharmony_ci * @readonly 29e484b35bSopenharmony_ci */ 30e484b35bSopenharmony_ci/* eslint-disable no-unused-vars */ 31e484b35bSopenharmony_ciexport const enum PageLifecycleHooks { 32e484b35bSopenharmony_ci /** 33e484b35bSopenharmony_ci * ONINIT Type 34e484b35bSopenharmony_ci */ 35e484b35bSopenharmony_ci ONINIT = 'onInit', 36e484b35bSopenharmony_ci /** 37e484b35bSopenharmony_ci * ONREADY Type 38e484b35bSopenharmony_ci */ 39e484b35bSopenharmony_ci ONREADY = 'onReady', 40e484b35bSopenharmony_ci /** 41e484b35bSopenharmony_ci * ONSHOW Type 42e484b35bSopenharmony_ci */ 43e484b35bSopenharmony_ci ONSHOW = 'onShow', 44e484b35bSopenharmony_ci /** 45e484b35bSopenharmony_ci * ONHIDE Type 46e484b35bSopenharmony_ci */ 47e484b35bSopenharmony_ci ONHIDE = 'onHide', 48e484b35bSopenharmony_ci /** 49e484b35bSopenharmony_ci * ONBACKPRESS Type 50e484b35bSopenharmony_ci */ 51e484b35bSopenharmony_ci ONBACKPRESS = 'onBackPress', 52e484b35bSopenharmony_ci /** 53e484b35bSopenharmony_ci * ONMENUPRESS Type 54e484b35bSopenharmony_ci */ 55e484b35bSopenharmony_ci ONMENUPRESS = 'onMenuPress', 56e484b35bSopenharmony_ci /** 57e484b35bSopenharmony_ci * ONMENUBUTTONPRESS Type 58e484b35bSopenharmony_ci */ 59e484b35bSopenharmony_ci ONMENUBUTTONPRESS = 'onMenuButtonPress', 60e484b35bSopenharmony_ci /** 61e484b35bSopenharmony_ci * ONSUSPENDED Type 62e484b35bSopenharmony_ci */ 63e484b35bSopenharmony_ci ONSUSPENDED = 'onSuspended', 64e484b35bSopenharmony_ci /** 65e484b35bSopenharmony_ci * ONSTARTCONTINUATUIN Type 66e484b35bSopenharmony_ci */ 67e484b35bSopenharmony_ci ONSTARTCONTINUATUIN = 'onStartContinuation', 68e484b35bSopenharmony_ci /** 69e484b35bSopenharmony_ci * ONCOMPLETECONTINUATION Type 70e484b35bSopenharmony_ci */ 71e484b35bSopenharmony_ci ONCOMPLETECONTINUATION = 'onCompleteContinuation', 72e484b35bSopenharmony_ci /** 73e484b35bSopenharmony_ci * ONSAVEDATA Type 74e484b35bSopenharmony_ci */ 75e484b35bSopenharmony_ci ONSAVEDATA = 'onSaveData', 76e484b35bSopenharmony_ci /** 77e484b35bSopenharmony_ci * ONRESTOREDATA Type 78e484b35bSopenharmony_ci */ 79e484b35bSopenharmony_ci ONRESTOREDATA = 'onRestoreData', 80e484b35bSopenharmony_ci /** 81e484b35bSopenharmony_ci * ONNEWREQUEST Type 82e484b35bSopenharmony_ci */ 83e484b35bSopenharmony_ci ONNEWREQUEST = 'onNewRequest', 84e484b35bSopenharmony_ci /** 85e484b35bSopenharmony_ci * ONCONFIGURATIONUPDATED Type 86e484b35bSopenharmony_ci */ 87e484b35bSopenharmony_ci ONCONFIGURATIONUPDATED = 'onConfigurationUpdated', 88e484b35bSopenharmony_ci /** 89e484b35bSopenharmony_ci * ONLAYOUTREADY Type 90e484b35bSopenharmony_ci */ 91e484b35bSopenharmony_ci ONLAYOUTREADY = 'onLayoutReady', 92e484b35bSopenharmony_ci /** 93e484b35bSopenharmony_ci * ONACTIVE Type 94e484b35bSopenharmony_ci */ 95e484b35bSopenharmony_ci ONACTIVE = 'onActive', 96e484b35bSopenharmony_ci /** 97e484b35bSopenharmony_ci * ONLAYOUTREADY Type 98e484b35bSopenharmony_ci */ 99e484b35bSopenharmony_ci ONINACTIVE = 'onInactive', 100e484b35bSopenharmony_ci /** 101e484b35bSopenharmony_ci * ONDIALOGUPDATED Type 102e484b35bSopenharmony_ci */ 103e484b35bSopenharmony_ci ONDIALOGUPDATED = 'onDialogUpdated' 104e484b35bSopenharmony_ci} 105e484b35bSopenharmony_ci/* eslint-enable no-unused-vars */ 106e484b35bSopenharmony_ci 107e484b35bSopenharmony_ciconst PAGE_LIFE_CYCLE_TYPES: Array<PageLifecycleHooks> = [ 108e484b35bSopenharmony_ci PageLifecycleHooks.ONSHOW, 109e484b35bSopenharmony_ci PageLifecycleHooks.ONHIDE, 110e484b35bSopenharmony_ci PageLifecycleHooks.ONBACKPRESS, 111e484b35bSopenharmony_ci PageLifecycleHooks.ONMENUPRESS, 112e484b35bSopenharmony_ci PageLifecycleHooks.ONMENUBUTTONPRESS, 113e484b35bSopenharmony_ci PageLifecycleHooks.ONSTARTCONTINUATUIN, 114e484b35bSopenharmony_ci PageLifecycleHooks.ONCOMPLETECONTINUATION, 115e484b35bSopenharmony_ci PageLifecycleHooks.ONSAVEDATA, 116e484b35bSopenharmony_ci PageLifecycleHooks.ONRESTOREDATA, 117e484b35bSopenharmony_ci PageLifecycleHooks.ONNEWREQUEST, 118e484b35bSopenharmony_ci PageLifecycleHooks.ONCONFIGURATIONUPDATED, 119e484b35bSopenharmony_ci PageLifecycleHooks.ONLAYOUTREADY, 120e484b35bSopenharmony_ci PageLifecycleHooks.ONACTIVE, 121e484b35bSopenharmony_ci PageLifecycleHooks.ONINACTIVE, 122e484b35bSopenharmony_ci PageLifecycleHooks.ONDIALOGUPDATED 123e484b35bSopenharmony_ci]; 124e484b35bSopenharmony_ci 125e484b35bSopenharmony_ci/** 126e484b35bSopenharmony_ci * Bind page lifeCycle. 127e484b35bSopenharmony_ci * @param {Vm} vm - Vm object. 128e484b35bSopenharmony_ci * @param {Element} element - Element object. 129e484b35bSopenharmony_ci */ 130e484b35bSopenharmony_ciexport function bindPageLifeCycle(vm: Vm, element: Element): void { 131e484b35bSopenharmony_ci const options = vm._vmOptions || {}; 132e484b35bSopenharmony_ci PAGE_LIFE_CYCLE_TYPES.forEach(type => { 133e484b35bSopenharmony_ci let eventType; 134e484b35bSopenharmony_ci if (type === PageLifecycleHooks.ONSHOW) { 135e484b35bSopenharmony_ci eventType = 'viewappear'; 136e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONHIDE) { 137e484b35bSopenharmony_ci eventType = 'viewdisappear'; 138e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONBACKPRESS) { 139e484b35bSopenharmony_ci eventType = 'clickbackitem'; 140e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONSUSPENDED) { 141e484b35bSopenharmony_ci eventType = 'viewsuspended'; 142e484b35bSopenharmony_ci } else if (type === 'onConfigurationUpdated') { 143e484b35bSopenharmony_ci eventType = 'onConfigurationUpdated'; 144e484b35bSopenharmony_ci } else if (type === 'onLayoutReady') { 145e484b35bSopenharmony_ci eventType = 'layoutReady'; 146e484b35bSopenharmony_ci } else if (type === 'onActive') { 147e484b35bSopenharmony_ci eventType = 'viewactive'; 148e484b35bSopenharmony_ci } else if (type === 'onInactive') { 149e484b35bSopenharmony_ci eventType = 'viewinactive'; 150e484b35bSopenharmony_ci } else { 151e484b35bSopenharmony_ci eventType = type; 152e484b35bSopenharmony_ci } 153e484b35bSopenharmony_ci 154e484b35bSopenharmony_ci const handle = options[type]; 155e484b35bSopenharmony_ci let isEmitEvent = false; 156e484b35bSopenharmony_ci if (handle) { 157e484b35bSopenharmony_ci isEmitEvent = true; 158e484b35bSopenharmony_ci element.addEvent(eventType, eventHandle); 159e484b35bSopenharmony_ci } else { 160e484b35bSopenharmony_ci if (type === PageLifecycleHooks.ONSHOW || type === PageLifecycleHooks.ONHIDE) { 161e484b35bSopenharmony_ci element.addEvent(eventType, eventHandle); 162e484b35bSopenharmony_ci } 163e484b35bSopenharmony_ci } 164e484b35bSopenharmony_ci 165e484b35bSopenharmony_ci /** 166e484b35bSopenharmony_ci * Hadle event methods. 167e484b35bSopenharmony_ci * @param {*} event - Event methods. 168e484b35bSopenharmony_ci * @param {*} args - Arg list. 169e484b35bSopenharmony_ci * @return {*} 170e484b35bSopenharmony_ci */ 171e484b35bSopenharmony_ci function eventHandle(event, ...args: any[]): any { 172e484b35bSopenharmony_ci if (type === PageLifecycleHooks.ONSHOW) { 173e484b35bSopenharmony_ci emitSubVmLife(vm, 'onPageShow'); 174e484b35bSopenharmony_ci vm._visible = true; 175e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONHIDE) { 176e484b35bSopenharmony_ci emitSubVmLife(vm, 'onPageHide'); 177e484b35bSopenharmony_ci vm._visible = false; 178e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONCONFIGURATIONUPDATED) { 179e484b35bSopenharmony_ci return vm.$emitDirect(`hook:${type}`, ...args); 180e484b35bSopenharmony_ci } 181e484b35bSopenharmony_ci 182e484b35bSopenharmony_ci Log.debug(`EventHandle: isEmitEvent = ${isEmitEvent}, event = ${event}, args = ${JSON.stringify(args)}.`); 183e484b35bSopenharmony_ci if (isEmitEvent) { 184e484b35bSopenharmony_ci if (type === PageLifecycleHooks.ONNEWREQUEST) { 185e484b35bSopenharmony_ci return handleNewRequest(args[0]); 186e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONSAVEDATA) { 187e484b35bSopenharmony_ci return handleSaveData(); 188e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONRESTOREDATA) { 189e484b35bSopenharmony_ci return handleRestoreData(args[0]); 190e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONCOMPLETECONTINUATION) { 191e484b35bSopenharmony_ci return vm.$emitDirect(`hook:${type}`, ...args); 192e484b35bSopenharmony_ci } else if (type === PageLifecycleHooks.ONDIALOGUPDATED) { 193e484b35bSopenharmony_ci return vm.$emitDirect(`hook:${type}`, args[0]); 194e484b35bSopenharmony_ci } else { 195e484b35bSopenharmony_ci return vm.$emit(`hook:${type}`, {}, ...args); 196e484b35bSopenharmony_ci } 197e484b35bSopenharmony_ci } 198e484b35bSopenharmony_ci } 199e484b35bSopenharmony_ci 200e484b35bSopenharmony_ci /** 201e484b35bSopenharmony_ci * Handle saveData. 202e484b35bSopenharmony_ci * @return {string | boolean} If no hook, return false. Otherwise return vm.shareData. 203e484b35bSopenharmony_ci */ 204e484b35bSopenharmony_ci function handleSaveData(): string | boolean { 205e484b35bSopenharmony_ci const allData = { 206e484b35bSopenharmony_ci saveData: {}, 207e484b35bSopenharmony_ci shareData: {} 208e484b35bSopenharmony_ci }; 209e484b35bSopenharmony_ci const result = vm.$emitDirect(`hook:${type}`, allData.saveData); 210e484b35bSopenharmony_ci if (!result) { 211e484b35bSopenharmony_ci return false; 212e484b35bSopenharmony_ci } 213e484b35bSopenharmony_ci const shareResult = vm._shareData || {}; 214e484b35bSopenharmony_ci if (shareResult instanceof Object && !(shareResult instanceof Array)) { 215e484b35bSopenharmony_ci allData.shareData = shareResult; 216e484b35bSopenharmony_ci } 217e484b35bSopenharmony_ci return JSON.stringify(allData); 218e484b35bSopenharmony_ci } 219e484b35bSopenharmony_ci 220e484b35bSopenharmony_ci /** 221e484b35bSopenharmony_ci * Handle restore Data. 222e484b35bSopenharmony_ci * @param {*} restoreData - Restore data. 223e484b35bSopenharmony_ci * @return {*} 224e484b35bSopenharmony_ci */ 225e484b35bSopenharmony_ci function handleRestoreData(restoreData: any) { 226e484b35bSopenharmony_ci const saveData = restoreData.saveData || {}; 227e484b35bSopenharmony_ci const shareData = restoreData.shareData || {}; 228e484b35bSopenharmony_ci 229e484b35bSopenharmony_ci Object.assign(vm._shareData, shareData); 230e484b35bSopenharmony_ci return vm.$emitDirect(`hook:${type}`, saveData); 231e484b35bSopenharmony_ci } 232e484b35bSopenharmony_ci function handleNewRequest(data: any) { 233e484b35bSopenharmony_ci Object.assign(vm._data, data); 234e484b35bSopenharmony_ci return vm.$emitDirect(`hook:${type}`); 235e484b35bSopenharmony_ci } 236e484b35bSopenharmony_ci }); 237e484b35bSopenharmony_ci} 238e484b35bSopenharmony_ci 239e484b35bSopenharmony_ci/** 240e484b35bSopenharmony_ci * Watch a calc function and callback if the calc value changes. 241e484b35bSopenharmony_ci * @param {Vm} vm - Vm object. 242e484b35bSopenharmony_ci * @param {string} data - Data that needed. 243e484b35bSopenharmony_ci * @param {Function | string} callback - Callback function. 244e484b35bSopenharmony_ci * @return {*} 245e484b35bSopenharmony_ci */ 246e484b35bSopenharmony_ciexport function watch(vm: Vm, data: string, callback: ((...args: any) => any) | string): any { 247e484b35bSopenharmony_ci function calc() { 248e484b35bSopenharmony_ci let arr = []; 249e484b35bSopenharmony_ci arr = data.split('.'); 250e484b35bSopenharmony_ci let retData = this; 251e484b35bSopenharmony_ci arr.forEach(type => { 252e484b35bSopenharmony_ci if (retData) { 253e484b35bSopenharmony_ci retData = retData[type]; 254e484b35bSopenharmony_ci } 255e484b35bSopenharmony_ci }); 256e484b35bSopenharmony_ci return retData; 257e484b35bSopenharmony_ci } 258e484b35bSopenharmony_ci const watcher = new Watcher(vm, calc, function(value, oldValue) { 259e484b35bSopenharmony_ci if (typeof value !== 'object' && value === oldValue) { 260e484b35bSopenharmony_ci return; 261e484b35bSopenharmony_ci } 262e484b35bSopenharmony_ci if (typeof callback === 'function') { 263e484b35bSopenharmony_ci callback(value, oldValue); 264e484b35bSopenharmony_ci } else { 265e484b35bSopenharmony_ci if (vm._methods[callback] && typeof vm._methods[callback] === 'function') { 266e484b35bSopenharmony_ci vm._methods[callback](value, oldValue); 267e484b35bSopenharmony_ci } 268e484b35bSopenharmony_ci } 269e484b35bSopenharmony_ci }, null); 270e484b35bSopenharmony_ci return watcher.value; 271e484b35bSopenharmony_ci} 272e484b35bSopenharmony_ci 273e484b35bSopenharmony_ci/** 274e484b35bSopenharmony_ci * Prop is assigned to data to observe prop. 275e484b35bSopenharmony_ci * @param {Vm} vm - Vm object. 276e484b35bSopenharmony_ci */ 277e484b35bSopenharmony_ciexport function initPropsToData(vm: Vm): void { 278e484b35bSopenharmony_ci vm._props.forEach(prop => { 279e484b35bSopenharmony_ci if (vm._data) { 280e484b35bSopenharmony_ci vm._data[prop] = vm[prop]; 281e484b35bSopenharmony_ci } 282e484b35bSopenharmony_ci }); 283e484b35bSopenharmony_ci} 284e484b35bSopenharmony_ci 285e484b35bSopenharmony_ci/** 286e484b35bSopenharmony_ci * Emit subVm lifecycle 287e484b35bSopenharmony_ci * @param {Vm} vm - Vm object. 288e484b35bSopenharmony_ci * @param {String} type - event type 289e484b35bSopenharmony_ci */ 290e484b35bSopenharmony_ciexport function emitSubVmLife(vm: Vm, type:string) { 291e484b35bSopenharmony_ci if (vm._childrenVms) { 292e484b35bSopenharmony_ci vm._childrenVms.forEach((subVm) => { 293e484b35bSopenharmony_ci subVm.$emit(`hook:${type}`); 294e484b35bSopenharmony_ci emitSubVmLife(subVm, type); 295e484b35bSopenharmony_ci }); 296e484b35bSopenharmony_ci } 297e484b35bSopenharmony_ci} 298