feat: refine login flows and integrate tiangong worship audio
This commit is contained in:
1 parent
bc7bbc52c8
commit
38fc4187ea
49 files changed
+1786
-224
No files matched your search
@@ -1,4 +1,7 @@
|
||||
import { request } from './request'
|
||||
import { getToken, request, subscribeProfile } from './request'
|
||||
import { isFrontendPreview } from './frontendPreview'
|
||||
import { isAvatarDemo } from './avatarDemo'
|
||||
import { createTiangongStore, RemoteDeity } from '../utils/tiangongStore'
|
||||
import { createTiangongMock, DeityId } from '../utils/tiangongMock'
|
||||
import wealth from '../assets/tiangong/proto-wealth.jpg'
|
||||
import fortune from '../assets/tiangong/proto-fortune.jpg'
|
||||
@@ -18,6 +21,32 @@ export const deityCatalog: Deity[] = [
|
||||
]
|
||||
export const getDeity = (id: string | undefined) => deityCatalog.find(item => item.id === id)
|
||||
export const tiangongMock = createTiangongMock()
|
||||
export const isTiangongDemo = () => isFrontendPreview() || isAvatarDemo()
|
||||
const live = createTiangongStore({
|
||||
key: getToken,
|
||||
resolve: name => deityCatalog.find(item => item.name === name || item.ritualName === name)?.id,
|
||||
load: () => request<RemoteDeity[]>('/api/tiangong/items'),
|
||||
offer: (holdingId, type, content) => request<{ id: number }>('/api/user/virtual-items/offerings', { method: 'POST', data: { userVirtualItemId: holdingId, offeringType: type, content } }),
|
||||
dedicate: (holdingId, name, content) => request<{ id: number }>('/api/user/virtual-items/dedications', { method: 'POST', data: { userVirtualItemId: holdingId, name, content } })
|
||||
})
|
||||
export const tiangongSession = {
|
||||
snapshot: () => isTiangongDemo() ? tiangongMock.snapshot() : live.snapshot(),
|
||||
refresh: (force = false) => isTiangongDemo() ? Promise.resolve() : live.refresh(force),
|
||||
subscribe: (listener: () => void) => {
|
||||
const demo = tiangongMock.subscribe(listener), remote = live.subscribe(listener)
|
||||
const account = subscribeProfile(() => { listener(); tiangongSession.refresh().catch(() => {}) })
|
||||
return () => { demo(); remote(); account() }
|
||||
},
|
||||
incense: (id: DeityId) => {
|
||||
if (!isTiangongDemo()) return live.incense(id)
|
||||
const startsRound = !tiangongMock.snapshot().deities[id].lit
|
||||
tiangongMock.incense(id)
|
||||
return { startsRound }
|
||||
},
|
||||
refreshIncense: (id: DeityId) => isTiangongDemo() ? tiangongMock.refreshIncense(id) : live.refreshIncense(),
|
||||
wish: async (id: DeityId, text: string) => { if (isTiangongDemo()) tiangongMock.wish(id, text); else await live.wish(id, text) },
|
||||
dedicate: async (id: DeityId, name: string, text: string) => { if (isTiangongDemo()) tiangongMock.dedicate(id, name, text); else await live.dedicate(id, name, text) }
|
||||
}
|
||||
export const listMockDeities = () => { const snapshot = tiangongMock.snapshot(); return deityCatalog.map(item => ({ ...item, ...snapshot.deities[item.id] })) }
|
||||
|
||||
export type DeityBindingInfo = {
|
||||
@@ -30,17 +59,12 @@ export type DeityBindingInfo = {
|
||||
}
|
||||
export type UnbindResult = { binding: DeityBindingInfo; hasAnyBoundDeity: boolean }
|
||||
|
||||
// 未接入,不会自动请求。GET沿用现有路径;所有POST及钱包/支架路径为拟定契约,待后端确认。
|
||||
// 其余绑定/送神契约尚未接入,不会自动请求。实际供奉接口见 tiangongSession。
|
||||
export const tiangongRemoteContract = {
|
||||
list: () => request<unknown[]>('/api/tiangong/items'),
|
||||
detail: (id: DeityId) => request<unknown>(`/api/tiangong/items/${id}`),
|
||||
invite: (id: DeityId, bindingId: string) => request<unknown>(`/api/tiangong/items/${id}/invite`, { method: 'POST', data: { bindingId } }),
|
||||
incense: (id: DeityId) => request<unknown>(`/api/tiangong/items/${id}/incense`, { method: 'POST' }),
|
||||
wish: (id: DeityId, text: string) => request<unknown>(`/api/tiangong/items/${id}/wishes`, { method: 'POST', data: { text } }),
|
||||
dedicate: (id: DeityId, name: string, text: string) => request<unknown>(`/api/tiangong/items/${id}/dedications`, { method: 'POST', data: { name, text } }),
|
||||
sendOff: (id: DeityId) => request<unknown>(`/api/tiangong/items/${id}/send-off`, { method: 'POST' }),
|
||||
offering: (id: DeityId, amount: number) => request<unknown>(`/api/tiangong/items/${id}/offerings`, { method: 'POST', data: { amount } }),
|
||||
wallet: () => request<unknown>('/api/tiangong/wallet'),
|
||||
binding: (bindingId: string) => request<DeityBindingInfo>(`/api/tiangong/bindings/${encodeURIComponent(bindingId)}`),
|
||||
// 拟定接口:服务端需验证NFC凭证、一物一账号及年度额度。Mock不会调用。
|
||||
resolveBinding: (nfcCredential: string) => request<DeityBindingInfo>('/api/tiangong/bindings/resolve', { method: 'POST', data: { nfcCredential } }),
|
||||
|
||||
Reference in new issue
Block a user