|
@@ -1,9 +1,8 @@
|
|
|
-import React, { useState, useEffect } from 'react'
|
|
|
|
|
|
|
+import React, { useState } from 'react'
|
|
|
import { View, Text, ScrollView, Input } from '@tarojs/components'
|
|
import { View, Text, ScrollView, Input } from '@tarojs/components'
|
|
|
import { useInfiniteQuery } from '@tanstack/react-query'
|
|
import { useInfiniteQuery } from '@tanstack/react-query'
|
|
|
import Taro, { useRouter } from '@tarojs/taro'
|
|
import Taro, { useRouter } from '@tarojs/taro'
|
|
|
import { Navbar } from '@/components/ui/navbar'
|
|
import { Navbar } from '@/components/ui/navbar'
|
|
|
-import TDesignSearch from '@/components/tdesign/search'
|
|
|
|
|
import GoodsList from '@/components/goods-list'
|
|
import GoodsList from '@/components/goods-list'
|
|
|
import { goodsClient } from '@/api'
|
|
import { goodsClient } from '@/api'
|
|
|
import { InferResponseType } from 'hono'
|
|
import { InferResponseType } from 'hono'
|
|
@@ -12,7 +11,22 @@ import type { GoodsData } from '@/components/goods-card'
|
|
|
import './index.css'
|
|
import './index.css'
|
|
|
|
|
|
|
|
type GoodsResponse = InferResponseType<typeof goodsClient.$get, 200>
|
|
type GoodsResponse = InferResponseType<typeof goodsClient.$get, 200>
|
|
|
-type Goods = GoodsResponse['data'][0]
|
|
|
|
|
|
|
+
|
|
|
|
|
+// 显式定义 Goods 类型,避免类型推断为 never
|
|
|
|
|
+interface Goods {
|
|
|
|
|
+ id: number
|
|
|
|
|
+ name: string
|
|
|
|
|
+ price: number
|
|
|
|
|
+ costPrice?: number
|
|
|
|
|
+ salesNum: number
|
|
|
|
|
+ stock: number
|
|
|
|
|
+ spuId: number
|
|
|
|
|
+ imageFile?: {
|
|
|
|
|
+ fullUrl: string
|
|
|
|
|
+ }
|
|
|
|
|
+ childGoodsIds?: number[]
|
|
|
|
|
+ originPrice?: number
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
const SearchResultPage: React.FC = () => {
|
|
const SearchResultPage: React.FC = () => {
|
|
|
const { addToCart } = useCart()
|
|
const { addToCart } = useCart()
|
|
@@ -60,7 +74,7 @@ const SearchResultPage: React.FC = () => {
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
// 合并所有分页数据
|
|
// 合并所有分页数据
|
|
|
- const allGoods = data?.pages.flatMap(page => page.data) || []
|
|
|
|
|
|
|
+ const allGoods: Goods[] = data?.pages.flatMap(page => page.data) || []
|
|
|
|
|
|
|
|
// 触底加载更多
|
|
// 触底加载更多
|
|
|
const handleScrollToLower = () => {
|
|
const handleScrollToLower = () => {
|
|
@@ -112,7 +126,33 @@ const SearchResultPage: React.FC = () => {
|
|
|
|
|
|
|
|
// 添加到购物车
|
|
// 添加到购物车
|
|
|
const handleAddToCart = (goodsData: GoodsData) => {
|
|
const handleAddToCart = (goodsData: GoodsData) => {
|
|
|
- // 直接使用传递的商品数据,不再依赖原始商品查找
|
|
|
|
|
|
|
+ console.debug('[search-result] handleAddToCart called', { goodsData, hasSpecOptions: goodsData.hasSpecOptions })
|
|
|
|
|
+
|
|
|
|
|
+ // 如果有子商品(有规格),跳转到详情页并弹开规格弹框
|
|
|
|
|
+ if (goodsData.hasSpecOptions) {
|
|
|
|
|
+ let goodsId: number
|
|
|
|
|
+ if (typeof goodsData.id === 'number') {
|
|
|
|
|
+ goodsId = goodsData.id
|
|
|
|
|
+ } else if (typeof goodsData.id === 'string') {
|
|
|
|
|
+ goodsId = parseInt(goodsData.id, 10)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ console.error('商品ID类型无效:', goodsData.id, typeof goodsData.id)
|
|
|
|
|
+ Taro.showToast({ title: '商品ID错误', icon: 'none' })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ if (isNaN(goodsId)) {
|
|
|
|
|
+ console.error('商品ID解析失败:', goodsData.id)
|
|
|
|
|
+ Taro.showToast({ title: '商品ID错误', icon: 'none' })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ // 跳转到详情页,并传递 showSpecModal=1 参数,让详情页自动弹开规格弹框
|
|
|
|
|
+ Taro.navigateTo({
|
|
|
|
|
+ url: `/pages/goods-detail/index?id=${goodsId}&showSpecModal=1`
|
|
|
|
|
+ })
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 没有子商品,直接加入购物车
|
|
|
const id = parseInt(goodsData.id)
|
|
const id = parseInt(goodsData.id)
|
|
|
if (isNaN(id)) {
|
|
if (isNaN(id)) {
|
|
|
console.error('商品ID解析失败:', goodsData.id)
|
|
console.error('商品ID解析失败:', goodsData.id)
|