feat(tasks): 任务展示页自适应 —— 一屏 4 或 6 张(按屏幕宽度计算)
- TaskDisplay.jsx:视口宽度→列数(宽≥1600→6,否则 4),grid repeat(cols,1fr),每页 cols 张翻页;导出 columnsFor();移除固定 PAGE_SIZE=3。 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -6,17 +6,32 @@ import '../styles/task-display.css';
|
|||||||
/* 任务展示页:轮播卡片 + 二维码扫码接单。
|
/* 任务展示页:轮播卡片 + 二维码扫码接单。
|
||||||
· 数据:useTasks() 轮询 /park/api/tasks(系统任务中心上墙任务)
|
· 数据:useTasks() 轮询 /park/api/tasks(系统任务中心上墙任务)
|
||||||
· 卡片:分类/状态徽标、标题、摘要(2行)、标签、预算、任务ID + 二维码(扫码即领)
|
· 卡片:分类/状态徽标、标题、摘要(2行)、标签、预算、任务ID + 二维码(扫码即领)
|
||||||
· 轮播:每页若干张,自动翻页;MQTT task_refresh 可触发刷新 */
|
· 自适应:一屏 4 或 6 张(按容器/视口宽度计算,宽≥1600→6,否则 4)
|
||||||
|
· 轮播:每页 cols 张,自动翻页;MQTT task_refresh 可触发刷新 */
|
||||||
|
|
||||||
const PAGE_SIZE = 3;
|
|
||||||
const ROTATE_MS = 14_000;
|
const ROTATE_MS = 14_000;
|
||||||
|
|
||||||
|
/* 按宽度计算每屏列数:只取 4 或 6。 */
|
||||||
|
export function columnsFor(width) {
|
||||||
|
const w = width || (typeof window !== 'undefined' ? window.innerWidth : 1280);
|
||||||
|
return w >= 1600 ? 6 : 4;
|
||||||
|
}
|
||||||
|
|
||||||
export default function TaskDisplay() {
|
export default function TaskDisplay() {
|
||||||
const { tasks, loading, error } = useTasks();
|
const { tasks, loading, error } = useTasks();
|
||||||
const [page, setPage] = useState(0);
|
const [page, setPage] = useState(0);
|
||||||
const [refreshTick, setRefreshTick] = useState(0);
|
const [refreshTick, setRefreshTick] = useState(0);
|
||||||
|
const [cols, setCols] = useState(() => columnsFor());
|
||||||
const tickRef = useRef(0);
|
const tickRef = useRef(0);
|
||||||
|
|
||||||
|
// 视口宽度 → 列数(4 或 6),随屏幕大小自适应
|
||||||
|
useEffect(() => {
|
||||||
|
const update = () => setCols(columnsFor());
|
||||||
|
update();
|
||||||
|
window.addEventListener('resize', update);
|
||||||
|
return () => window.removeEventListener('resize', update);
|
||||||
|
}, []);
|
||||||
|
|
||||||
// 接受 MQTT task_refresh → 触发重新轮询
|
// 接受 MQTT task_refresh → 触发重新轮询
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const onRefresh = () => { tickRef.current += 1; setRefreshTick(tickRef.current); };
|
const onRefresh = () => { tickRef.current += 1; setRefreshTick(tickRef.current); };
|
||||||
@@ -24,8 +39,8 @@ export default function TaskDisplay() {
|
|||||||
return () => window.removeEventListener('dpm:task-control', onRefresh);
|
return () => window.removeEventListener('dpm:task-control', onRefresh);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// 自动翻页(仅当任务多于一页时滚动)
|
const pageSize = cols;
|
||||||
const pageCount = Math.max(1, Math.ceil(tasks.length / PAGE_SIZE));
|
const pageCount = Math.max(1, Math.ceil(tasks.length / pageSize));
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (pageCount <= 1) { setPage(0); return; }
|
if (pageCount <= 1) { setPage(0); return; }
|
||||||
const t = setInterval(() => setPage((p) => (p + 1) % pageCount), ROTATE_MS);
|
const t = setInterval(() => setPage((p) => (p + 1) % pageCount), ROTATE_MS);
|
||||||
@@ -34,9 +49,9 @@ export default function TaskDisplay() {
|
|||||||
|
|
||||||
const visible = useMemo(() => {
|
const visible = useMemo(() => {
|
||||||
if (tasks.length === 0) return [];
|
if (tasks.length === 0) return [];
|
||||||
const start = page * PAGE_SIZE;
|
const start = page * pageSize;
|
||||||
return Array.from({ length: PAGE_SIZE }, (_, i) => tasks[(start + i) % tasks.length]);
|
return Array.from({ length: pageSize }, (_, i) => tasks[(start + i) % tasks.length]);
|
||||||
}, [tasks, page]);
|
}, [tasks, page, pageSize]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="tasks-screen">
|
<div className="tasks-screen">
|
||||||
@@ -53,7 +68,7 @@ export default function TaskDisplay() {
|
|||||||
<div className="tasks-loading">{error}</div>
|
<div className="tasks-loading">{error}</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<div className="tasks-grid">
|
<div className="tasks-grid" style={{ gridTemplateColumns: `repeat(${cols}, 1fr)` }}>
|
||||||
{visible.map((t) => (
|
{visible.map((t) => (
|
||||||
<TaskCard key={t.key} task={t} />
|
<TaskCard key={t.key} task={t} />
|
||||||
))}
|
))}
|
||||||
|
|||||||
Reference in New Issue
Block a user