PageHelper.ets 7.56 KB
import { PageDTO, CompDTO, PageInfoDTO, ContentDTO } from 'wdBean';
import { CompStyle, ViewType } from 'wdConstant/Index';
import { CollectionUtils, DateTimeUtils, Logger } from 'wdKit';
import { closeRefresh } from '../utils/PullDownRefresh';
import PageModel from './PageModel';
import PageViewModel from './PageViewModel';
import { promptAction } from '@kit.ArkUI';
import { AdvRuleBean } from 'wdBean/src/main/ets/bean/adv/AdvsRuleBean';

const TAG = 'PageHelper';

/**
 * 处理返回后的数据
 */
export class PageHelper {
  /**
   * 刷新数据
   */
  async refreshUI(pageModel: PageModel) {
    pageModel.loadStrategy = 2
    this.getPageInfo(pageModel)
  }

  /**
   * 分页加载
   */
  async loadMore(pageModel: PageModel) {
    pageModel.loadStrategy = 3
    // 暂只支持comp分页加载,节目分页加载的得完善框架(如直播回看节目数据分页)
    this.compLoadMore(pageModel)
  }

  /**
   * 进页面请求数据
   */
  async getInitData(pageModel: PageModel) {
    pageModel.loadStrategy = 1
    this.getPageInfo(pageModel)
  }

  async getPageInfo(pageModel: PageModel) {
    pageModel.currentPage = 1;
    let pageInfo = await PageViewModel.getPageInfo(pageModel.pageId);
    if (pageInfo == null) {
      pageModel.viewType = ViewType.EMPTY;
      return;
    }
    pageModel.pageInfo = pageInfo;
    //解析广告资源
    this.analysisAdvSource(pageModel);

    this.parseGroup(pageModel)

  }

  /**
   * 解析广告资源
   * @param pageInfo
   */
  analysisAdvSource(pageModel: PageModel) {

    let pageInfo = pageModel.pageInfo
    if (pageInfo.hasAdInfo === 1 && pageInfo.cornersAdv != null) {
      // 优先展示展现中心广告
      let cornersAdv = pageInfo.cornersAdv

      if (cornersAdv == null) {
        return
      }
      if (cornersAdv.advert == null) {
        return
      }

      if ("left_down" == cornersAdv.pos) {
        // 左边挂角广告
        pageModel.isRightAdv = 2
      } else {
        // 右边挂角广告
        pageModel.isRightAdv = 1

      }

      pageModel.pageCornerContentInfo = cornersAdv;
      pageModel.isShowAds = true

    } else if (pageInfo.cornersAdv2 != null && pageInfo.cornersAdv2.length > 0) {
      // 广告中心-挂角广告信息
      let cornersAdv2 = pageInfo.cornersAdv2
      // 获取
      let showCompAdvBean = cornersAdv2[0]

      if (showCompAdvBean.matInfo == null) {
        return
      }
      //
      let slotInfo = showCompAdvBean.slotInfo;
      let postion = slotInfo.position
      if (postion == 0) {
        //左边挂角
        pageModel.isRightAdv = 2
      } else {
        // 右边挂角
        pageModel.isRightAdv = 1
      }
      pageModel.pageCornerAdv = showCompAdvBean
      pageModel.isShowAds = true
    }


  }


  async parseGroup(pageModel: PageModel) {
    let pageInfo: PageInfoDTO = pageModel.pageInfo
    pageModel.groupList = []
    pageModel.groupList.push(...pageInfo.groups)
    for (const group of pageInfo.groups) {
      pageModel.isRecGroup = group.groupStrategy === 1;
      pageModel.groupId = group.id;
      if (pageModel.isRecGroup) {
        pageModel.pageSize = 10
      } else {
        pageModel.pageSize = 20
      }
      pageModel.groupData = group
      // await,确保groups接口顺序执行
      let pageDto = await PageViewModel.getPageData(pageModel.bizCopy())
      let index = pageInfo.groups.indexOf(group)
      if (index == 0) {
        // 清空comp列表
        pageModel.compList.clear()
      }
      this.getGroupData(pageModel, pageDto, index == pageInfo.groups.length - 1)
    }
    if (pageModel.compList.isEmpty()) {
      // 没数据,展示空页面
      Logger.debug(TAG, 'aboutToAppear, data response page ' + pageModel.pageId + ', comp list is empty.');
      pageModel.viewType = ViewType.EMPTY;
    }
  }

