feat(lava): покупка привязкой, продукт тарифа в админке, CTA

Фронтовые хвосты автопродления Lava (бэкенд: de3518b7).

- Поле «Продукт Lava» в форме создания/редактирования тарифа: раньше
  lava_product_id можно было задать только через API, из-за чего фичу нельзя
  было включить из интерфейса. Пустая строка отвязывает тариф от продукта.
- CTA «Оформить с автооплатой Lava» в форме покупки тарифа — рядом с
  СБП-кнопкой, в обеих ветках рендера; флаг lava_recurrent_enabled из
  purchase-options наконец получил потребителя.
- API-метод purchaseWithLavaRecurring + типы lava_product_id в списке,
  детали и запросах тарифа.
- Локали ru/en/zh/fa: подписи покупки и поля продукта (плейсхолдеры сверены).
This commit is contained in:
Fringg
2026-07-29 20:23:35 +03:00
parent 2dce539da2
commit a28f1167f7
10 changed files with 123 additions and 8 deletions

View File

@@ -423,6 +423,21 @@ export const subscriptionApi = {
return response.data;
},
/**
* Оформление подписки на тариф привязкой Lava: первое списание оплачивается
* по возвращённой ссылке и активирует подписку.
*/
purchaseWithLavaRecurring: async (
tariffId: number,
): Promise<{ status: string; redirect_url: string | null; subscription_id: number }> => {
const response = await apiClient.post(
'/cabinet/subscription/lava-recurrent/purchase',
{},
{ params: { tariff_id: tariffId } },
);
return response.data;
},
// ── Trial ───────────────────────────────────────────────────────────
getTrialInfo: async (): Promise<TrialInfo> => {

View File

@@ -35,6 +35,8 @@ export interface TariffListItem {
show_in_gift: boolean;
is_daily: boolean;
daily_price_kopeks: number;
/** UUID продукта Lava для рекуррентных подписок (цена/период заданы в кабинете Lava) */
lava_product_id?: string | null;
traffic_limit_gb: number;
device_limit: number;
tier_level: number;
@@ -85,6 +87,8 @@ export interface TariffDetail {
// Дневной тариф
is_daily: boolean;
daily_price_kopeks: number;
/** UUID продукта Lava для рекуррентных подписок (цена/период заданы в кабинете Lava) */
lava_product_id?: string | null;
// Режим сброса трафика
traffic_reset_mode: string | null; // 'DAY', 'WEEK', 'MONTH', 'MONTH_ROLLING', 'NO_RESET', null = глобальная настройка
// Внешний сквад Remnawave
@@ -124,6 +128,8 @@ export interface TariffCreateRequest {
// Дневной тариф
is_daily?: boolean;
daily_price_kopeks?: number;
// Автопродление Lava: продукт из кабинета Lava
lava_product_id?: string | null;
// Режим сброса трафика
traffic_reset_mode?: string | null;
// Внешний сквад Remnawave
@@ -168,6 +174,8 @@ export interface TariffUpdateRequest {
// Дневной тариф
is_daily?: boolean;
daily_price_kopeks?: number;
// Автопродление Lava: продукт из кабинета Lava
lava_product_id?: string | null;
// Режим сброса трафика
traffic_reset_mode?: string | null;
// Внешний сквад Remnawave