WdWebComponent.ets 3.67 KB
import router from '@ohos.router';
import { Action } from 'wdBean';
import { ConfigConstants } from 'wdConstant';
import { Logger } from 'wdKit';
import { BridgeHandler, BridgeUtil, BridgeWebViewControl, Callback } from 'wdJsBridge';
import { performJSCallNative } from './JsBridgeBiz';
import { setDefaultNativeWebSettings } from './WebComponentUtil';

const TAG = 'WdWebComponent';

@Component
export struct WdWebComponent {
  private webviewControl: BridgeWebViewControl = new BridgeWebViewControl()
  //TODO 默认网页
  webUrl: string = ConfigConstants.DETAIL_URL
  /**
   * 对外暴露webview的回调,能力
   */
  onPageBegin: (url?: string) => void = () => {
  }
  onPageEnd: (url?: string) => void = () => {
  }
  onLoadIntercept: (url?: string) => boolean = () => {
    return false
  }
  onHttpErrorReceive: (url?: string) => boolean = () => {
    return false
  }
  @Prop @Watch('onReloadStateChanged') reload: number = 0
  /**
   * 默认【CallNative】逻辑处理
   */
  private defaultPerformJSCallNative: (data: Action, f: Callback) => void = (data: Action, f: Callback) => {
    performJSCallNative(data, f)
  }
  /**
   * jsBridge的处理
   */
  handleInfo: [string, BridgeHandler][] = []
  backVisibility: boolean = false

  defaultRegisterHandler(): void {
    this.webviewControl.registerHandler("CallNative", {
      handle: (data: Action, f: Callback) => {
        this.defaultPerformJSCallNative(data, f)
      }
    });

  }

  build() {
    Column() {
      Row() {
        Image($r("app.media.ic_back"))
          .width(44)
          .padding(13)
          .aspectRatio(1)
          .onClick(() => {
            router.back();
          })
      }.backgroundColor(Color.Black)
      .width('100%')
      .height(44)
      .visibility(this.backVisibility ? Visibility.Visible : Visibility.None)

      Web({ src: this.webUrl, controller: this.webviewControl })
        .domStorageAccess(true)
        .databaseAccess(true)
        .javaScriptAccess(true)
        .onHttpErrorReceive((event) => {
          //TODO 页面加载不成功的时候处理
          Logger.info(TAG, 'onHttpErrorReceive event.request.getRequestUrl:' + event?.request.getRequestUrl());
          Logger.info(TAG, 'onHttpErrorReceive event.response.getResponseCode:' + event?.response.getResponseCode());
        })
        .onPageEnd((event) => {
          this.onPageEnd(event?.url)
        })
        .onPageBegin((event) => {
          setDefaultNativeWebSettings(this.webviewControl, this.webUrl).then(()=>{
            this.handleInfo && this.handleInfo.length > 1 ? this.handleInfo.forEach(value => {
              this.webviewControl.registerHandler(value[0], value[1])
            }) : this.defaultRegisterHandler()
            setTimeout(()=>{
              BridgeUtil.webViewLoadLocalJs(getContext(this), this.webviewControl)
            },500)
          })
          this.onPageBegin(event?.url)
        })
        .onLoadIntercept((event) => {
          let url: string = event.data.getRequestUrl().toString()
          url = url.replace("%(?![0-9a-fA-F]{2})", "%25")
            .replace("\\+", "%2B");
          url = decodeURIComponent(url)
          if (url.startsWith(BridgeUtil.YY_RETURN_DATA)) {
            this.webviewControl.handlerReturnData(url)
            return true
          }
          if (url.startsWith(BridgeUtil.YY_OVERRIDE_SCHEMA)) {
            this.webviewControl.flushMessageQueue()
            return true
          }
          return this.onLoadIntercept(event.data.getRequestUrl().toString())
        })
    }
  }

  onReloadStateChanged() {
    Logger.info(TAG, `onReloadStateChanged:::refresh, this.reload: ${this.reload}`);
    if (this.reload > 0) {
      this.webviewControl.refresh()
    }
  }
}