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