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 && 当前示例中的神仙均已绑定。}
}