{"version":3,"file":"list.mjs","sources":["../../../../../../../packages/components/list/src/list.tsx"],"sourcesContent":["import {\n  type ExtractPropTypes,\n  type PropType,\n  computed,\n  defineComponent,\n  nextTick,\n  onMounted,\n  onUpdated,\n  ref,\n  watch,\n} from 'vue'\n\n// Utils\nimport {\n  createNamespace,\n  isHidden,\n  makeNumericProp,\n  makeStringProp,\n  truthProp,\n} from '@xzx-design/utils'\n\n// Composables\nimport {\n  useEventListener,\n  useExpose,\n  useRect,\n  useScrollParent,\n  useTabStatus,\n} from '@xzx-design/hooks'\n\n// Components\nimport { Loading } from '@xzx-design/components/loading'\n\n// Types\nimport type { ListDirection, ListExpose } from './types'\n\nconst [name, bem, t] = createNamespace('list')\n\nexport const listProps = {\n  error: Boolean,\n  offset: makeNumericProp(300),\n  loading: Boolean,\n  disabled: Boolean,\n  finished: Boolean,\n  scroller: Object as PropType<Element>,\n  errorText: String,\n  direction: makeStringProp<ListDirection>('down'),\n  loadingText: String,\n  finishedText: String,\n  immediateCheck: truthProp,\n}\n\nexport type ListProps = ExtractPropTypes<typeof listProps>\n\nexport default defineComponent({\n  name,\n\n  props: listProps,\n\n  emits: ['load', 'update:error', 'update:loading'],\n\n  setup(props, { emit, slots }) {\n    // use sync innerLoading state to avoid repeated loading in some edge cases\n    const loading = ref(props.loading)\n    const root = ref<HTMLElement>()\n    const placeholder = ref<HTMLElement>()\n    const tabStatus = useTabStatus()\n    const scrollParent = useScrollParent(root)\n    const scroller = computed(() => props.scroller || scrollParent.value)\n\n    const check = () => {\n      nextTick(() => {\n        if (\n          loading.value ||\n          props.finished ||\n          props.disabled ||\n          props.error ||\n          // skip check when inside an inactive tab\n          tabStatus?.value === false\n        ) {\n          return\n        }\n\n        const { direction } = props\n        const offset = +props.offset\n        const scrollParentRect = useRect(scroller)\n\n        if (!scrollParentRect.height || isHidden(root)) {\n          return\n        }\n\n        let isReachEdge = false\n        const placeholderRect = useRect(placeholder)\n\n        if (direction === 'up') {\n          isReachEdge = scrollParentRect.top - placeholderRect.top <= offset\n        } else {\n          isReachEdge =\n            placeholderRect.bottom - scrollParentRect.bottom <= offset\n        }\n\n        if (isReachEdge) {\n          loading.value = true\n          emit('update:loading', true)\n          emit('load')\n        }\n      })\n    }\n\n    const renderFinishedText = () => {\n      if (props.finished) {\n        const text = slots.finished ? slots.finished() : props.finishedText\n        if (text) {\n          return <div class={bem('finished-text')}>{text}</div>\n        }\n      }\n    }\n\n    const clickErrorText = () => {\n      emit('update:error', false)\n      check()\n    }\n\n    const renderErrorText = () => {\n      if (props.error) {\n        const text = slots.error ? slots.error() : props.errorText\n        if (text) {\n          return (\n            <div\n              role=\"button\"\n              class={bem('error-text')}\n              tabindex={0}\n              onClick={clickErrorText}\n            >\n              {text}\n            </div>\n          )\n        }\n      }\n    }\n\n    const renderLoading = () => {\n      if (loading.value && !props.finished && !props.disabled) {\n        return (\n          <div class={bem('loading')}>\n            {slots.loading ? (\n              slots.loading()\n            ) : (\n              <Loading class={bem('loading-icon')}>\n                {props.loadingText || t('loading')}\n              </Loading>\n            )}\n          </div>\n        )\n      }\n    }\n\n    watch(() => [props.loading, props.finished, props.error], check)\n\n    if (tabStatus) {\n      watch(tabStatus, (tabActive) => {\n        if (tabActive) {\n          check()\n        }\n      })\n    }\n\n    onUpdated(() => {\n      loading.value = props.loading!\n    })\n\n    onMounted(() => {\n      if (props.immediateCheck) {\n        check()\n      }\n    })\n\n    useExpose<ListExpose>({ check })\n\n    useEventListener('scroll', check, {\n      target: scroller,\n      passive: true,\n    })\n\n    return () => {\n      const Content = slots.default?.()\n      const Placeholder = <div ref={placeholder} class={bem('placeholder')} />\n\n      return (\n        <div ref={root} role=\"feed\" class={bem()} aria-busy={loading.value}>\n          {props.direction === 'down' ? Content : Placeholder}\n          {renderLoading()}\n          {renderFinishedText()}\n          {renderErrorText()}\n          {props.direction === 'up' ? Content : Placeholder}\n        </div>\n      )\n    }\n  },\n})\n"],"names":["name","bem","t","createNamespace","listProps","error","Boolean","offset","makeNumericProp","loading","disabled","finished","scroller","Object","errorText","String","direction","makeStringProp","loadingText","finishedText","immediateCheck","truthProp","defineComponent","props","emits","setup","emit","slots","ref","root","placeholder","tabStatus","useTabStatus","scrollParent","useScrollParent","computed","value","check","nextTick","scrollParentRect","useRect","height","isHidden","isReachEdge","placeholderRect","top","bottom","renderFinishedText","text","_createVNode","clickErrorText","renderErrorText","renderLoading","Loading","default","watch","tabActive","onUpdated","onMounted","useExpose","useEventListener","target","passive","Content","Placeholder"],"mappings":"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"}