PageHelper.ets 6.12 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';

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.parseGroup(pageModel)
  }

  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;