аменена перезагрузка страницы на модальное окно после успешной оплаты токенов
This commit is contained in:
parent
c1d4a2862b
commit
d40aae12cf
@ -6,6 +6,7 @@ import apiService from '../../services/api';
|
|||||||
import TokenPacksModal from '../tokens/TokenPacksModal';
|
import TokenPacksModal from '../tokens/TokenPacksModal';
|
||||||
import { paymentService } from '../../services/paymentService';
|
import { paymentService } from '../../services/paymentService';
|
||||||
import { tokenPacks } from '../../constants/tokenPacks';
|
import { tokenPacks } from '../../constants/tokenPacks';
|
||||||
|
import NotificationModal from '../shared/NotificationModal';
|
||||||
import styles from './Header.module.css';
|
import styles from './Header.module.css';
|
||||||
|
|
||||||
const Header: React.FC = () => {
|
const Header: React.FC = () => {
|
||||||
@ -17,6 +18,10 @@ const Header: React.FC = () => {
|
|||||||
balance: 0
|
balance: 0
|
||||||
});
|
});
|
||||||
const [showTokensModal, setShowTokensModal] = useState(false);
|
const [showTokensModal, setShowTokensModal] = useState(false);
|
||||||
|
const [lastPurchasedPack, setLastPurchasedPack] = useState<any>(null);
|
||||||
|
const [showNotificationModal, setShowNotificationModal] = useState(false);
|
||||||
|
const [notificationTitle, setNotificationTitle] = useState('');
|
||||||
|
const [notificationMessage, setNotificationMessage] = useState('');
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Получаем информацию о пользователе
|
// Получаем информацию о пользователе
|
||||||
@ -97,12 +102,60 @@ const Header: React.FC = () => {
|
|||||||
onShowAllPacks={() => navigate('/profile')}
|
onShowAllPacks={() => navigate('/profile')}
|
||||||
missingTokens={0}
|
missingTokens={0}
|
||||||
onBuyPack={(packId) => {
|
onBuyPack={(packId) => {
|
||||||
|
const pack = tokenPacks.find(p => p.id === packId);
|
||||||
|
if (!pack) return;
|
||||||
|
|
||||||
setShowTokensModal(false);
|
setShowTokensModal(false);
|
||||||
paymentService.showBuyTokensPopup(tokenPacks.find(p => p.id === packId)!, () => {
|
setLastPurchasedPack(pack);
|
||||||
window.location.reload();
|
|
||||||
|
paymentService.showBuyTokensPopup(pack, async (userData) => {
|
||||||
|
if (userData) {
|
||||||
|
// Обновляем данные на основе полученной информации
|
||||||
|
if (userData.balance !== undefined) {
|
||||||
|
setUser(prev => ({
|
||||||
|
...prev,
|
||||||
|
balance: userData.balance
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setNotificationTitle('Оплата успешна!');
|
||||||
|
setNotificationMessage(`Вы успешно приобрели ${pack.tokens + pack.bonusTokens} токенов.`);
|
||||||
|
setShowNotificationModal(true);
|
||||||
|
} else {
|
||||||
|
// Если данные не получены, делаем запрос на получение данных пользователя
|
||||||
|
try {
|
||||||
|
// Получаем баланс пользователя
|
||||||
|
const balance = await apiService.getBalance(getCurrentUserId());
|
||||||
|
|
||||||
|
// Обновляем баланс пользователя
|
||||||
|
setUser(prev => ({
|
||||||
|
...prev,
|
||||||
|
balance: balance
|
||||||
|
}));
|
||||||
|
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setNotificationTitle('Оплата успешна!');
|
||||||
|
setNotificationMessage(`Вы успешно приобрели ${pack.tokens + pack.bonusTokens} токенов. Ваш текущий баланс: ${balance} токенов.`);
|
||||||
|
setShowNotificationModal(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при обновлении данных пользователя:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* Модальное окно уведомления */}
|
||||||
|
<NotificationModal
|
||||||
|
isVisible={showNotificationModal}
|
||||||
|
title={notificationTitle}
|
||||||
|
message={notificationMessage}
|
||||||
|
onGalleryClick={() => setShowNotificationModal(false)}
|
||||||
|
onContinueClick={() => setShowNotificationModal(false)}
|
||||||
|
showGalleryButton={false}
|
||||||
|
continueButtonText="Закрыть"
|
||||||
|
/>
|
||||||
</header>
|
</header>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -6,6 +6,7 @@ import { tokenPacks } from '../constants/tokenPacks';
|
|||||||
import { paymentService } from '../services/paymentService';
|
import { paymentService } from '../services/paymentService';
|
||||||
import apiService from '../services/api';
|
import apiService from '../services/api';
|
||||||
import { getCurrentUserId } from '../constants/user';
|
import { getCurrentUserId } from '../constants/user';
|
||||||
|
import NotificationModal from '../components/shared/NotificationModal';
|
||||||
|
|
||||||
const TOKENS_PER_GENERATION = 10;
|
const TOKENS_PER_GENERATION = 10;
|
||||||
|
|
||||||
@ -13,6 +14,12 @@ const CreateSticker: React.FC = () => {
|
|||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [showTokensModal, setShowTokensModal] = useState(false);
|
const [showTokensModal, setShowTokensModal] = useState(false);
|
||||||
const [missingTokens, setMissingTokens] = useState(0);
|
const [missingTokens, setMissingTokens] = useState(0);
|
||||||
|
const [lastPurchasedPack, setLastPurchasedPack] = useState<any>(null);
|
||||||
|
|
||||||
|
// Состояния для модального окна уведомления
|
||||||
|
const [showNotificationModal, setShowNotificationModal] = useState(false);
|
||||||
|
const [notificationTitle, setNotificationTitle] = useState('');
|
||||||
|
const [notificationMessage, setNotificationMessage] = useState('');
|
||||||
|
|
||||||
const checkTokensAndProceed = async () => {
|
const checkTokensAndProceed = async () => {
|
||||||
try {
|
try {
|
||||||
@ -74,12 +81,47 @@ const CreateSticker: React.FC = () => {
|
|||||||
onShowAllPacks={() => navigate('/profile')}
|
onShowAllPacks={() => navigate('/profile')}
|
||||||
missingTokens={missingTokens}
|
missingTokens={missingTokens}
|
||||||
onBuyPack={(packId: string) => {
|
onBuyPack={(packId: string) => {
|
||||||
|
const pack = tokenPacks.find(p => p.id === packId);
|
||||||
|
if (!pack) return;
|
||||||
|
|
||||||
setShowTokensModal(false);
|
setShowTokensModal(false);
|
||||||
paymentService.showBuyTokensPopup(tokenPacks.find(p => p.id === packId)!, () => {
|
setLastPurchasedPack(pack);
|
||||||
window.location.reload();
|
|
||||||
|
paymentService.showBuyTokensPopup(pack, async (userData) => {
|
||||||
|
if (userData) {
|
||||||
|
// Обновляем данные на основе полученной информации
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setNotificationTitle('Оплата успешна!');
|
||||||
|
setNotificationMessage(`Вы успешно приобрели ${pack.tokens + pack.bonusTokens} токенов.`);
|
||||||
|
setShowNotificationModal(true);
|
||||||
|
} else {
|
||||||
|
// Если данные не получены, делаем запрос на получение данных пользователя
|
||||||
|
try {
|
||||||
|
// Получаем баланс пользователя
|
||||||
|
const balance = await apiService.getBalance(getCurrentUserId());
|
||||||
|
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setNotificationTitle('Оплата успешна!');
|
||||||
|
setNotificationMessage(`Вы успешно приобрели ${pack.tokens + pack.bonusTokens} токенов. Ваш текущий баланс: ${balance} токенов.`);
|
||||||
|
setShowNotificationModal(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при обновлении данных пользователя:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* Модальное окно уведомления */}
|
||||||
|
<NotificationModal
|
||||||
|
isVisible={showNotificationModal}
|
||||||
|
title={notificationTitle}
|
||||||
|
message={notificationMessage}
|
||||||
|
onGalleryClick={() => setShowNotificationModal(false)}
|
||||||
|
onContinueClick={() => setShowNotificationModal(false)}
|
||||||
|
showGalleryButton={false}
|
||||||
|
continueButtonText="Закрыть"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -53,6 +53,7 @@ const Home: React.FC = () => {
|
|||||||
const [lastGenerationData, setLastGenerationData] = useState<LastGenerationData>({});
|
const [lastGenerationData, setLastGenerationData] = useState<LastGenerationData>({});
|
||||||
const [showTokensModal, setShowTokensModal] = useState(false);
|
const [showTokensModal, setShowTokensModal] = useState(false);
|
||||||
const [missingTokens, setMissingTokens] = useState(0);
|
const [missingTokens, setMissingTokens] = useState(0);
|
||||||
|
const [lastPurchasedPack, setLastPurchasedPack] = useState<any>(null);
|
||||||
|
|
||||||
// Обработчики для модального окна
|
// Обработчики для модального окна
|
||||||
const handleGalleryClick = useCallback(() => {
|
const handleGalleryClick = useCallback(() => {
|
||||||
@ -376,9 +377,41 @@ const Home: React.FC = () => {
|
|||||||
onShowAllPacks={() => navigate('/profile')}
|
onShowAllPacks={() => navigate('/profile')}
|
||||||
missingTokens={missingTokens}
|
missingTokens={missingTokens}
|
||||||
onBuyPack={(packId: string) => {
|
onBuyPack={(packId: string) => {
|
||||||
|
const pack = tokenPacks.find(p => p.id === packId);
|
||||||
|
if (!pack) return;
|
||||||
|
|
||||||
setShowTokensModal(false);
|
setShowTokensModal(false);
|
||||||
paymentService.showBuyTokensPopup(tokenPacks.find(p => p.id === packId)!, () => {
|
setLastPurchasedPack(pack);
|
||||||
window.location.reload();
|
|
||||||
|
paymentService.showBuyTokensPopup(pack, async (userData) => {
|
||||||
|
if (userData) {
|
||||||
|
// Обновляем данные на основе полученной информации
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setNotificationTitle('Оплата успешна!');
|
||||||
|
setNotificationMessage(`Вы успешно приобрели ${pack.tokens + pack.bonusTokens} токенов.`);
|
||||||
|
setIsLoading(false);
|
||||||
|
setShowGalleryButton(false);
|
||||||
|
setShowButtons(true);
|
||||||
|
setContinueButtonText('Закрыть');
|
||||||
|
setIsNotificationVisible(true);
|
||||||
|
} else {
|
||||||
|
// Если данные не получены, делаем запрос на получение данных пользователя
|
||||||
|
try {
|
||||||
|
// Получаем баланс пользователя
|
||||||
|
const balance = await apiService.getBalance(getCurrentUserId());
|
||||||
|
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setNotificationTitle('Оплата успешна!');
|
||||||
|
setNotificationMessage(`Вы успешно приобрели ${pack.tokens + pack.bonusTokens} токенов. Ваш текущий баланс: ${balance} токенов.`);
|
||||||
|
setIsLoading(false);
|
||||||
|
setShowGalleryButton(false);
|
||||||
|
setShowButtons(true);
|
||||||
|
setContinueButtonText('Закрыть');
|
||||||
|
setIsNotificationVisible(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при обновлении данных пользователя:', error);
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@ -4,41 +4,51 @@ import { stickerService } from '../services/stickerService';
|
|||||||
import apiService from '../services/api';
|
import apiService from '../services/api';
|
||||||
import { getCurrentUserId } from '../constants/user';
|
import { getCurrentUserId } from '../constants/user';
|
||||||
import TokenPacksList from '../components/tokens/TokenPacksList';
|
import TokenPacksList from '../components/tokens/TokenPacksList';
|
||||||
import { tokenPacks } from '../constants/tokenPacks';
|
import { tokenPacks, TokenPack } from '../constants/tokenPacks';
|
||||||
import { paymentService } from '../services/paymentService';
|
import { paymentService } from '../services/paymentService';
|
||||||
|
import NotificationModal from '../components/shared/NotificationModal';
|
||||||
|
|
||||||
const Profile: React.FC = () => {
|
const Profile: React.FC = () => {
|
||||||
const [stickersCount, setStickersCount] = useState<number>(0);
|
const [stickersCount, setStickersCount] = useState<number>(0);
|
||||||
const [packsCount, setPacksCount] = useState<number>(0);
|
const [packsCount, setPacksCount] = useState<number>(0);
|
||||||
const [loading, setLoading] = useState<boolean>(true);
|
const [loading, setLoading] = useState<boolean>(true);
|
||||||
|
const [showPaymentSuccessModal, setShowPaymentSuccessModal] = useState<boolean>(false);
|
||||||
|
const [lastPurchasedPack, setLastPurchasedPack] = useState<TokenPack | null>(null);
|
||||||
|
const [userBalance, setUserBalance] = useState<number>(0);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
fetchUserData();
|
||||||
try {
|
|
||||||
setLoading(true);
|
|
||||||
|
|
||||||
// Получаем список стикерпаков
|
|
||||||
const stickerPacks = await stickerService.getUserStickerPacks(getCurrentUserId().toString());
|
|
||||||
setPacksCount(stickerPacks.length);
|
|
||||||
|
|
||||||
// Получаем список созданных стикеров
|
|
||||||
const generatedImages = await apiService.getGeneratedImages();
|
|
||||||
setStickersCount(generatedImages.length);
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Ошибка при загрузке данных профиля:', error);
|
|
||||||
} finally {
|
|
||||||
setLoading(false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fetchData();
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
const fetchUserData = async () => {
|
||||||
|
try {
|
||||||
|
setLoading(true);
|
||||||
|
|
||||||
|
// Получаем список стикерпаков
|
||||||
|
const stickerPacks = await stickerService.getUserStickerPacks(getCurrentUserId().toString());
|
||||||
|
setPacksCount(stickerPacks.length);
|
||||||
|
|
||||||
|
// Получаем список созданных стикеров
|
||||||
|
const generatedImages = await apiService.getGeneratedImages();
|
||||||
|
setStickersCount(generatedImages.length);
|
||||||
|
|
||||||
|
// Получаем баланс пользователя
|
||||||
|
const balance = await apiService.getBalance();
|
||||||
|
setUserBalance(balance);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при загрузке данных профиля:', error);
|
||||||
|
} finally {
|
||||||
|
setLoading(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const handleBuyPack = (packId: string) => {
|
const handleBuyPack = (packId: string) => {
|
||||||
const pack = tokenPacks.find(p => p.id === packId);
|
const pack = tokenPacks.find(p => p.id === packId);
|
||||||
if (!pack) return;
|
if (!pack) return;
|
||||||
|
|
||||||
paymentService.showBuyTokensPopup(pack, (userData) => {
|
setLastPurchasedPack(pack);
|
||||||
|
|
||||||
|
paymentService.showBuyTokensPopup(pack, async (userData) => {
|
||||||
if (userData) {
|
if (userData) {
|
||||||
// Обновляем данные на основе полученной информации
|
// Обновляем данные на основе полученной информации
|
||||||
if (userData.stickers_count !== undefined) {
|
if (userData.stickers_count !== undefined) {
|
||||||
@ -47,14 +57,29 @@ const Profile: React.FC = () => {
|
|||||||
if (userData.packs_count !== undefined) {
|
if (userData.packs_count !== undefined) {
|
||||||
setPacksCount(userData.packs_count);
|
setPacksCount(userData.packs_count);
|
||||||
}
|
}
|
||||||
// Можно также обновить другие данные, если они есть в ответе
|
if (userData.balance !== undefined) {
|
||||||
|
setUserBalance(userData.balance);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setShowPaymentSuccessModal(true);
|
||||||
} else {
|
} else {
|
||||||
// Если данные не получены, просто перезагружаем страницу
|
// Если данные не получены, делаем запрос на получение данных пользователя
|
||||||
window.location.reload();
|
try {
|
||||||
|
await fetchUserData();
|
||||||
|
// Показываем модальное окно с информацией об успешной оплате
|
||||||
|
setShowPaymentSuccessModal(true);
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Ошибка при обновлении данных пользователя:', error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const handleClosePaymentSuccessModal = () => {
|
||||||
|
setShowPaymentSuccessModal(false);
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<div className={styles.header}>
|
<div className={styles.header}>
|
||||||
@ -72,8 +97,8 @@ const Profile: React.FC = () => {
|
|||||||
<span className={styles.statLabel}>Стикерпаков</span>
|
<span className={styles.statLabel}>Стикерпаков</span>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.statItem}>
|
<div className={styles.statItem}>
|
||||||
<span className={styles.statValue}>0</span>
|
<span className={styles.statValue}>{loading ? '...' : userBalance}</span>
|
||||||
<span className={styles.statLabel}>Избранных</span>
|
<span className={styles.statLabel}>Токенов</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -81,6 +106,17 @@ const Profile: React.FC = () => {
|
|||||||
onBuyPack={handleBuyPack}
|
onBuyPack={handleBuyPack}
|
||||||
className={styles.tokenPacks}
|
className={styles.tokenPacks}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
{/* Модальное окно успешной оплаты */}
|
||||||
|
<NotificationModal
|
||||||
|
isVisible={showPaymentSuccessModal}
|
||||||
|
title="Оплата успешна!"
|
||||||
|
message={lastPurchasedPack ? `Вы успешно приобрели ${lastPurchasedPack.tokens + lastPurchasedPack.bonusTokens} токенов. Ваш текущий баланс: ${userBalance} токенов.` : "Оплата прошла успешно!"}
|
||||||
|
onGalleryClick={handleClosePaymentSuccessModal}
|
||||||
|
onContinueClick={handleClosePaymentSuccessModal}
|
||||||
|
showGalleryButton={false}
|
||||||
|
continueButtonText="Закрыть"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user