V4.0.9版本更新合伙人H5端调整

This commit is contained in:
2026-09-02 09:46:41 +08:00
parent af3c4b6f08
commit c905b3f930
33 changed files with 893 additions and 176 deletions
+47 -26
View File
@@ -16,6 +16,8 @@ import { toastError, toastSuccess } from '../lib/toast';
import { blobToDataUrl, isHttpImageUrl, previewSaveableImage } from '../lib/wechat-save-image';
import { isWechatEnv } from '../lib/weixin';
import { usePartnerPageView } from '../lib/usePageView';
import { usePartnerSession } from '../contexts/PartnerSessionContext';
import { isSubAccount } from '../lib/partnerAccess';
type ListRes = { items: PartnerAssocUserItem[]; total: number };
@@ -38,6 +40,8 @@ function fmtTime(iso?: string | null) {
export default function UsersManagePage() {
usePartnerPageView('partner_users_manage_view');
const { account } = usePartnerSession();
const hidePoster = isSubAccount(account);
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const [summary, setSummary] = useState<PartnerAssocSummary | null>(null);
@@ -63,7 +67,7 @@ export default function UsersManagePage() {
}, [previewUrl]);
useEffect(() => {
const posterId = summary?.activityPosterId;
const posterId = hidePoster ? null : summary?.activityPosterId;
if (!posterId) {
setHeroUrl(null);
setHeroLoading(false);
@@ -88,7 +92,7 @@ export default function UsersManagePage() {
cancelled = true;
if (acc.url) URL.revokeObjectURL(acc.url);
};
}, [summary?.activityPosterId]);
}, [hidePoster, summary?.activityPosterId]);
const loadSummary = useCallback(async () => {
const data = await request<PartnerAssocSummary>('PARTNER_H5', '/partner/assoc');
@@ -130,7 +134,7 @@ export default function UsersManagePage() {
}, [searchParams, navigate]);
async function downloadMainImage() {
const posterId = summary?.activityPosterId;
const posterId = hidePoster ? null : summary?.activityPosterId;
try {
if (isWechatEnv() && !posterId && isHttpImageUrl(summary?.qrcodeUrl)) {
await previewSaveableImage(summary.qrcodeUrl);
@@ -190,14 +194,14 @@ export default function UsersManagePage() {
<p className="body-md text-muted" style={{ marginBottom: 12 }}>
</p>
{summary?.activityPosterId && (previewUrl || heroUrl) ? (
{summary?.activityPosterId && !hidePoster && (previewUrl || heroUrl) ? (
<img
className="partner-longpress-img"
src={previewUrl || heroUrl || ''}
alt="活动图"
style={{ width: '100%', maxWidth: 360, background: '#f5f5f5' }}
/>
) : summary?.activityPosterId && heroLoading ? (
) : summary?.activityPosterId && !hidePoster && heroLoading ? (
<p className="body-md text-muted"></p>
) : previewUrl || summary?.qrcodeUrl ? (
<img
@@ -209,19 +213,27 @@ export default function UsersManagePage() {
) : (
<p className="body-md text-muted">{loading ? '加载中…' : '关联码尚未生成'}</p>
)}
<p className="label-md text-muted" style={{ marginTop: 8 }}>
{summary?.userCount ?? total}
</p>
{(() => {
const scanCount = summary?.scanCount ?? 0;
const userCount = summary?.userCount ?? total;
if (scanCount <= 0 && userCount <= 0) return null;
return (
<p className="label-md text-muted" style={{ marginTop: 8 }}>
{scanCount} · {userCount}
</p>
);
})()}
<button type="button" className="partner-btn-primary" style={{ marginTop: 16 }} onClick={() => void downloadMainImage()}>
{summary?.activityPosterId ? '下载活动图' : '下载二维码'}
{summary?.activityPosterId && !hidePoster ? '下载活动图' : '下载二维码'}
</button>
{isWechatEnv() && (previewUrl || summary?.qrcodeUrl) ? (
<p className="label-md text-muted" style={{ marginTop: 8 }}>
{summary?.activityPosterId ? '下载活动图' : '下载二维码'}
{summary?.activityPosterId && !hidePoster ? '下载活动图' : '下载二维码'}
</p>
) : null}
</section>
{!hidePoster && (
<Link to="/center/activity-posters" className="partner-menu-card" style={{ display: 'block', marginBottom: 20, textDecoration: 'none', color: 'inherit' }}>
<div className="partner-menu-item">
<div className="partner-menu-item-left">
@@ -233,6 +245,7 @@ export default function UsersManagePage() {
<span className="material-symbols-outlined text-muted">chevron_right</span>
</div>
</Link>
)}
<h2 className="headline-md" style={{ marginBottom: 12 }}></h2>
<div className="partner-search">
@@ -264,32 +277,40 @@ export default function UsersManagePage() {
{!loading && items.length === 0 && <div className="empty"></div>}
{items.map((u) => (
<div key={u.id} className="partner-store-card" style={{ marginBottom: 12 }}>
<div className="partner-store-card-header" style={{ marginBottom: 8 }}>
<div>
<p className="body-md">{formatUserLabel(u)}</p>
<p className="label-md text-muted">{u.phone || '未绑定手机'}</p>
<p className="label-md text-muted"> {fmtTime(u.createdAt)}</p>
</div>
<div className="partner-store-card-header" style={{ marginBottom: 4 }}>
<p className="body-md">{formatUserLabel(u)}</p>
<button
type="button"
className="label-md text-primary"
style={{ background: 'none', border: 0, padding: 0 }}
style={{ background: 'none', border: 0, padding: 0, flexShrink: 0 }}
onClick={() => navigate(`/users/${u.id}/orders`)}
>
{u.orderCount}
</button>
</div>
<button
type="button"
className="label-md text-primary"
style={{ background: 'none', border: 0, padding: 0 }}
onClick={() => {
setEditing(u);
setRemarkDraft(u.partnerRemark ?? '');
<p className="label-md text-muted">{u.phone || '未绑定手机'}</p>
<div
style={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
gap: 12,
marginTop: 4,
}}
>
{u.partnerRemark ? '改备注' : '添加备注'}
</button>
<p className="label-md text-muted"> {fmtTime(u.createdAt)}</p>
<button
type="button"
className="label-md text-primary"
style={{ background: 'none', border: 0, padding: 0, flexShrink: 0 }}
onClick={() => {
setEditing(u);
setRemarkDraft(u.partnerRemark ?? '');
}}
>
{u.partnerRemark ? '改备注' : '添加备注'}
</button>
</div>
</div>
))}
</div>