mirror of
https://github.com/whekin/household-bot.git
synced 2026-03-31 14:04:04 +00:00
feat(miniapp): back data loads with query cache
This commit is contained in:
@@ -1,6 +1,14 @@
|
|||||||
import { Match, Switch, createMemo, createSignal, onMount } from 'solid-js'
|
import { Match, Switch, createMemo, createSignal, onMount } from 'solid-js'
|
||||||
|
|
||||||
import { dictionary, type Locale } from './i18n'
|
import { dictionary, type Locale } from './i18n'
|
||||||
|
import {
|
||||||
|
fetchAdminSettingsQuery,
|
||||||
|
fetchBillingCycleQuery,
|
||||||
|
fetchDashboardQuery,
|
||||||
|
fetchPendingMembersQuery,
|
||||||
|
fetchSessionQuery,
|
||||||
|
invalidateHouseholdQueries
|
||||||
|
} from './app/miniapp-queries'
|
||||||
import {
|
import {
|
||||||
addMiniAppUtilityBill,
|
addMiniAppUtilityBill,
|
||||||
addMiniAppPayment,
|
addMiniAppPayment,
|
||||||
@@ -9,11 +17,6 @@ import {
|
|||||||
deleteMiniAppPayment,
|
deleteMiniAppPayment,
|
||||||
deleteMiniAppPurchase,
|
deleteMiniAppPurchase,
|
||||||
deleteMiniAppUtilityBill,
|
deleteMiniAppUtilityBill,
|
||||||
fetchMiniAppAdminSettings,
|
|
||||||
fetchMiniAppBillingCycle,
|
|
||||||
fetchMiniAppDashboard,
|
|
||||||
fetchMiniAppPendingMembers,
|
|
||||||
fetchMiniAppSession,
|
|
||||||
joinMiniAppHousehold,
|
joinMiniAppHousehold,
|
||||||
openMiniAppBillingCycle,
|
openMiniAppBillingCycle,
|
||||||
promoteMiniAppMember,
|
promoteMiniAppMember,
|
||||||
@@ -821,7 +824,7 @@ function App() {
|
|||||||
|
|
||||||
async function loadDashboard(initData: string) {
|
async function loadDashboard(initData: string) {
|
||||||
try {
|
try {
|
||||||
const nextDashboard = await fetchMiniAppDashboard(initData)
|
const nextDashboard = await fetchDashboardQuery(initData)
|
||||||
setDashboard(nextDashboard)
|
setDashboard(nextDashboard)
|
||||||
setPurchaseDraftMap(purchaseDrafts(nextDashboard.ledger))
|
setPurchaseDraftMap(purchaseDrafts(nextDashboard.ledger))
|
||||||
setPaymentDraftMap(paymentDrafts(nextDashboard.ledger))
|
setPaymentDraftMap(paymentDrafts(nextDashboard.ledger))
|
||||||
@@ -838,7 +841,7 @@ function App() {
|
|||||||
|
|
||||||
async function loadPendingMembers(initData: string) {
|
async function loadPendingMembers(initData: string) {
|
||||||
try {
|
try {
|
||||||
setPendingMembers(await fetchMiniAppPendingMembers(initData))
|
setPendingMembers(await fetchPendingMembersQuery(initData))
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
if (import.meta.env.DEV) {
|
if (import.meta.env.DEV) {
|
||||||
console.warn('Failed to load pending mini app members', error)
|
console.warn('Failed to load pending mini app members', error)
|
||||||
@@ -850,7 +853,7 @@ function App() {
|
|||||||
|
|
||||||
async function loadAdminSettings(initData: string) {
|
async function loadAdminSettings(initData: string) {
|
||||||
try {
|
try {
|
||||||
const payload = await fetchMiniAppAdminSettings(initData)
|
const payload = await fetchAdminSettingsQuery(initData)
|
||||||
setAdminSettings(payload)
|
setAdminSettings(payload)
|
||||||
setMemberDisplayNameDrafts(
|
setMemberDisplayNameDrafts(
|
||||||
Object.fromEntries(payload.members.map((member) => [member.id, member.displayName]))
|
Object.fromEntries(payload.members.map((member) => [member.id, member.displayName]))
|
||||||
@@ -909,7 +912,7 @@ function App() {
|
|||||||
|
|
||||||
async function loadCycleState(initData: string) {
|
async function loadCycleState(initData: string) {
|
||||||
try {
|
try {
|
||||||
const payload = await fetchMiniAppBillingCycle(initData)
|
const payload = await fetchBillingCycleQuery(initData)
|
||||||
setCycleState(payload)
|
setCycleState(payload)
|
||||||
setUtilityBillDrafts(cycleUtilityBillDrafts(payload.utilityBills))
|
setUtilityBillDrafts(cycleUtilityBillDrafts(payload.utilityBills))
|
||||||
setCycleForm((current) => ({
|
setCycleForm((current) => ({
|
||||||
@@ -938,7 +941,15 @@ function App() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function refreshHouseholdData(initData: string, includeAdmin = false) {
|
async function refreshHouseholdData(
|
||||||
|
initData: string,
|
||||||
|
includeAdmin = false,
|
||||||
|
forceRefresh = false
|
||||||
|
) {
|
||||||
|
if (forceRefresh) {
|
||||||
|
await invalidateHouseholdQueries(initData)
|
||||||
|
}
|
||||||
|
|
||||||
await loadDashboard(initData)
|
await loadDashboard(initData)
|
||||||
|
|
||||||
if (includeAdmin) {
|
if (includeAdmin) {
|
||||||
@@ -1044,7 +1055,7 @@ function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const payload = await fetchMiniAppSession(initData, joinContext().joinToken)
|
const payload = await fetchSessionQuery(initData, joinContext().joinToken)
|
||||||
if (!payload.authorized || !payload.member || !payload.telegramUser) {
|
if (!payload.authorized || !payload.member || !payload.telegramUser) {
|
||||||
setLocale(
|
setLocale(
|
||||||
payload.onboarding?.householdDefaultLocale ??
|
payload.onboarding?.householdDefaultLocale ??
|
||||||
@@ -1528,7 +1539,7 @@ function App() {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
await refreshHouseholdData(initData, true)
|
await refreshHouseholdData(initData, true, true)
|
||||||
setEditingPurchaseId(null)
|
setEditingPurchaseId(null)
|
||||||
} finally {
|
} finally {
|
||||||
setSavingPurchaseId(null)
|
setSavingPurchaseId(null)
|
||||||
@@ -1546,7 +1557,7 @@ function App() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await deleteMiniAppPurchase(initData, purchaseId)
|
await deleteMiniAppPurchase(initData, purchaseId)
|
||||||
await refreshHouseholdData(initData, true)
|
await refreshHouseholdData(initData, true, true)
|
||||||
setEditingPurchaseId((current) => (current === purchaseId ? null : current))
|
setEditingPurchaseId((current) => (current === purchaseId ? null : current))
|
||||||
} finally {
|
} finally {
|
||||||
setDeletingPurchaseId(null)
|
setDeletingPurchaseId(null)
|
||||||
@@ -1575,7 +1586,7 @@ function App() {
|
|||||||
...current,
|
...current,
|
||||||
amountMajor: ''
|
amountMajor: ''
|
||||||
}))
|
}))
|
||||||
await refreshHouseholdData(initData, true)
|
await refreshHouseholdData(initData, true, true)
|
||||||
setAddingPaymentOpen(false)
|
setAddingPaymentOpen(false)
|
||||||
} finally {
|
} finally {
|
||||||
setAddingPayment(false)
|
setAddingPayment(false)
|
||||||
@@ -1607,7 +1618,7 @@ function App() {
|
|||||||
amountMajor: draft.amountMajor,
|
amountMajor: draft.amountMajor,
|
||||||
currency: draft.currency
|
currency: draft.currency
|
||||||
})
|
})
|
||||||
await refreshHouseholdData(initData, true)
|
await refreshHouseholdData(initData, true, true)
|
||||||
setEditingPaymentId(null)
|
setEditingPaymentId(null)
|
||||||
} finally {
|
} finally {
|
||||||
setSavingPaymentId(null)
|
setSavingPaymentId(null)
|
||||||
@@ -1625,7 +1636,7 @@ function App() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
await deleteMiniAppPayment(initData, paymentId)
|
await deleteMiniAppPayment(initData, paymentId)
|
||||||
await refreshHouseholdData(initData, true)
|
await refreshHouseholdData(initData, true, true)
|
||||||
setEditingPaymentId((current) => (current === paymentId ? null : current))
|
setEditingPaymentId((current) => (current === paymentId ? null : current))
|
||||||
} finally {
|
} finally {
|
||||||
setDeletingPaymentId(null)
|
setDeletingPaymentId(null)
|
||||||
|
|||||||
76
apps/miniapp/src/app/miniapp-queries.ts
Normal file
76
apps/miniapp/src/app/miniapp-queries.ts
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
import { miniAppQueryClient } from './query-client'
|
||||||
|
import {
|
||||||
|
fetchMiniAppAdminSettings,
|
||||||
|
fetchMiniAppBillingCycle,
|
||||||
|
fetchMiniAppDashboard,
|
||||||
|
fetchMiniAppPendingMembers,
|
||||||
|
fetchMiniAppSession,
|
||||||
|
type MiniAppAdminCycleState,
|
||||||
|
type MiniAppAdminSettingsPayload,
|
||||||
|
type MiniAppDashboard,
|
||||||
|
type MiniAppPendingMember,
|
||||||
|
type MiniAppSession
|
||||||
|
} from '../miniapp-api'
|
||||||
|
|
||||||
|
export const miniAppQueryKeys = {
|
||||||
|
session: (initData: string, joinToken?: string) =>
|
||||||
|
['miniapp', 'session', initData, joinToken ?? null] as const,
|
||||||
|
dashboard: (initData: string) => ['miniapp', 'dashboard', initData] as const,
|
||||||
|
pendingMembers: (initData: string) => ['miniapp', 'pending-members', initData] as const,
|
||||||
|
adminSettings: (initData: string) => ['miniapp', 'admin-settings', initData] as const,
|
||||||
|
billingCycle: (initData: string) => ['miniapp', 'billing-cycle', initData] as const
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchSessionQuery(initData: string, joinToken?: string): Promise<MiniAppSession> {
|
||||||
|
return miniAppQueryClient.fetchQuery({
|
||||||
|
queryKey: miniAppQueryKeys.session(initData, joinToken),
|
||||||
|
queryFn: () => fetchMiniAppSession(initData, joinToken)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchDashboardQuery(initData: string): Promise<MiniAppDashboard> {
|
||||||
|
return miniAppQueryClient.fetchQuery({
|
||||||
|
queryKey: miniAppQueryKeys.dashboard(initData),
|
||||||
|
queryFn: () => fetchMiniAppDashboard(initData)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchPendingMembersQuery(
|
||||||
|
initData: string
|
||||||
|
): Promise<readonly MiniAppPendingMember[]> {
|
||||||
|
return miniAppQueryClient.fetchQuery({
|
||||||
|
queryKey: miniAppQueryKeys.pendingMembers(initData),
|
||||||
|
queryFn: () => fetchMiniAppPendingMembers(initData)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchAdminSettingsQuery(initData: string): Promise<MiniAppAdminSettingsPayload> {
|
||||||
|
return miniAppQueryClient.fetchQuery({
|
||||||
|
queryKey: miniAppQueryKeys.adminSettings(initData),
|
||||||
|
queryFn: () => fetchMiniAppAdminSettings(initData)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function fetchBillingCycleQuery(initData: string): Promise<MiniAppAdminCycleState> {
|
||||||
|
return miniAppQueryClient.fetchQuery({
|
||||||
|
queryKey: miniAppQueryKeys.billingCycle(initData),
|
||||||
|
queryFn: () => fetchMiniAppBillingCycle(initData)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function invalidateHouseholdQueries(initData: string) {
|
||||||
|
await Promise.all([
|
||||||
|
miniAppQueryClient.invalidateQueries({
|
||||||
|
queryKey: miniAppQueryKeys.dashboard(initData)
|
||||||
|
}),
|
||||||
|
miniAppQueryClient.invalidateQueries({
|
||||||
|
queryKey: miniAppQueryKeys.pendingMembers(initData)
|
||||||
|
}),
|
||||||
|
miniAppQueryClient.invalidateQueries({
|
||||||
|
queryKey: miniAppQueryKeys.adminSettings(initData)
|
||||||
|
}),
|
||||||
|
miniAppQueryClient.invalidateQueries({
|
||||||
|
queryKey: miniAppQueryKeys.billingCycle(initData)
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user