{"version":3,"file":"pull-refresh.mjs","sources":["../../../../../../../packages/components/pull-refresh/src/pull-refresh.tsx"],"sourcesContent":["import {\n  type ExtractPropTypes,\n  defineComponent,\n  nextTick,\n  reactive,\n  ref,\n  watch,\n} from 'vue'\n\n// Utils\nimport {\n  createNamespace,\n  getScrollTop,\n  makeNumericProp,\n  numericProp,\n  preventDefault,\n} from '@xzx-design/utils'\n\n// Composables\nimport { useEventListener, useScrollParent, useTouch } from '@xzx-design/hooks'\n\n// Components\nimport { Loading } from '@xzx-design/components/loading'\n\nconst [name, bem, t] = createNamespace('pull-refresh')\n\nconst DEFAULT_HEAD_HEIGHT = 50\nconst TEXT_STATUS = ['pulling', 'loosing', 'success']\n\ntype PullRefreshStatus =\n  | 'normal'\n  | 'loading'\n  | 'loosing'\n  | 'pulling'\n  | 'success'\n\nexport const pullRefreshProps = {\n  disabled: Boolean,\n  modelValue: Boolean,\n  headHeight: makeNumericProp(DEFAULT_HEAD_HEIGHT),\n  successText: String,\n  pullingText: String,\n  loosingText: String,\n  loadingText: String,\n  pullDistance: numericProp,\n  successDuration: makeNumericProp(500),\n  animationDuration: makeNumericProp(300),\n}\n\nexport type PullRefreshProps = ExtractPropTypes<typeof pullRefreshProps>\n\nexport default defineComponent({\n  name,\n\n  props: pullRefreshProps,\n\n  emits: ['change', 'refresh', 'update:modelValue'],\n\n  setup(props, { emit, slots }) {\n    let reachTop: boolean\n\n    const root = ref<HTMLElement>()\n    const track = ref<HTMLElement>()\n    const scrollParent = useScrollParent(root)\n\n    const state = reactive({\n      status: 'normal' as PullRefreshStatus,\n      distance: 0,\n      duration: 0,\n    })\n\n    const touch = useTouch()\n\n    const getHeadStyle = () => {\n      if (props.headHeight !== DEFAULT_HEAD_HEIGHT) {\n        return {\n          height: `${props.headHeight}px`,\n        }\n      }\n    }\n\n    const isTouchable = () =>\n      state.status !== 'loading' &&\n      state.status !== 'success' &&\n      !props.disabled\n\n    const ease = (distance: number) => {\n      const pullDistance = +(props.pullDistance || props.headHeight)\n\n      if (distance > pullDistance) {\n        if (distance < pullDistance * 2) {\n          distance = pullDistance + (distance - pullDistance) / 2\n        } else {\n          distance = pullDistance * 1.5 + (distance - pullDistance * 2) / 4\n        }\n      }\n\n      return Math.round(distance)\n    }\n\n    const setStatus = (distance: number, isLoading?: boolean) => {\n      const pullDistance = +(props.pullDistance || props.headHeight)\n      state.distance = distance\n\n      if (isLoading) {\n        state.status = 'loading'\n      } else if (distance === 0) {\n        state.status = 'normal'\n      } else if (distance < pullDistance) {\n        state.status = 'pulling'\n      } else {\n        state.status = 'loosing'\n      }\n\n      emit('change', {\n        status: state.status,\n        distance,\n      })\n    }\n\n    const getStatusText = () => {\n      const { status } = state\n      if (status === 'normal') {\n        return ''\n      }\n      return props[`${status}Text` as const] || t(status)\n    }\n\n    const renderStatus = () => {\n      const { status, distance } = state\n\n      if (slots[status]) {\n        return slots[status]!({ distance })\n      }\n\n      const nodes: JSX.Element[] = []\n\n      if (TEXT_STATUS.includes(status)) {\n        nodes.push(<div class={bem('text')}>{getStatusText()}</div>)\n      }\n      if (status === 'loading') {\n        nodes.push(\n          <Loading\n            v-slots={{ default: getStatusText }}\n            class={bem('loading')}\n          />\n        )\n      }\n\n      return nodes\n    }\n\n    const showSuccessTip = () => {\n      state.status = 'success'\n\n      setTimeout(() => {\n        setStatus(0)\n      }, +props.successDuration)\n    }\n\n    const checkPosition = (event: TouchEvent) => {\n      reachTop = getScrollTop(scrollParent.value!) === 0\n\n      if (reachTop) {\n        state.duration = 0\n        touch.start(event)\n      }\n    }\n\n    const onTouchStart = (event: TouchEvent) => {\n      if (isTouchable()) {\n        checkPosition(event)\n      }\n    }\n\n    const onTouchMove = (event: TouchEvent) => {\n      if (isTouchable()) {\n        if (!reachTop) {\n          checkPosition(event)\n        }\n\n        const { deltaY } = touch\n        touch.move(event)\n\n        if (reachTop && deltaY.value >= 0 && touch.isVertical()) {\n          preventDefault(event)\n          setStatus(ease(deltaY.value))\n        }\n      }\n    }\n\n    const onTouchEnd = () => {\n      if (reachTop && touch.deltaY.value && isTouchable()) {\n        state.duration = +props.animationDuration\n\n        if (state.status === 'loosing') {\n          setStatus(+props.headHeight, true)\n          emit('update:modelValue', true)\n\n          // ensure value change can be watched\n          nextTick(() => emit('refresh'))\n        } else {\n          setStatus(0)\n        }\n      }\n    }\n\n    watch(\n      () => props.modelValue,\n      (value) => {\n        state.duration = +props.animationDuration\n\n        if (value) {\n          setStatus(+props.headHeight, true)\n        } else if (slots.success || props.successText) {\n          showSuccessTip()\n        } else {\n          setStatus(0, false)\n        }\n      }\n    )\n\n    // useEventListener will set passive to `false` to eliminate the warning of Chrome\n    useEventListener('touchmove', onTouchMove, {\n      target: track,\n    })\n\n    return () => {\n      const trackStyle = {\n        transitionDuration: `${state.duration}ms`,\n        transform: state.distance\n          ? `translate3d(0,${state.distance}px, 0)`\n          : '',\n      }\n\n      return (\n        <div ref={root} class={bem()}>\n          <div\n            ref={track}\n            class={bem('track')}\n            style={trackStyle}\n            onTouchstartPassive={onTouchStart}\n            onTouchend={onTouchEnd}\n            onTouchcancel={onTouchEnd}\n          >\n            <div class={bem('head')} style={getHeadStyle()}>\n              {renderStatus()}\n            </div>\n            {slots.default?.()}\n          </div>\n        </div>\n      )\n    }\n  },\n})\n"],"names":["name","bem","t","createNamespace","DEFAULT_HEAD_HEIGHT","TEXT_STATUS","pullRefreshProps","disabled","Boolean","modelValue","headHeight","makeNumericProp","successText","String","pullingText","loosingText","loadingText","pullDistance","numericProp","successDuration","animationDuration","defineComponent","props","emits","setup","emit","slots","reachTop","root","ref","track","scrollParent","useScrollParent","state","reactive","status","distance","duration","touch","useTouch","getHeadStyle","height","isTouchable","ease","Math","round","setStatus","isLoading","getStatusText","renderStatus","nodes","includes","push","_createVNode","Loading","default","showSuccessTip","setTimeout","checkPosition","event","getScrollTop","value","start","onTouchStart","onTouchMove","deltaY","move","isVertical","preventDefault","onTouchEnd","nextTick","watch","success","useEventListener","target","trackStyle","transitionDuration","transform"],"mappings":"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"}