diff --git a/package-lock.json b/package-lock.json index ea04592..49acb82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "crypto-js": "^4.2.0", "element-plus": "^2.13.2", "gsap": "^3.13.0", + "lodash-es": "^4.18.1", "markdown-it": "^14.1.0", "md5": "^2.3.0", "normalize.css": "^8.0.1", @@ -4790,9 +4791,9 @@ "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "license": "MIT" }, "node_modules/lodash-unified": { @@ -12111,9 +12112,9 @@ "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==" }, "lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==" + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==" }, "lodash-unified": { "version": "1.0.3", diff --git a/package.json b/package.json index 67c6294..65f1f1a 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "crypto-js": "^4.2.0", "element-plus": "^2.13.2", "gsap": "^3.13.0", + "lodash-es": "^4.18.1", "markdown-it": "^14.1.0", "md5": "^2.3.0", "normalize.css": "^8.0.1", diff --git a/src/views/wardrobe/Assets.vue b/src/views/wardrobe/Assets.vue index 2b7847e..8571e9c 100644 --- a/src/views/wardrobe/Assets.vue +++ b/src/views/wardrobe/Assets.vue @@ -38,7 +38,7 @@ -
+
option.value !== 'all').map((option) => option.value) ) - const dataList = ref([ - { - url: img, - title: 'Windswept Burden', - price: '$100.00', - checked: false - } - ]) + const dataList = ref([]) const dataListRef = ref(null) + const assetsScrollRef = ref(null) const gridColumnCount = shallowRef(1) let gridResizeObserver: ResizeObserver | null = null + const assetsRequestId = ref(0) + const isLoadingAssets = ref(false) + const hasMoreAssets = ref(true) const filters = reactive({ categories: [ @@ -149,28 +147,52 @@ ], genders: ['male', 'female'] }) - const pageParams= reactive({ + const pageParams = reactive({ page: 1, size: 10 }) - const handleGetAssets = () => { - fetchMyWardrobe({ - buyerId: buyerId, - categories: [], - designFor: filters.genders.length > 1 ? 'all' : filters.genders[0], - page: pageParams.page, - size: pageParams.size - }).then(res => { - console.log(res) - dataList.value = res.content - }) + const handleGetAssets = async () => { + if (isLoadingAssets.value || !hasMoreAssets.value) return + isLoadingAssets.value = true + const requestId = ++assetsRequestId.value + + try { + const res = await fetchMyWardrobe({ + buyerId: buyerId, + categories: [], + designFor: filters.genders.length > 1 ? 'all' : filters.genders[0] || 'all', + page: pageParams.page, + size: pageParams.size + }) + + if (requestId !== assetsRequestId.value) return + + const content = res.content ?? [] + if (pageParams.page === 1) { + dataList.value = content + } else { + dataList.value = [...dataList.value, ...content] + } + + hasMoreAssets.value = content.length >= pageParams.size + if (hasMoreAssets.value) { + pageParams.page += 1 + } + } finally { + if (requestId === assetsRequestId.value) { + isLoadingAssets.value = false + } + } } watch( () => filters, - (val) => { - console.log(val) - }, + debounce(() => { + pageParams.page = 1 + hasMoreAssets.value = true + assetsRequestId.value += 1 + handleGetAssets() + }, 500), { deep: true } ) @@ -255,6 +277,16 @@ console.log(items) } + const handleAssetsScroll = () => { + const el = assetsScrollRef.value + if (!el || isLoadingAssets.value || !hasMoreAssets.value) return + + const reachBottom = el.scrollTop + el.clientHeight >= el.scrollHeight - 120 + if (reachBottom) { + handleGetAssets() + } + } + const updateGridColumnCount = () => { if (!dataListRef.value) { gridColumnCount.value = 1 @@ -278,20 +310,29 @@ router.push('/digitalItem') } - onMounted(() => { - handleGetAssets() - nextTick(() => { + watch( + () => dataList.value.length, + async (len) => { + if (!len) return + + await nextTick() + updateGridColumnCount() - if (!dataListRef.value || typeof ResizeObserver === 'undefined') { - return - } + gridResizeObserver?.disconnect() - gridResizeObserver = new ResizeObserver(() => { - updateGridColumnCount() - }) - gridResizeObserver.observe(dataListRef.value) - }) + if (dataListRef.value) { + gridResizeObserver = new ResizeObserver(() => { + updateGridColumnCount() + }) + + gridResizeObserver.observe(dataListRef.value) + } + }, + { immediate: true } + ) + onMounted(() => { + handleGetAssets() }) onUnmounted(() => {