(() => {
+ const playerResults: SearchResult[] = filteredPlayers.map((player) => ({
+ type: "player",
+ id: player.id,
+ rating: player.rating,
+ orders: player.totalOrders,
+ minPrice: Math.min(...player.services.map((service) => service.price)),
+ item: player,
+ }))
+ const shopResults: SearchResult[] = filteredShops.map((item) => ({
+ type: "shop",
+ id: item.shop.id,
+ rating: item.shop.rating,
+ orders: item.shop.totalOrders,
+ minPrice: item.minPrice,
+ item,
+ }))
+
+ return [...playerResults, ...shopResults].sort((a, b) => {
switch (sortBy) {
case "rating":
return b.rating - a.rating
- case "price_asc": {
- const priceA = Math.min(...a.services.map((s) => s.price))
- const priceB = Math.min(...b.services.map((s) => s.price))
- return priceA - priceB
- }
- case "price_desc": {
- const priceA = Math.min(...a.services.map((s) => s.price))
- const priceB = Math.min(...b.services.map((s) => s.price))
- return priceB - priceA
- }
+ case "price_asc":
+ return a.minPrice - b.minPrice
+ case "price_desc":
+ return b.minPrice - a.minPrice
case "orders":
- return b.totalOrders - a.totalOrders
+ return b.orders - a.orders
case "composite": {
- const scoreA = a.rating * Math.log10(a.totalOrders + 1)
- const scoreB = b.rating * Math.log10(b.totalOrders + 1)
+ const scoreA = a.rating * Math.log10(a.orders + 1)
+ const scoreB = b.rating * Math.log10(b.orders + 1)
return scoreB - scoreA
}
default:
return 0
}
})
- }, [filteredPlayers, sortBy])
+ }, [filteredPlayers, filteredShops, sortBy])
- const displayedPlayers = sortedPlayers.slice(0, visibleCount)
+ const displayedResults = sortedResults.slice(0, visibleCount)
return (
@@ -421,7 +571,7 @@ function SearchPageContent() {
-
+
@@ -509,14 +659,20 @@ function SearchPageContent() {
- 共找到 {filteredPlayers.length} 位陪玩
+ 共找到 {sortedResults.length} 位陪玩
- {displayedPlayers.length > 0 ? (
+ {displayedResults.length > 0 ? (
- {displayedPlayers.map((player) => (
-
+ {displayedResults.map((result) => (
+
+ {result.type === "player" ? (
+
+ ) : (
+
+ )}
+
))}
) : (
@@ -544,7 +700,7 @@ function SearchPageContent() {
)}
- {filteredPlayers.length > visibleCount && (
+ {sortedResults.length > visibleCount && (