V4.0.9版本更新合伙人H5端调整
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user