@@ -17,6 +17,8 @@ interface IPayProductResponse { payment_url: string } +type PayProductResponseBody = IPayProductResponse & { detail?: string } + interface DataForLogin { email: string password: string @@ -42,7 +44,7 @@ export const accountApi = { return null } - const response = await axios.post>( + const response = await axios.post>( getApiUrl() + '/payments/plans', { uid: plan, @@ -56,7 +58,9 @@ export const accountApi = { ) if (response.status >= 400) { - const error = new Error('Payment failed') as Error & { response: { data: unknown } } + const error = new Error(response.data.detail ?? 'Payment failed') as Error & { + response: { data: PayProductResponseBody } + } error.response = { data: response.data } throw error } @@ -6,6 +6,7 @@ import { useSession } from 'next-auth/react' import LightningSvg from '#/assets/svg/lightning.svg?react' import { accountApi } from '#/shared/api/account-endpoints' import { commaSeparated } from '#/shared/lib/helpers' +import { useShowDataStore } from '#/shared/lib/hooks/use-show-data' import { IFeatures, IOffer, formatFeatureValue } from '#/views/subscription' import styles from './offer.module.scss' @@ -18,6 +19,7 @@ interface IOfferProps extends IOffer { const Offer: React.FC = ({ uid, tokens_per_plan, price, grouped_features, isCurrentSubscription, index }) => { const { data } = useSession() + const { showMessage } = useShowDataStore() const unitMap: Record = { Изображения: 'изображений', @@ -52,8 +54,13 @@ const Offer: React.FC = ({ uid, tokens_per_plan, price, grouped_fea const formattedFeatures = formatFeatures(grouped_features) const pay = async (uid: string) => { - const urlForPay = await accountApi.payProduct(data!.access, uid) - urlForPay ? await Router.push(urlForPay) : null + try { + const urlForPay = await accountApi.payProduct(data!.access, uid) + if (urlForPay) await Router.push(urlForPay) + } catch (err) { + const message = err instanceof Error ? err.message : 'Ошибка оплаты' + showMessage(message) + } } return (