feat:[FL-49][杆塔模型管理页面添加移动端自适应视图模式]

- 导入 useMobileDetection hook
- 根据设备类型自动选择默认视图模式(移动端默认卡片视图,桌面端默认列表视图)
- 移动端隐藏视图切换控件

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
chengkai3
2026-06-19 16:06:28 +08:00
parent b5b6124261
commit 5e191741a6
+16 -12
View File
@@ -31,6 +31,7 @@ import { AdminPageLoading } from "@/components/admin-page-loading";
import { Card } from "@/components/ui-antd";
import { useToastFeedback } from "@/hooks/use-toast-feedback";
import { useTopicSubscription } from "@/hooks/use-topic-subscription";
import { useMobileDetection } from "@/hooks/use-mobile-detection";
import { readApiError } from "@/lib/api";
import type {
FileListResponse,
@@ -303,6 +304,7 @@ export default function AdminTowerModelsPage() {
const { message: messageApi } = App.useApp();
const [form] = Form.useForm<TowerModelFormValues>();
const fileInputRef = useRef<HTMLInputElement | null>(null);
const isMobile = useMobileDetection();
const [keywordInput, setKeywordInput] = useState("");
const [keyword, setKeyword] = useState("");
const [enabledFilter, setEnabledFilter] = useState<"all" | "enabled" | "disabled">("all");
@@ -310,7 +312,7 @@ export default function AdminTowerModelsPage() {
const [dialogOpen, setDialogOpen] = useState(false);
const [editingModel, setEditingModel] = useState<TowerModelSummary | null>(null);
const [uploadModel, setUploadModel] = useState<TowerModelSummary | null>(null);
const [viewMode, setViewMode] = useState<TowerModelViewMode>("card");
const [viewMode, setViewMode] = useState<TowerModelViewMode>(isMobile ? "card" : "list");
const [pagination, setPagination] = useState({ current: 1, pageSize: TOWER_MODEL_DEFAULT_PAGE_SIZE });
const [tableScrollY, setTableScrollY] = useState(TOWER_MODEL_CARD_MIN_SCROLL_Y);
const viewScrollAnchorRef = useRef<HTMLDivElement | null>(null);
@@ -742,17 +744,19 @@ export default function AdminTowerModelsPage() {
<Button onClick={handleResetFilters}></Button>
</Form.Item>
</Form>
<Space size={8} align="center" wrap>
<Typography.Text type="secondary"></Typography.Text>
<Segmented
options={[
{ label: "卡片", value: "card" },
{ label: "列表", value: "list" },
]}
value={viewMode}
onChange={(value) => setViewMode(value === "list" ? "list" : "card")}
/>
</Space>
{!isMobile && (
<Space size={8} align="center" wrap>
<Typography.Text type="secondary"></Typography.Text>
<Segmented
options={[
{ label: "卡片", value: "card" },
{ label: "列表", value: "list" },
]}
value={viewMode}
onChange={(value) => setViewMode(value === "list" ? "list" : "card")}
/>
</Space>
)}
{totalItems === 0 ? (
<Empty description="暂无杆塔模型数据" image={Empty.PRESENTED_IMAGE_SIMPLE} />
) : (