feat(screen): 园区大屏园区资讯 widget

- ParkFeed 拉取 /park/api/content/feed,滚动展示本园区内容标题;图标用 @appica/icons-react(禁用emoji)
- DataScreen 挂载 ParkFeed

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Pine
2026-08-27 15:53:38 +08:00
parent 64b998eb2a
commit 8ee08854cd
2 changed files with 36 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
import React, { useEffect, useState } from 'react';
import { Broadcast } from '@appica/icons-react';
import { getApiBase } from '../config';
import '../styles/datascreen.css';
/** 园区资讯 widget:拉取本园区内容(/park/api/content/feed),滚动展示标题(大屏)。 */
export default function ParkFeed() {
const [items, setItems] = useState([]);
useEffect(() => {
let alive = true;
fetch(`${getApiBase()}/api/content/feed`, { cache: 'no-store' })
.then((r) => r.json())
.then((d) => { if (alive) setItems(Array.isArray(d?.items) ? d.items : []); })
.catch(() => {});
return () => { alive = false; };
}, []);
if (!items.length) return null;
return (
<div className="bd-feed" style={{ marginTop: 12 }}>
<div className="bd-ticker-title"><Broadcast size={12} style={{ verticalAlign: '-1px', marginRight: 6 }} />园区资讯 <span>({items.length})</span></div>
<div className="bd-ticker">
<div className="bd-ticker-inner">
{[...items, ...items].map((c, i) => (
<div className="bd-ticker-item" key={i} title={c.title}>
<span className="bd-ticker-dot" />
{c.title}
</div>
))}
</div>
</div>
</div>
);
}
+3
View File
@@ -2,6 +2,7 @@ import { useState, useEffect, useRef } from 'react';
import '../styles/datascreen.css';
import Icon from '../components/Icons';
import ParkOverviewStrip from '../components/ParkOverviewStrip';
import ParkFeed from '../components/ParkFeed';
import { useParkSim } from '../utils/parkData';
/* =========================================================
@@ -576,6 +577,8 @@ export default function DataScreen() {
</div>
</section>
<ParkFeed />
{/* 园区概览(保持在最底部) */}
<ParkOverviewStrip d={d} />
</div>