PullDownRefresh.ets 9.85 KB
import { RefreshConstants as Const, RefreshState } from './RefreshConstants';
import { touchMoveLoadMore, touchUpLoadMore } from './PullUpLoadMore';
import PageModel from '../viewmodel/PageModel';
import PageHelper from '../viewmodel/PageHelper';
import PageAdModel from '../viewmodel/PageAdvModel';
import { LoadStatus } from '../components/refresh/RefreshLayoutBean';
import { Logger } from 'wdKit/Index';

const TAG = 'PullDownRefresh'
/***********新的下拉、上拉手势 start **********/
export function onActionStart(pageModel: PageModel, pageAdvModel: PageAdModel, event?: GestureEvent) {
  if (event === undefined) {
    return
  }
  pageModel.downY = event.offsetY;
  pageModel.lastMoveY = event.offsetY;
}

export function onActionUpdate(pageModel: PageModel, pageAdvModel: PageAdModel, event?: GestureEvent) {
  if (event === undefined) {
    return
  }
  if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
    return;
  }
  let isDownPull = event.offsetY - pageModel.lastMoveY > 0;
  if (((isDownPull === true) || (pageModel.isPullRefreshOperation === true)) &&
    (pageModel.isCanLoadMore === false)) {
    actionUpdatePullRefresh(pageModel, event);
  } else {
    actionUpdateLoadMore(pageModel, event);
  }
  pageModel.lastMoveY = event.offsetY;
}

export function onActionEnd(pageModel: PageModel, pageAdvModel: PageAdModel) {
  if ((pageModel.isRefreshing === true) || (pageModel.isLoading === true)) {
    return;
  }
  if ((pageModel.isPullRefreshOperation === true)) {
    touchUpPullRefresh(pageModel, pageAdvModel);
  } else {
    // touchUpLoadMore(pageModel);
  }
}

export function actionUpdatePullRefresh(pageModel: PageModel, event: GestureEvent) {
  if (pageModel.startIndex === 0) {
    pageModel.isPullRefreshOperation = true;
    let height = vp2px(Const.CUSTOM_REFRESH_DECIDE_HEIGHT);
    pageModel.offsetY = event.offsetY - pageModel.downY;
    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 actionUpdateLoadMore(model: PageModel, event: GestureEvent) {
  // list size +1

  console.log(TAG,model.compList.totalCount(),model.endIndex)

  if (model.endIndex >= model.compList.totalCount() - 3 && model.endIndex - 1 <= model.compList.totalCount()) {
    // model.offsetY = event.touches[0].y - model.downY;
    // if (Math.abs(model.offsetY) > vp2px(model.pullUpLoadHeight) / 2) {
    //   model.isCanLoadMore = true;
    //   model.isVisiblePullUpLoad = true;
    //   model.offsetY = -vp2px(model.pullUpLoadHeight) + model.offsetY * Const.Y_OFF_SET_COEFFICIENT;
    // }

    // 不用分页动画,直接预加载
    model.isCanLoadMore = true;
    model.isVisiblePullUpLoad = true;
    touchUpLoadMore(model);
  }
}

/***********新的下拉、上拉手势 end **********/


//下拉刷新上拉加载更多组件
/**
 * @deprecated
 */
export function listTouchEvent(pageModel: PageModel, pageAdvModel: PageAdModel, 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, pageAdvModel);
      } else {
        // Fingers up, handle loading more.
        // touchUpLoadMore(pageModel);
      }
      break;
    default:
      break;
  }
}

/**
 * @deprecated
 */
export function touchMovePullRefresh(pageModel: PageModel, event: TouchEvent) {
  if (pageModel.startIndex === 0) {
    pageModel.isPullRefreshOperation = true;
    let height = vp2px(Const.CUSTOM_REFRESH_DECIDE_HEIGHT);
    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, pageAdvModel: PageAdModel) {
  if (pageModel.isCanRefresh === true) {
    pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
    pullRefreshState(pageModel, RefreshState.Refreshing);
    pageModel.currentPage = 1;
    setTimeout(() => {
      let self: PageModel = pageModel;
      let advSelf: PageAdModel = pageAdvModel;
      PageHelper.refreshUI(self, advSelf)
    }, Const.DELAY_TIME);
    setRefreshTimeoutTimer(pageModel)
  } else {
    closeRefresh(pageModel, false);
  }
}

export function setRefreshTimeoutTimer(pageModel: PageModel) {
  let timeoutId = setTimeout(() => {
    closeRefresh(pageModel, false);
    Logger.error(TAG, 'closeRefresh by timeout')
  }, Const.REFRESH_TIMEOUT__TIME);
  // 取消超时关闭定时器
  clearTimeout(pageModel.refreshTimeoutTimerId)
  pageModel.refreshTimeoutTimerId = timeoutId
}

/**
 * 自动刷新接口,如首页底导,双击按钮自动刷新
 * @param pageModel 页面数据
 * @param pageAdvModel 广告数据
 */
export function autoRefresh(pageModel: PageModel, pageAdvModel: PageAdModel) {
  if (pageModel.isRefreshing === true) {
    // 拦截多次刷新
    return
  }
  pageModel.isVisiblePullDown = true;
  pageModel.isHandRefreshing = true
  pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
  pullRefreshState(pageModel, RefreshState.Refreshing);
  pageModel.currentPage = 1;
  PageHelper.refreshUI(pageModel, pageAdvModel)
  setRefreshTimeoutTimer(pageModel)
}

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;
      pageModel.load = LoadStatus.PRELOAD
      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;
      pageModel.load = LoadStatus.PRELOAD
      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;
      pageModel.load = LoadStatus.LOADING
      break;
    case RefreshState.GOLOADED:
      //已刷新至最新
      pageModel.offsetY = vp2px(pageModel.pullDownRefreshHeight);
      pageModel.isCanRefresh = true;
      pageModel.isRefreshing = true;
      pageModel.load = LoadStatus.GOLOADED
      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;
      pageModel.load = LoadStatus.LOADED
      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;
      pageModel.load = LoadStatus.LOADED
      break;
    default:
      break;
  }
}

export function closeRefresh(pageModel: PageModel, isRefreshSuccess: boolean) {
  let self = pageModel;
  // 取消超时关闭定时器
  clearTimeout(self.refreshTimeoutTimerId)

  setTimeout(()=>{
    closeRefreshLastStep(pageModel,isRefreshSuccess)
  }, self.isHandRefreshing ? 800 : 0)

}

function closeRefreshLastStep (pageModel: PageModel, isRefreshSuccess: boolean) {
  let self = pageModel;
  pullRefreshState(pageModel,RefreshState.GOLOADED);

  //定时器时间就是'已刷新至最新'停留时间
  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.isHandRefreshing = false
      }
    }, () => {
      self.offsetY = 0;
    })
  }, self.isCanRefresh ? Const.DELAY_ANIMATION_DURATION : 0);
}