import { useRef, useState } from 'react' import Taro from '@tarojs/taro' import { Button, Image, Text, View } from '@tarojs/components' import { deityCatalog, getDeity, isTiangongDemo, tiangongMock } from '../services/tiangong' import { DeityId } from '../utils/tiangongMock' import { useTiangongSnapshot } from '../hooks/useTiangongSnapshot' import { resolveAssetUrl } from '../services/request' import { openWechatCustomerService } from '../services/customerService' import './DeityBinding.scss' export function BindingGate({ onBind, lock = true }: { onBind: () => void; lock?: boolean }) { return {lock && } 须绑定神仙开启你的守护之旅 } export function DeityCardDialog({ deityId, mode = 'view', onClose }: { deityId: DeityId; mode?: 'bind' | 'view'; onClose: () => void }) { const snapshot = useTiangongSnapshot() const deity = getDeity(deityId)! const state = snapshot.deities[deityId] const [menu, setMenu] = useState(false) const [confirmUnbind, setConfirmUnbind] = useState(false) const [error, setError] = useState('') const [failedImage, setFailedImage] = useState('') const working = useRef(false) const demo = isTiangongDemo() const art = demo ? deity.icon : resolveAssetUrl(state.iconUrl) const canShowArt = !!art && failedImage !== art const perform = (action: () => void) => { if (!demo || working.current) return working.current = true try { action(); onClose() } catch (cause) { setError(cause instanceof Error ? cause.message : '模拟操作失败') } finally { working.current = false } } return ✦{deity.name}✦ {demo && mode === 'view' && } {demo && menu && } {canShowArt ? setFailedImage(art)} /> : {art ? '图片加载失败' : '图片暂未配置'}} 守护神仙 · {deity.name} {demo ? <>唯一 ID:DEMO-{deityId.toUpperCase()}-001Mock 原型演示 · 不连接真实 NFC : state.holdingId ? 持有记录:{state.holdingId} : null} {demo && mode === 'bind' ? <> 每位神仙只能绑定一个微信号哦 : state.unlocked ? ✓已守护 {state.days} 天 : 请通过 NFC 绑定神仙。} {error && {error}} {demo && confirmUnbind && ⓘ 确定要解绑吗? • 解绑后「我的」里面不再展示该神仙 • 该神仙今年还剩 {state.remainingUnbinds} 次 解绑机会 • 用神仙碰触手机 NFC 可再次绑定 {state.remainingUnbinds === 0 && 该神仙今年的解绑次数已用尽,暂不可解绑。} 本次仅模拟;取消不会扣减次数。 {error && {error}} } } export function DeityBindingFlow({ initialDeity, onClose }: { initialDeity?: DeityId; onClose: () => void }) { const [selected, setSelected] = useState(initialDeity || null) const snapshot = useTiangongSnapshot() if (!isTiangongDemo()) return 碰一碰,绑定神仙请通过 NFC 绑定神仙,本次不在页面中模拟真实设备绑定。 if (selected) return const available = deityCatalog.filter(item => !snapshot.deities[item.id].unlocked) return 碰一碰,绑定神仙 Mock 演示:选择要模拟识别的神仙。不会开启 NFC、连接设备或绑定真实微信号。 {available.map(deity => )} {!available.length && 当前示例中的神仙均已绑定。} }