PullDownRefresh.ets 6.17 KB
import promptAction from '@ohos.promptAction';
import { RefreshConstants as Const, RefreshState } from './RefreshConstants';
import { touchMoveLoadMore, touchUpLoadMore } from './PullUpLoadMore';
import { PageDTO, CompDTO } from 'wdBean';
import PageModel from '../viewmodel/PageModel';
import PageViewModel from '../viewmodel/PageViewModel';
import { DateTimeUtils } from 'wdKit';

export function listTouchEvent(pageModel: PageModel, event: TouchEvent) {
  switch (event.type) {
    case TouchType.Down:
      pageModel.downY = event.touches[0].y;
      pageModel.lastMoveY = event.touches[0].y;
      break;
    case TouchType.Move:
      if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
        return;
      }
      let isDownPull = event.touches[0].y - pageModel.lastMoveY > 0;
      if (((isDownPull === true) || (pageModel.isPullRefreshOperation === true)) && (pageModel.isCanLoadMore === false)) {
        // Finger movement, processing pull-down refresh.
        touchMovePullRefresh(pageModel, event);
      } else {
        // Finger movement, processing load more.
        touchMoveLoadMore(pageModel, event);
      }
      pageModel.lastMoveY = event.touches[0].y;
      break;
    case TouchType.Cancel:
      break;
    case TouchType.Up:
      if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
        return;
      }
      if ((pageModel.isPullRefreshOperation === true)) {
        // Lift your finger and pull down to refresh.
        touchUpPullRefresh(pageModel);
      } else {
        // Fingers up, handle loading more.
        touchUpLoadMore(pageModel);
      }
      break;
    default:
      break;
  }
}

export function touchMovePullRefresh(pageModel: PageModel, event: TouchEvent) {
  if (pageModel.startIndex === 0) {
    pageModel.isPullRefreshOperation = true;
    let height = vp2px(pageModel.pullDownRefreshHeight);
    pageModel.offsetY = event.touches[0].y - pageModel.downY;
    // The sliding offset is greater than the pull-down refresh layout height, and the refresh condition is met.
    if (pageModel.offsetY >= height) {
      pullRefreshState(pageModel, RefreshState.Release);
      pageModel.offsetY = height + pageModel.offsetY * Const.Y_OFF_SET_COEFFICIENT;
    } else {
      pullRefreshState(pageModel, RefreshState.DropDown);
    }
    if (pageModel.offsetY < 0) {
      pageModel.offsetY = 0;
      pageModel.isPullRefreshOperation = false;
    }
  }
}

export function touchUpPullRefresh(pageModel: PageModel) {
  if (pageModel.isCanRefresh === true) {
    pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
    pullRefreshState(pageModel, RefreshState.Refreshing);
    pageModel.currentPage = 1;
    setTimeout(() => {
      let self: PageModel = pageModel;

      PageViewModel.getPageData(self.pageId, self.groupId, self.channelId, self.currentPage, self.pageSize, getContext())
        .then((data: PageDTO) => {
          self.timestamp = DateTimeUtils.getTimeStamp().toString()
          if (data == null || data.compList == null || data.compList.length == 0) {
            self.hasMore = false;
          } else {
            if (data.compList.length == self.pageSize) {
              self.currentPage++;
              self.hasMore = true;
            } else {
              self.hasMore = false;
            }
            // 刷新,替换所有数据
            self.compList.replaceAll(...data.compList)
            PageViewModel.getInteractData(data.compList).then((data: CompDTO[]) => {
              // 刷新,替换所有数据
              self.compList.replaceAll(...data)
              self.timestamp = DateTimeUtils.getTimeStamp().toString()
            })
          }
          closeRefresh(self, true);
        }).catch((err: string | Resource) => {
        promptAction.showToast({ message: err });
        closeRefresh(self, false);
      });
    }, Const.DELAY_TIME);
  } else {
    closeRefresh(pageModel, false);
  }
}

export function pullRefreshState(pageModel: PageModel, state: number) {
  switch (state) {
    case RefreshState.DropDown:
      pageModel.pullDownRefreshText = $r('app.string.pull_down_refresh_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_pull_down_refresh');
      pageModel.isCanRefresh = false;
      pageModel.isRefreshing = false;
      pageModel.isVisiblePullDown = true;
      break;
    case RefreshState.Release:
      pageModel.pullDownRefreshText = $r('app.string.release_refresh_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_pull_up_refresh');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = false;
      break;
    case RefreshState.Refreshing:
      pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
      pageModel.pullDownRefreshText = $r('app.string.refreshing_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_pull_up_load');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      break;
    case RefreshState.Success:
      pageModel.pullDownRefreshText = $r('app.string.refresh_success_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_succeed_refresh');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      break;
    case RefreshState.Fail:
      pageModel.pullDownRefreshText = $r('app.string.refresh_fail_text');
      pageModel.pullDownRefreshImage = $r('app.media.ic_fail_refresh');
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      break;
    default:
      break;
  }
}

export function closeRefresh(pageModel: PageModel, isRefreshSuccess: boolean) {
  let self = pageModel;
  setTimeout(() => {
    let delay = Const.RefreshConstant_DELAY_PULL_DOWN_REFRESH;
    if (self.isCanRefresh === true) {
      pullRefreshState(pageModel, isRefreshSuccess ? RefreshState.Success : RefreshState.Fail);
      delay = Const.RefreshConstant_DELAY_SHRINK_ANIMATION_TIME;
    }
    animateTo({
      duration: Const.RefreshConstant_CLOSE_PULL_DOWN_REFRESH_TIME,
      delay: delay,
      onFinish: () => {
        pullRefreshState(pageModel, RefreshState.DropDown);
        self.isVisiblePullDown = false;
        self.isPullRefreshOperation = false;
      }
    }, () => {
      self.offsetY = 0;
    })
  }, self.isCanRefresh ? Const.DELAY_ANIMATION_DURATION : 0);
}