  private async getGroupData(pageModel: PageModel, pageDto: PageDTO, isLastGroup: boolean) {
    pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
    if (pageDto && pageDto.compList && pageDto.compList.length > 0) {
      pageModel.viewType = ViewType.LOADED;
      let sizeBefore: number = pageModel.compList.size();
      if (pageDto.compList.length === pageModel.pageSize) {
        pageModel.currentPage++;
        pageModel.hasMore = true;
      } else {
        pageModel.hasMore = false;
      }

      //移除音频 和 活动
      this.removeComp(pageModel, pageDto)

      // pageModel.compList.push(...pageDto.compList)

      // TODO 暂时去掉互动数据,待优化。(主要是互动数据返回,如何渲染到ui上)
      // TODO updateItems(sizeBefore, data),这里可能有时序问题,导致覆盖别的group数据,需要优化,考虑精准替换
      // 二次请求,批查互动数据
      // PageViewModel.getInteractData(pageDto.compList).then((data: CompDTO[]) => {
      //   // 刷新,替换所有数据
      //   // pageModel.compList.replaceAll(...data)
      //   pageModel.compList.updateItems(sizeBefore, data)
      //   pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
      // })
      // content级别的展现加载丢给comp自己,这里只需要处理屏蔽分页加载,pageModel.pageScroll
      if (isLastGroup) {
        closeRefresh(pageModel, true);
        // 最后一个楼层,特殊处理
        // 检测楼层最后一个组件业务数据是否需要通过访问接口获取
        let comp: CompDTO = pageDto.compList[pageDto.compList.length - 1]
        let compSize = CollectionUtils.getListSize(comp.operDataList)
        // 直播回放,需要二次请求数据
        if (compSize <= 0 && comp.compStyle == CompStyle.Zh_Grid_Layout_02) {
          // 这个comp,数据自己二次请求,自己分页处理,这里加flag,将page层滑动及loadmore ui去掉
          pageModel.contentNeedScroll = true
        }
      }
    }
  }

  /**
   * comp加载更多,分页加载
   */
  private compLoadMore(pageModel: PageModel) {
    PageViewModel.getPageData(pageModel.bizCopy())
      .then((data: PageDTO) => {
        pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
        if (data == null || data.compList == null || data.compList.length == 0) {
          pageModel.hasMore = false;
        } else {
          if (data.compList.length == pageModel.pageSize) {
            pageModel.currentPage++;
            pageModel.hasMore = true;
          } else {
            pageModel.hasMore = false;
          }
          let sizeBefore: number = pageModel.compList.size();

          //移除音频 和 活动
          this.removeComp(pageModel, data)
          //
          // pageModel.compList.push(...data.compList)
          PageViewModel.getInteractData(data.compList).then((data: CompDTO[]) => {
            // 刷新,替换所有数据
            pageModel.compList.updateItems(sizeBefore, data)
            pageModel.timestamp = DateTimeUtils.getTimeStamp().toString()
          })
        }
      }).catch((err: string | Resource) => {
      promptAction.showToast({ message: err });
    })
  }

  /**
   * 移除comp
   */
  private removeComp(pageModel: PageModel, pageDto: PageDTO) {
    let datas = pageDto.compList
    for (let index = 0; index < datas.length; index++) {
      const element = datas[index];
      let contentInfo: ContentDTO = CollectionUtils.getElement(element.operDataList, 0);
      //移除音频 和 活动
      if (contentInfo && (contentInfo.objectType === '13' || contentInfo.objectType === '3')) {
        Logger.debug(TAG, 'getGroupData 移除音频 和 活动');
      } else {
        pageModel.compList.push(element)
      }
    }
  }
}


let pageHelper = new PageHelper();

export default pageHelper as PageHelper;