blob: 5f6642b5d82a6ed78782135e6db149bb7912b78e [file] [log] [blame]
'use client';
import React, { useRef, useState } from 'react';
import { InputText } from 'primereact/inputtext';
import { Button } from 'primereact/button';
import { Card } from 'primereact/card';
import { Tag } from 'primereact/tag';
import { Image } from 'primereact/image';
import { Paginator, PaginatorPageChangeEvent } from 'primereact/paginator';
// 页面跳转
import { useRouter } from 'next/navigation';
// 评分图标
import { Fire } from '@icon-park/react';
import { RobotOne } from '@icon-park/react';
import axios from 'axios';
import './search-page.scss';
interface Resource {
resourceId: number;
resourceName: string;
resourcePicture: string;
resourceSummary: string;
lastUpdateTime: string;
hot: number;
gamePlayList: { gameplayName: string }[];
}
export default function SmartSearchPage() {
const [input, setInput] = useState('');
const [isSearched, setIsSearched] = useState(false);
const [resources, setResources] = useState<Resource[]>([]);
const [page, setPage] = useState(0);
const [rows, setRows] = useState(5);
const [totalRecords, setTotalRecords] = useState(0);
const scrollRef = useRef<HTMLDivElement>(null);
const router = useRouter();
const fetchSearch = async (query: string, page: number, size: number) => {
console.log(page, size,)
const res = await axios.get(process.env.PUBLIC_URL + '/ai', {
params: { input: query, pageNumber: page + 1, rows: size }
});
console.log(res.data.records)
setResources(res.data.records);
setTotalRecords(res.data.total);
scrollRef.current?.scrollTo({ top: 0, behavior: 'smooth' });
};
const handleSearch = () => {
if (input.trim()) {
setIsSearched(true); // ⬅️ 设置为 true,触发样式移动
setPage(0); // 重置到第一页
fetchSearch(input, 0, rows);
}
};
const onPageChange = (e: PaginatorPageChangeEvent) => {
setPage(e.page);
setRows(e.rows);
fetchSearch(input, e.page, e.rows);
};
return (
<div className={`smart-search-page ${!isSearched ? 'centered' : ''}`}>
<div className="search-header">AI 智能搜索助手</div>
<div className="search-input">
<InputText
value={input}
onChange={(e) => setInput(e.target.value)}
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
placeholder="请输入你的需求"
className="input-text"
/>
<Button icon={<RobotOne theme="outline" size="24" fill="#ffffff" />} onClick={handleSearch} className="search-btn" />
</div>
<div className="all-resources-list" ref={scrollRef}>
{resources.map((item) => (
<Card key={item.resourceId} className="all-resources-card" onClick={() => router.push(`/resource/resource-detail/${item.resourceId}`)}>
{/* 左侧图片 */}
<Image
src={process.env.NEXT_PUBLIC_NGINX_URL + item.resourcePicture}
alt={item.resourceName}
width="250" height="140"
preview
/>
{/* 中间内容 */}
<div className="resource-header">
<div className="resource-content">
<h3>{item.resourceName}</h3>
<div className="tags">
{item.gamePlayList.map((tag, i) => (
<Tag key={i} value={tag.gameplayName} />
))}
</div>
</div>
{/* 右侧状态栏 */}
<div className="resources-states">
<div className="state-item">
<Fire theme="outline" size="16" fill="#FF8D1A" />
<span>热度:{item.hot}</span>
</div>
<div className="state-item">
<span>最新更新时间:{item.lastUpdateTime}</span>
</div>
</div>
</div>
</Card>
))}
</div>
{totalRecords > 5 && (<Paginator className="Paginator" first={page * rows} rows={rows} totalRecords={totalRecords} rowsPerPageOptions={[5, 10]} onPageChange={onPageChange} />)}
</div>
);
}