{"version":3,"file":"VPullToRefresh.mjs","names":["VIcon","VProgressCircular","computed","onMounted","ref","shallowRef","watch","clamp","convertToUnit","genericComponent","getScrollParents","useRender","VPullToRefresh","name","props","pullDownThreshold","type","Number","default","emits","load","options","setup","_ref","slots","emit","touchstartY","scrollParents","touchDiff","containerRef","refreshing","goingUp","touching","canRefresh","value","topOffset","onTouchstart","e","clientY","touches","onTouchmove","touchY","length","scrollTop","onTouchend","done","stopScrolling","forEach","p","style","overflow","newVal","oldVal","_createVNode","top","height","pullDownPanel"],"sources":["../../../src/labs/VPullToRefresh/VPullToRefresh.tsx"],"sourcesContent":["// Styles\nimport './VPullToRefresh.sass'\n\n// Components\nimport { VIcon } from '@/components/VIcon'\nimport { VProgressCircular } from '@/components/VProgressCircular'\n\n// Utilities\nimport { computed, onMounted, ref, shallowRef, watch } from 'vue'\nimport { clamp, convertToUnit, genericComponent, getScrollParents, useRender } from '@/util'\n\nexport type VPullToRefreshSlots = {\n  default: never\n  pullDownPanel: {\n    canRefresh: boolean\n    goingUp: boolean\n    refreshing: boolean\n  }\n}\n\nexport const VPullToRefresh = genericComponent<VPullToRefreshSlots>()({\n  name: 'VPullToRefresh',\n\n  props: {\n    pullDownThreshold: {\n      type: Number,\n      default: 64,\n    },\n  },\n\n  emits: {\n    load: (options: { done: () => void }) => true,\n  },\n\n  setup (props, { slots, emit }) {\n    let touchstartY = 0\n    let scrollParents: HTMLElement[] = []\n\n    const touchDiff = shallowRef(0)\n    const containerRef = ref<HTMLElement>()\n\n    const refreshing = shallowRef(false)\n    const goingUp = shallowRef(false)\n    const touching = shallowRef(false)\n\n    const canRefresh = computed(() => touchDiff.value >= props.pullDownThreshold && !refreshing.value)\n    const topOffset = computed(() => clamp(touchDiff.value, 0, props.pullDownThreshold))\n\n    function onTouchstart (e: TouchEvent | MouseEvent) {\n      if (refreshing.value) return\n      touching.value = true\n      touchstartY = 'clientY' in e ? e.clientY : e.touches[0].clientY\n    }\n\n    function onTouchmove (e: TouchEvent | MouseEvent) {\n      if (refreshing.value || !touching.value) return\n\n      const touchY = 'clientY' in e ? e.clientY : e.touches[0].clientY\n\n      if (scrollParents.length && !scrollParents[0].scrollTop) {\n        touchDiff.value = touchY - touchstartY\n      }\n    }\n\n    function onTouchend (e: TouchEvent | MouseEvent) {\n      if (refreshing.value) return\n      touching.value = false\n      if (canRefresh.value) {\n        function done () {\n          if (!refreshing.value) return\n          touchDiff.value = 0\n          refreshing.value = false\n        }\n        emit('load', { done })\n        refreshing.value = true\n      } else {\n        touchDiff.value = 0\n      }\n    }\n\n    onMounted(() => {\n      scrollParents = getScrollParents(containerRef.value)\n    })\n\n    watch([topOffset, refreshing], () => {\n      if (scrollParents.length) {\n        const stopScrolling = topOffset.value && !refreshing.value\n        scrollParents.forEach(p => p.style.overflow = stopScrolling ? 'hidden' : 'auto')\n      }\n    })\n\n    watch(topOffset, (newVal, oldVal) => {\n      goingUp.value = newVal < oldVal\n    })\n\n    useRender(() => {\n      return (\n        <div\n          class={[\n            'v-pull-to-refresh',\n          ]}\n          onTouchstart={ onTouchstart }\n          onTouchmove={ onTouchmove }\n          onTouchend={ onTouchend }\n          onMousedown={ onTouchstart }\n          onMouseup={ onTouchend }\n          onMouseleave={ onTouchend }\n          onMousemove={ onTouchmove }\n          ref={ containerRef }\n        >\n          <div\n            class={[\n              'v-pull-to-refresh__pull-down',\n              {\n                'v-pull-to-refresh__pull-down--touching': touching.value,\n              },\n            ]}\n            style={{\n              top: convertToUnit(-1 * props.pullDownThreshold + topOffset.value),\n              height: convertToUnit(props.pullDownThreshold),\n            }}\n          >\n            { slots.pullDownPanel\n              ? slots.pullDownPanel({\n                canRefresh: canRefresh.value,\n                goingUp: goingUp.value,\n                refreshing: refreshing.value,\n              }) : (\n                <div\n                  class={[\n                    'v-pull-to-refresh__pull-down-default',\n                  ]}\n                >\n                  {\n                    refreshing.value ? (\n                      <VProgressCircular\n                        indeterminate\n                        active={ false }\n                      />\n                    ) : (\n                      <VIcon\n                        icon={ canRefresh.value || goingUp.value ? '$sortAsc' : '$sortDesc' }\n                      />\n                    )\n                  }\n                </div>\n              )\n            }\n          </div>\n          <div\n            class={[\n              'v-pull-to-refresh__scroll-container',\n              {\n                'v-pull-to-refresh__scroll-container--touching': touching.value,\n              },\n            ]}\n            style={{ top: convertToUnit(topOffset.value) }}\n          >\n            { slots.default?.() }\n          </div>\n        </div>\n      )\n    })\n  },\n})\n\nexport type VPullToRefresh = InstanceType<typeof VPullToRefresh>\n"],"mappings":"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","ignoreList":[]}