feat: auto-close modals when success notification appears

- Add closeOthersSignal to success notification store
- Create useCloseOnSuccessNotification hook for modals to subscribe
- Update TopUpModal to auto-close on success events
- Update InsufficientBalancePrompt to auto-close on success events
- Update Subscription page to close all modals/forms on success events

This ensures that when a WebSocket event indicates successful payment
or subscription purchase, all related modals close automatically,
providing clear feedback to users.
This commit is contained in:
c0mrade
2026-01-30 19:54:29 +03:00
parent 175b5608b2
commit 0be1ef0340
4 changed files with 57 additions and 3 deletions

View File

@@ -1,8 +1,9 @@
import { useState } from 'react';
import { useState, useCallback } from 'react';
import { useTranslation } from 'react-i18next';
import { useQuery } from '@tanstack/react-query';
import { balanceApi } from '../api/balance';
import { useCurrency } from '../hooks/useCurrency';
import { useCloseOnSuccessNotification } from '../store/successNotification';
import TopUpModal from './TopUpModal';
import type { PaymentMethod } from '../types';
@@ -28,6 +29,13 @@ export default function InsufficientBalancePrompt({
const [showMethodSelect, setShowMethodSelect] = useState(false);
const [selectedMethod, setSelectedMethod] = useState<PaymentMethod | null>(null);
// Auto-close modals when success notification appears
const handleCloseAll = useCallback(() => {
setShowMethodSelect(false);
setSelectedMethod(null);
}, []);
useCloseOnSuccessNotification(handleCloseAll);
const { data: paymentMethods } = useQuery({
queryKey: ['payment-methods'],
queryFn: balanceApi.getPaymentMethods,

View File

@@ -6,6 +6,7 @@ import { balanceApi } from '../api/balance';
import { useCurrency } from '../hooks/useCurrency';
import { useTelegramWebApp } from '../hooks/useTelegramWebApp';
import { checkRateLimit, getRateLimitResetTime, RATE_LIMIT_KEYS } from '../utils/rateLimit';
import { useCloseOnSuccessNotification } from '../store/successNotification';
import type { PaymentMethod } from '../types';
import BentoCard from './ui/BentoCard';
@@ -144,6 +145,9 @@ export default function TopUpModal({ method, onClose, initialAmountRubles }: Top
onClose();
}, [onClose]);
// Auto-close when success notification appears (e.g., balance topped up via WebSocket)
useCloseOnSuccessNotification(handleClose);
// Keyboard: Escape to close (PC)
useEffect(() => {
const handleKeyDown = (e: KeyboardEvent) => {