feat: add quick payment action and improve copy button UX

Mini App Home Screen:
- Add 'Record Payment' button to utilities and rent period cards
- Pre-fill payment amount with member's share (rentShare/utilityShare)
- Modal dialog with amount input and currency display
- Toast notifications for copy and payment success/failure feedback

Copy Button Improvements:
- Increase spacing between icon and text (4px → 8px)
- Add hover background and padding for better touch target
- Green background highlight when copied (in addition to icon color change)
- Toast notification appears when copying any value

Backend:
- Add /api/miniapp/payments/add endpoint for quick payments
- Payment notifications sent to 'reminders' topic in Telegram
- Include member name, payment type, amount, and period in notification

Files:
- New: apps/miniapp/src/components/ui/toast.tsx
- Modified: apps/miniapp/src/routes/home.tsx, apps/miniapp/src/index.css,
  apps/miniapp/src/theme.css, apps/miniapp/src/i18n.ts,
  apps/bot/src/miniapp-billing.ts, apps/bot/src/server.ts

Quality Gates:  format, lint, typecheck, build, test

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-03-14 08:51:53 +04:00
parent 771d64aa4e
commit 488a488137
45 changed files with 2236 additions and 101 deletions

View File

@@ -103,6 +103,10 @@ type DashboardContextValue = {
purchaseInvestmentChart: () => ReturnType<typeof computePurchaseInvestmentChart>
testingRolePreview: () => TestingRolePreview | null
setTestingRolePreview: (value: TestingRolePreview | null) => void
testingPeriodOverride: () => string | null
setTestingPeriodOverride: (value: string | null) => void
testingTodayOverride: () => string | null
setTestingTodayOverride: (value: string | null) => void
loadDashboardData: (initData: string, isAdmin: boolean) => Promise<void>
applyDemoState: () => void
}
@@ -246,6 +250,8 @@ export function DashboardProvider(props: ParentProps) {
const [cycleState, setCycleState] = createSignal<MiniAppAdminCycleState | null>(null)
const [pendingMembers, setPendingMembers] = createSignal<readonly MiniAppPendingMember[]>([])
const [testingRolePreview, setTestingRolePreview] = createSignal<TestingRolePreview | null>(null)
const [testingPeriodOverride, setTestingPeriodOverride] = createSignal<string | null>(null)
const [testingTodayOverride, setTestingTodayOverride] = createSignal<string | null>(null)
const effectiveIsAdmin = createMemo(() => {
const current = readySession()
@@ -356,6 +362,10 @@ export function DashboardProvider(props: ParentProps) {
purchaseInvestmentChart,
testingRolePreview,
setTestingRolePreview,
testingPeriodOverride,
setTestingPeriodOverride,
testingTodayOverride,
setTestingTodayOverride,
loadDashboardData,
applyDemoState
}}