🐛 fix(user): Update user subscribe display

This commit is contained in:
web@ppanel 2025-04-09 03:27:22 -04:00
parent 7023875548
commit 3bb714d15c
31 changed files with 393 additions and 206 deletions

View File

@ -1,24 +1,23 @@
<a name="readme-top"></a> <a name="readme-top"></a>
# Changelog # Changelog
# [1.0.0-beta.34](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.33...v1.0.0-beta.34) (2025-04-02) # [1.0.0-beta.34](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0-beta.33...v1.0.0-beta.34) (2025-04-02)
### ✨ Features ### ✨ Features
* **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69)) - **admin**: Add application and rule management entries to localization files ([8b43e69](https://github.com/perfect-panel/ppanel-web/commit/8b43e69))
* **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c)) - **api**: Add an interface to obtain user subscription details, update related type definitions and localized text ([cf5c39c](https://github.com/perfect-panel/ppanel-web/commit/cf5c39c))
* **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac)) - **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
### 🐛 Bug Fixes ### 🐛 Bug Fixes
* **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842)) - **admin**: Hidden versions and system upgrades ([64cd842](https://github.com/perfect-panel/ppanel-web/commit/64cd842))
* **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe)) - **admin**: Modify the label type in the rule form to a string array ([a7aa5fe](https://github.com/perfect-panel/ppanel-web/commit/a7aa5fe))
* **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28)) - **node**: Handle potential null value for online users count ([fa2fb28](https://github.com/perfect-panel/ppanel-web/commit/fa2fb28))
* **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d)) - **subscribe**: Add value prop to field in subscription form for proper state management ([328838d](https://github.com/perfect-panel/ppanel-web/commit/328838d))
* **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240)) - **subscribe**: Refactor discount calculations and default selection logic in subscription forms ([423b240](https://github.com/perfect-panel/ppanel-web/commit/423b240))
* **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374)) - **subscribe**: Update default selection logic in subscription form to ensure proper state management ([ef15374](https://github.com/perfect-panel/ppanel-web/commit/ef15374))
<a name="readme-top"></a> <a name="readme-top"></a>

View File

@ -1748,6 +1748,7 @@ declare namespace API {
subscribe: Subscribe; subscribe: Subscribe;
start_time: number; start_time: number;
expire_time: number; expire_time: number;
finished_at: number;
reset_time: number; reset_time: number;
traffic: number; traffic: number;
download: number; download: number;

View File

@ -25,6 +25,24 @@ export async function getApplication(options?: { [key: string]: any }) {
}); });
} }
/** Check verification code POST /v1/common/check_verification_code */
export async function checkVerificationCode(
body: API.CheckVerificationCodeRequest,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.CheckVerificationCodeRespone }>(
'/v1/common/check_verification_code',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
},
);
}
/** Get verification code POST /v1/common/send_code */ /** Get verification code POST /v1/common/send_code */
export async function sendEmailCode(body: API.SendCodeRequest, options?: { [key: string]: any }) { export async function sendEmailCode(body: API.SendCodeRequest, options?: { [key: string]: any }) {
return request<API.Response & { data?: API.SendCodeResponse }>('/v1/common/send_code', { return request<API.Response & { data?: API.SendCodeResponse }>('/v1/common/send_code', {

View File

@ -121,6 +121,17 @@ declare namespace API {
telephone: string; telephone: string;
}; };
type CheckVerificationCodeRequest = {
method: 'email' | 'mobile';
account: string;
code: string;
type: number;
};
type CheckVerificationCodeRespone = {
status: boolean;
};
type CloseOrderRequest = { type CloseOrderRequest = {
orderNo: string; orderNo: string;
}; };
@ -910,6 +921,7 @@ declare namespace API {
subscribe: Subscribe; subscribe: Subscribe;
start_time: number; start_time: number;
expire_time: number; expire_time: number;
finished_at: number;
reset_time: number; reset_time: number;
traffic: number; traffic: number;
download: number; download: number;

View File

@ -32,6 +32,7 @@ import { Card, CardContent, CardHeader, CardTitle } from '@workspace/ui/componen
import { Separator } from '@workspace/ui/components/separator'; import { Separator } from '@workspace/ui/components/separator';
import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs';
import { Icon } from '@workspace/ui/custom-components/icon'; import { Icon } from '@workspace/ui/custom-components/icon';
import { cn } from '@workspace/ui/lib/utils';
import { differenceInDays, formatDate, isBrowser } from '@workspace/ui/utils'; import { differenceInDays, formatDate, isBrowser } from '@workspace/ui/utils';
import { useTranslations } from 'next-intl'; import { useTranslations } from 'next-intl';
import Image from 'next/image'; import Image from 'next/image';
@ -88,6 +89,12 @@ export default function Content() {
refetchOnWindowFocus: false, refetchOnWindowFocus: false,
}); });
const statusWatermarks = {
2: t('finished'),
3: t('expired'),
4: t('deducted'),
};
return ( return (
<> <>
{userSubscribe.length ? ( {userSubscribe.length ? (
@ -159,13 +166,59 @@ export default function Content() {
</Tabs> </Tabs>
)} )}
</div> </div>
{userSubscribe.map((item) => ( {userSubscribe.map((item) => {
<Card key={item.id}> return (
<Card
key={item.id}
className={cn('relative', {
'relative opacity-80 grayscale': item.status === 3,
'relative hidden opacity-60 blur-[0.3px] grayscale': item.status === 4,
})}
>
{item.status >= 2 && (
<div
className={cn(
'pointer-events-none absolute left-0 top-0 z-10 h-full w-full overflow-hidden mix-blend-difference',
{
'text-destructive': item.status === 2,
'text-white': item.status === 3 || item.status === 4,
},
)}
style={{
filter: 'contrast(200%) brightness(150%) invert(0.2)',
}}
>
<div className='absolute inset-0'>
{Array.from({ length: 16 }).map((_, i) => {
const row = Math.floor(i / 4);
const col = i % 4;
// 计算位置百分比
const top = 10 + row * 25 + (col % 2 === 0 ? 5 : -5);
const left = 5 + col * 30 + (row % 2 === 0 ? 0 : 10);
return (
<span
key={i}
className='absolute rotate-[-30deg] whitespace-nowrap text-lg font-black opacity-40'
style={{
top: `${top}%`,
left: `${left}%`,
textShadow: '0px 0px 1px rgba(255,255,255,0.5)',
}}
>
{statusWatermarks[item.status as keyof typeof statusWatermarks]}
</span>
);
})}
</div>
</div>
)}
<CardHeader className='flex flex-row flex-wrap items-center justify-between gap-2 space-y-0'> <CardHeader className='flex flex-row flex-wrap items-center justify-between gap-2 space-y-0'>
<CardTitle className='font-medium'> <CardTitle className='font-medium'>
{item.subscribe.name} {item.subscribe.name}
<p className='text-foreground/50 mt-1 text-sm'>{formatDate(item.start_time)}</p> <p className='text-foreground/50 mt-1 text-sm'>{formatDate(item.start_time)}</p>
</CardTitle> </CardTitle>
{item.status !== 4 && (
<div className='flex flex-wrap gap-2'> <div className='flex flex-wrap gap-2'>
<AlertDialog> <AlertDialog>
<AlertDialogTrigger asChild> <AlertDialogTrigger asChild>
@ -198,8 +251,10 @@ export default function Content() {
</AlertDialog> </AlertDialog>
<ResetTraffic id={item.id} replacement={item.subscribe.replacement} /> <ResetTraffic id={item.id} replacement={item.subscribe.replacement} />
<Renewal id={item.id} subscribe={item.subscribe} /> <Renewal id={item.id} subscribe={item.subscribe} />
<Unsubscribe id={item.id} allowDeduction={item.subscribe.allow_deduction} /> <Unsubscribe id={item.id} allowDeduction={item.subscribe.allow_deduction} />
</div> </div>
)}
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<ul className='grid grid-cols-2 gap-3 *:flex *:flex-col *:justify-between lg:grid-cols-4'> <ul className='grid grid-cols-2 gap-3 *:flex *:flex-col *:justify-between lg:grid-cols-4'>
@ -275,7 +330,8 @@ export default function Content() {
.map((application) => { .map((application) => {
const platformApps = application.platform?.[platform]; const platformApps = application.platform?.[platform];
const app = const app =
platformApps?.find((item) => item.is_default) || platformApps?.[0]; platformApps?.find((item) => item.is_default) ||
platformApps?.[0];
if (!app) return null; if (!app) return null;
const handleCopy = (text: string, result: boolean) => { const handleCopy = (text: string, result: boolean) => {
@ -361,7 +417,8 @@ export default function Content() {
</Accordion> </Accordion>
</CardContent> </CardContent>
</Card> </Card>
))} );
})}
</> </>
) : ( ) : (
<> <>

View File

@ -5,8 +5,11 @@
"copy": "kopírovat", "copy": "kopírovat",
"copyFailure": "Kopírování selhalo, prosím zkopírujte ručně", "copyFailure": "Kopírování selhalo, prosím zkopírujte ručně",
"copySuccess": "Kopírování úspěšné", "copySuccess": "Kopírování úspěšné",
"deducted": "Zrušeno",
"download": "stáhnout", "download": "stáhnout",
"expirationDays": "Doba platnosti/dny", "expirationDays": "Doba platnosti/dny",
"expired": "Vypršelo",
"finished": "Provoz vyčerpán",
"import": "Importovat", "import": "Importovat",
"latestAnnouncement": "Nejnovější oznámení", "latestAnnouncement": "Nejnovější oznámení",
"manualImportMessage": "Tato aplikace momentálně nepodporuje spuštění, prosím importujte ručně, adresa předplatného byla automaticky zkopírována", "manualImportMessage": "Tato aplikace momentálně nepodporuje spuštění, prosím importujte ručně, adresa předplatného byla automaticky zkopírována",

View File

@ -5,8 +5,11 @@
"copy": "Kopieren", "copy": "Kopieren",
"copyFailure": "Kopieren fehlgeschlagen, bitte manuell kopieren", "copyFailure": "Kopieren fehlgeschlagen, bitte manuell kopieren",
"copySuccess": "Kopieren erfolgreich", "copySuccess": "Kopieren erfolgreich",
"deducted": "Storniert",
"download": "Herunterladen", "download": "Herunterladen",
"expirationDays": "Ablaufzeit/Tage", "expirationDays": "Ablaufzeit/Tage",
"expired": "Abgelaufen",
"finished": "Verkehr erschöpft",
"import": "Importieren", "import": "Importieren",
"latestAnnouncement": "Neueste Ankündigung", "latestAnnouncement": "Neueste Ankündigung",
"manualImportMessage": "Diese App unterstützt derzeit keine Aktivierung. Bitte manuell importieren, die Abonnementadresse wurde automatisch kopiert.", "manualImportMessage": "Diese App unterstützt derzeit keine Aktivierung. Bitte manuell importieren, die Abonnementadresse wurde automatisch kopiert.",

View File

@ -5,8 +5,11 @@
"copy": "Copy", "copy": "Copy",
"copyFailure": "Copy failed, please copy manually", "copyFailure": "Copy failed, please copy manually",
"copySuccess": "Copy successful", "copySuccess": "Copy successful",
"deducted": "Canceled",
"download": "Download", "download": "Download",
"expirationDays": "Expiration Days", "expirationDays": "Expiration Days",
"expired": "Expired",
"finished": "Traffic exhausted",
"import": "Import", "import": "Import",
"latestAnnouncement": "Latest Announcement", "latestAnnouncement": "Latest Announcement",
"manualImportMessage": "This app does not support activation. Please import manually. The subscription address has been copied.", "manualImportMessage": "This app does not support activation. Please import manually. The subscription address has been copied.",

View File

@ -5,8 +5,11 @@
"copy": "Copiar", "copy": "Copiar",
"copyFailure": "Error al copiar, por favor copia manualmente", "copyFailure": "Error al copiar, por favor copia manualmente",
"copySuccess": "Copia exitosa", "copySuccess": "Copia exitosa",
"deducted": "Cancelado",
"download": "descargar", "download": "descargar",
"expirationDays": "Días de vencimiento", "expirationDays": "Días de vencimiento",
"expired": "Caducado",
"finished": "Tráfico agotado",
"import": "importar", "import": "importar",
"latestAnnouncement": "Último anuncio", "latestAnnouncement": "Último anuncio",
"manualImportMessage": "Esta aplicación no admite la activación por el momento. Por favor, importe manualmente. La dirección de suscripción ha sido copiada automáticamente.", "manualImportMessage": "Esta aplicación no admite la activación por el momento. Por favor, importe manualmente. La dirección de suscripción ha sido copiada automáticamente.",

View File

@ -5,8 +5,11 @@
"copy": "copiar", "copy": "copiar",
"copyFailure": "Error al copiar, por favor copia manualmente", "copyFailure": "Error al copiar, por favor copia manualmente",
"copySuccess": "Copia exitosa", "copySuccess": "Copia exitosa",
"deducted": "Cancelado",
"download": "descargar", "download": "descargar",
"expirationDays": "Días de vencimiento", "expirationDays": "Días de vencimiento",
"expired": "Expirado",
"finished": "Tráfico agotado",
"import": "Importar", "import": "Importar",
"latestAnnouncement": "Último anuncio", "latestAnnouncement": "Último anuncio",
"manualImportMessage": "Esta aplicación no admite la activación por el momento, por favor importe manualmente, la dirección de suscripción se ha copiado automáticamente", "manualImportMessage": "Esta aplicación no admite la activación por el momento, por favor importe manualmente, la dirección de suscripción se ha copiado automáticamente",

View File

@ -5,8 +5,11 @@
"copy": "کپی", "copy": "کپی",
"copyFailure": "کپی ناموفق بود، لطفاً به صورت دستی کپی کنید", "copyFailure": "کپی ناموفق بود، لطفاً به صورت دستی کپی کنید",
"copySuccess": "کپی با موفقیت انجام شد", "copySuccess": "کپی با موفقیت انجام شد",
"deducted": "لغو شده",
"download": "دانلود", "download": "دانلود",
"expirationDays": "روزهای انقضا", "expirationDays": "روزهای انقضا",
"expired": "منقضی شده",
"finished": "ترافیک تمام شده",
"import": "وارد کردن", "import": "وارد کردن",
"latestAnnouncement": "آخرین اعلامیه", "latestAnnouncement": "آخرین اعلامیه",
"manualImportMessage": "این برنامه از فعال‌سازی پشتیبانی نمی‌کند. لطفاً به صورت دستی وارد کنید. آدرس اشتراک کپی شده است.", "manualImportMessage": "این برنامه از فعال‌سازی پشتیبانی نمی‌کند. لطفاً به صورت دستی وارد کنید. آدرس اشتراک کپی شده است.",

View File

@ -5,8 +5,11 @@
"copy": "kopioi", "copy": "kopioi",
"copyFailure": "Kopiointi epäonnistui, kopioi manuaalisesti", "copyFailure": "Kopiointi epäonnistui, kopioi manuaalisesti",
"copySuccess": "Kopiointi onnistui", "copySuccess": "Kopiointi onnistui",
"deducted": "Peruutettu",
"download": "lataa", "download": "lataa",
"expirationDays": "Vanhentumispäivät", "expirationDays": "Vanhentumispäivät",
"expired": "Vanhentunut",
"finished": "Liikenne loppunut",
"import": "Tuo", "import": "Tuo",
"latestAnnouncement": "Viimeisin ilmoitus", "latestAnnouncement": "Viimeisin ilmoitus",
"manualImportMessage": "Tämä sovellus ei tue herätystä tällä hetkellä, tuo manuaalisesti, tilausosoite on kopioitu automaattisesti", "manualImportMessage": "Tämä sovellus ei tue herätystä tällä hetkellä, tuo manuaalisesti, tilausosoite on kopioitu automaattisesti",

View File

@ -5,8 +5,11 @@
"copy": "Copier", "copy": "Copier",
"copyFailure": "Échec de la copie, veuillez copier manuellement", "copyFailure": "Échec de la copie, veuillez copier manuellement",
"copySuccess": "Copie réussie", "copySuccess": "Copie réussie",
"deducted": "Annulé",
"download": "télécharger", "download": "télécharger",
"expirationDays": "Date d'expiration/jours", "expirationDays": "Date d'expiration/jours",
"expired": "Expiré",
"finished": "Trafic épuisé",
"import": "Importer", "import": "Importer",
"latestAnnouncement": "Dernière annonce", "latestAnnouncement": "Dernière annonce",
"manualImportMessage": "Cette application ne prend pas encore en charge l'activation, veuillez importer manuellement, l'adresse d'abonnement a été copiée automatiquement", "manualImportMessage": "Cette application ne prend pas encore en charge l'activation, veuillez importer manuellement, l'adresse d'abonnement a été copiée automatiquement",

View File

@ -5,8 +5,11 @@
"copy": "प्रतिलिपि", "copy": "प्रतिलिपि",
"copyFailure": "प्रतिलिपि बनाने में विफल, कृपया मैन्युअल रूप से प्रतिलिपि बनाएँ", "copyFailure": "प्रतिलिपि बनाने में विफल, कृपया मैन्युअल रूप से प्रतिलिपि बनाएँ",
"copySuccess": "प्रतिलिपि सफल", "copySuccess": "प्रतिलिपि सफल",
"deducted": "रद्द किया गया",
"download": "डाउनलोड", "download": "डाउनलोड",
"expirationDays": "समाप्ति समय/दिन", "expirationDays": "समाप्ति समय/दिन",
"expired": "समाप्त",
"finished": "ट्रैफ़िक समाप्त",
"import": "आयात", "import": "आयात",
"latestAnnouncement": "नवीनतम घोषणा", "latestAnnouncement": "नवीनतम घोषणा",
"manualImportMessage": "यह ऐप फिलहाल जागृत करने का समर्थन नहीं करता है, कृपया मैन्युअल रूप से आयात करें, सदस्यता पता स्वचालित रूप से कॉपी कर लिया गया है।", "manualImportMessage": "यह ऐप फिलहाल जागृत करने का समर्थन नहीं करता है, कृपया मैन्युअल रूप से आयात करें, सदस्यता पता स्वचालित रूप से कॉपी कर लिया गया है।",

View File

@ -5,8 +5,11 @@
"copy": "Másolás", "copy": "Másolás",
"copyFailure": "Másolás sikertelen, kérjük, másolja kézzel", "copyFailure": "Másolás sikertelen, kérjük, másolja kézzel",
"copySuccess": "Sikeres másolás", "copySuccess": "Sikeres másolás",
"deducted": "Törölve",
"download": "letöltés", "download": "letöltés",
"expirationDays": "Lejárati idő/nap", "expirationDays": "Lejárati idő/nap",
"expired": "Lejárt",
"finished": "Forgalom kimerült",
"import": "importálás", "import": "importálás",
"latestAnnouncement": "Legújabb bejelentés", "latestAnnouncement": "Legújabb bejelentés",
"manualImportMessage": "Ez az alkalmazás jelenleg nem támogatja az ébresztést, kérjük, importálja manuálisan, az előfizetési cím automatikusan másolva lett", "manualImportMessage": "Ez az alkalmazás jelenleg nem támogatja az ébresztést, kérjük, importálja manuálisan, az előfizetési cím automatikusan másolva lett",

View File

@ -5,8 +5,11 @@
"copy": "コピー", "copy": "コピー",
"copyFailure": "コピーに失敗しました。手動でコピーしてください", "copyFailure": "コピーに失敗しました。手動でコピーしてください",
"copySuccess": "コピー成功", "copySuccess": "コピー成功",
"deducted": "キャンセルされた",
"download": "ダウンロード", "download": "ダウンロード",
"expirationDays": "有効期限/日", "expirationDays": "有効期限/日",
"expired": "期限切れ",
"finished": "トラフィックが使い切られました",
"import": "インポート", "import": "インポート",
"latestAnnouncement": "最新のお知らせ", "latestAnnouncement": "最新のお知らせ",
"manualImportMessage": "このアプリは現在起動をサポートしていません。手動でインポートしてください。サブスクリプションアドレスは自動的にコピーされました。", "manualImportMessage": "このアプリは現在起動をサポートしていません。手動でインポートしてください。サブスクリプションアドレスは自動的にコピーされました。",

View File

@ -5,8 +5,11 @@
"copy": "복사", "copy": "복사",
"copyFailure": "복사 실패, 수동으로 복사하세요", "copyFailure": "복사 실패, 수동으로 복사하세요",
"copySuccess": "복사 성공", "copySuccess": "복사 성공",
"deducted": "취소됨",
"download": "다운로드", "download": "다운로드",
"expirationDays": "만료일/일", "expirationDays": "만료일/일",
"expired": "만료됨",
"finished": "트래픽 소진됨",
"import": "가져오기", "import": "가져오기",
"latestAnnouncement": "최신 공지", "latestAnnouncement": "최신 공지",
"manualImportMessage": "이 앱은 현재 호출을 지원하지 않습니다. 수동으로 가져오세요. 구독 주소가 자동으로 복사되었습니다.", "manualImportMessage": "이 앱은 현재 호출을 지원하지 않습니다. 수동으로 가져오세요. 구독 주소가 자동으로 복사되었습니다.",

View File

@ -5,8 +5,11 @@
"copy": "kopier", "copy": "kopier",
"copyFailure": "Kopiering mislyktes, vennligst kopier manuelt", "copyFailure": "Kopiering mislyktes, vennligst kopier manuelt",
"copySuccess": "Kopiering vellykket", "copySuccess": "Kopiering vellykket",
"deducted": "Avbrutt",
"download": "last ned", "download": "last ned",
"expirationDays": "Utløpsdato/dager", "expirationDays": "Utløpsdato/dager",
"expired": "Utløpt",
"finished": "Trafikk brukt opp",
"import": "Importer", "import": "Importer",
"latestAnnouncement": "Siste kunngjøring", "latestAnnouncement": "Siste kunngjøring",
"manualImportMessage": "Denne appen støtter foreløpig ikke oppstart, vennligst importer manuelt, abonnementsadressen er automatisk kopiert", "manualImportMessage": "Denne appen støtter foreløpig ikke oppstart, vennligst importer manuelt, abonnementsadressen er automatisk kopiert",

View File

@ -5,8 +5,11 @@
"copy": "kopiuj", "copy": "kopiuj",
"copyFailure": "Kopiowanie nie powiodło się, proszę skopiować ręcznie", "copyFailure": "Kopiowanie nie powiodło się, proszę skopiować ręcznie",
"copySuccess": "Skopiowano pomyślnie", "copySuccess": "Skopiowano pomyślnie",
"deducted": "Anulowane",
"download": "pobierz", "download": "pobierz",
"expirationDays": "Czas wygaśnięcia/dni", "expirationDays": "Czas wygaśnięcia/dni",
"expired": "Wygasło",
"finished": "Wykończony ruch",
"import": "Importuj", "import": "Importuj",
"latestAnnouncement": "Najnowsze ogłoszenie", "latestAnnouncement": "Najnowsze ogłoszenie",
"manualImportMessage": "Ta aplikacja tymczasowo nie obsługuje wywoływania, proszę zaimportować ręcznie, adres subskrypcji został automatycznie skopiowany", "manualImportMessage": "Ta aplikacja tymczasowo nie obsługuje wywoływania, proszę zaimportować ręcznie, adres subskrypcji został automatycznie skopiowany",

View File

@ -5,8 +5,11 @@
"copy": "Copiar", "copy": "Copiar",
"copyFailure": "Falha ao copiar, por favor copie manualmente", "copyFailure": "Falha ao copiar, por favor copie manualmente",
"copySuccess": "Cópia bem-sucedida", "copySuccess": "Cópia bem-sucedida",
"deducted": "Cancelado",
"download": "baixar", "download": "baixar",
"expirationDays": "Data de expiração/dias", "expirationDays": "Data de expiração/dias",
"expired": "Expirado",
"finished": "Tráfego esgotado",
"import": "Importar", "import": "Importar",
"latestAnnouncement": "Último Anúncio", "latestAnnouncement": "Último Anúncio",
"manualImportMessage": "Este aplicativo não suporta ativação no momento, por favor, importe manualmente. O endereço de assinatura foi copiado automaticamente.", "manualImportMessage": "Este aplicativo não suporta ativação no momento, por favor, importe manualmente. O endereço de assinatura foi copiado automaticamente.",

View File

@ -5,8 +5,11 @@
"copy": "Copiază", "copy": "Copiază",
"copyFailure": "Copierea a eșuat, vă rugăm să copiați manual", "copyFailure": "Copierea a eșuat, vă rugăm să copiați manual",
"copySuccess": "Copiere reușită", "copySuccess": "Copiere reușită",
"deducted": "Anulat",
"download": "descărcare", "download": "descărcare",
"expirationDays": "Zile până la expirare", "expirationDays": "Zile până la expirare",
"expired": "Expirat",
"finished": "Trafic epuizat",
"import": "Import", "import": "Import",
"latestAnnouncement": "Ultimul anunț", "latestAnnouncement": "Ultimul anunț",
"manualImportMessage": "Această aplicație nu suportă momentan activarea, vă rugăm să importați manual, adresa de abonament a fost copiată automat", "manualImportMessage": "Această aplicație nu suportă momentan activarea, vă rugăm să importați manual, adresa de abonament a fost copiată automat",

View File

@ -5,8 +5,11 @@
"copy": "Копировать", "copy": "Копировать",
"copyFailure": "Не удалось скопировать, пожалуйста, скопируйте вручную", "copyFailure": "Не удалось скопировать, пожалуйста, скопируйте вручную",
"copySuccess": "Копирование успешно", "copySuccess": "Копирование успешно",
"deducted": "Отменено",
"download": "скачать", "download": "скачать",
"expirationDays": "Срок действия/дни", "expirationDays": "Срок действия/дни",
"expired": "Истекло",
"finished": "Трафик исчерпан",
"import": "Импорт", "import": "Импорт",
"latestAnnouncement": "Последнее объявление", "latestAnnouncement": "Последнее объявление",
"manualImportMessage": "Это приложение временно не поддерживает вызов, пожалуйста, импортируйте вручную, адрес подписки уже скопирован", "manualImportMessage": "Это приложение временно не поддерживает вызов, пожалуйста, импортируйте вручную, адрес подписки уже скопирован",

View File

@ -5,8 +5,11 @@
"copy": "คัดลอก", "copy": "คัดลอก",
"copyFailure": "คัดลอกไม่สำเร็จ กรุณาคัดลอกด้วยตนเอง", "copyFailure": "คัดลอกไม่สำเร็จ กรุณาคัดลอกด้วยตนเอง",
"copySuccess": "คัดลอกสำเร็จ", "copySuccess": "คัดลอกสำเร็จ",
"deducted": "ยกเลิก",
"download": "ดาวน์โหลด", "download": "ดาวน์โหลด",
"expirationDays": "วันหมดอายุ/วัน", "expirationDays": "วันหมดอายุ/วัน",
"expired": "หมดอายุ",
"finished": "การใช้งานหมด",
"import": "นำเข้า", "import": "นำเข้า",
"latestAnnouncement": "ประกาศล่าสุด", "latestAnnouncement": "ประกาศล่าสุด",
"manualImportMessage": "แอปนี้ยังไม่รองรับการเปิดใช้งาน กรุณานำเข้าด้วยตนเอง ที่อยู่การสมัครสมาชิกได้ถูกคัดลอกอัตโนมัติแล้ว", "manualImportMessage": "แอปนี้ยังไม่รองรับการเปิดใช้งาน กรุณานำเข้าด้วยตนเอง ที่อยู่การสมัครสมาชิกได้ถูกคัดลอกอัตโนมัติแล้ว",

View File

@ -5,8 +5,11 @@
"copy": "kopyala", "copy": "kopyala",
"copyFailure": "Kopyalama başarısız oldu, lütfen elle kopyalayın", "copyFailure": "Kopyalama başarısız oldu, lütfen elle kopyalayın",
"copySuccess": "Kopyalama başarılı", "copySuccess": "Kopyalama başarılı",
"deducted": "İptal edildi",
"download": "indir", "download": "indir",
"expirationDays": "Son Kullanma Süresi/Gün", "expirationDays": "Son Kullanma Süresi/Gün",
"expired": "Süresi dolmuş",
"finished": "Trafik tükendi",
"import": "İçe Aktar", "import": "İçe Aktar",
"latestAnnouncement": "Son Duyuru", "latestAnnouncement": "Son Duyuru",
"manualImportMessage": "Bu uygulama şu anda uyandırmayı desteklemiyor, lütfen elle içe aktarın, abone adresi otomatik olarak kopyalandı", "manualImportMessage": "Bu uygulama şu anda uyandırmayı desteklemiyor, lütfen elle içe aktarın, abone adresi otomatik olarak kopyalandı",

View File

@ -5,8 +5,11 @@
"copy": "Копіювати", "copy": "Копіювати",
"copyFailure": "Не вдалося скопіювати, будь ласка, скопіюйте вручну", "copyFailure": "Не вдалося скопіювати, будь ласка, скопіюйте вручну",
"copySuccess": "Скопійовано успішно", "copySuccess": "Скопійовано успішно",
"deducted": "Скасовано",
"download": "завантажити", "download": "завантажити",
"expirationDays": "Термін дії/дні", "expirationDays": "Термін дії/дні",
"expired": "Термін закінчився",
"finished": "Трафік вичерпано",
"import": "Імпорт", "import": "Імпорт",
"latestAnnouncement": "Останнє оголошення", "latestAnnouncement": "Останнє оголошення",
"manualImportMessage": "Цей додаток тимчасово не підтримує виклик, будь ласка, імпортуйте вручну, адресу підписки вже скопійовано", "manualImportMessage": "Цей додаток тимчасово не підтримує виклик, будь ласка, імпортуйте вручну, адресу підписки вже скопійовано",

View File

@ -5,8 +5,11 @@
"copy": "Sao chép", "copy": "Sao chép",
"copyFailure": "Sao chép thất bại, vui lòng sao chép thủ công", "copyFailure": "Sao chép thất bại, vui lòng sao chép thủ công",
"copySuccess": "Sao chép thành công", "copySuccess": "Sao chép thành công",
"deducted": "Đã hủy",
"download": "tải xuống", "download": "tải xuống",
"expirationDays": "Thời gian hết hạn/ngày", "expirationDays": "Thời gian hết hạn/ngày",
"expired": "Hết hạn",
"finished": "Lưu lượng đã sử dụng",
"import": "Nhập khẩu", "import": "Nhập khẩu",
"latestAnnouncement": "Thông báo mới nhất", "latestAnnouncement": "Thông báo mới nhất",
"manualImportMessage": "Ứng dụng này hiện không hỗ trợ kích hoạt, vui lòng nhập thủ công, địa chỉ đăng ký đã được sao chép tự động", "manualImportMessage": "Ứng dụng này hiện không hỗ trợ kích hoạt, vui lòng nhập thủ công, địa chỉ đăng ký đã được sao chép tự động",

View File

@ -5,8 +5,11 @@
"copy": "复制", "copy": "复制",
"copyFailure": "复制失败,请手动复制", "copyFailure": "复制失败,请手动复制",
"copySuccess": "复制成功", "copySuccess": "复制成功",
"deducted": "已取消",
"download": "下载", "download": "下载",
"expirationDays": "到期时间/天", "expirationDays": "到期时间/天",
"expired": "已过期",
"finished": "流量已用尽",
"import": "导入", "import": "导入",
"latestAnnouncement": "最新公告", "latestAnnouncement": "最新公告",
"manualImportMessage": "该应用暂不支持唤起,请手动导入,已自动复制订阅地址", "manualImportMessage": "该应用暂不支持唤起,请手动导入,已自动复制订阅地址",

View File

@ -5,8 +5,11 @@
"copy": "複製", "copy": "複製",
"copyFailure": "複製失敗,請手動複製", "copyFailure": "複製失敗,請手動複製",
"copySuccess": "複製成功", "copySuccess": "複製成功",
"deducted": "已取消",
"download": "下載", "download": "下載",
"expirationDays": "到期時間/天", "expirationDays": "到期時間/天",
"expired": "已過期",
"finished": "流量已用盡",
"import": "匯入", "import": "匯入",
"latestAnnouncement": "最新公告", "latestAnnouncement": "最新公告",
"manualImportMessage": "該應用暫不支援喚起,請手動導入,已自動複製訂閱地址", "manualImportMessage": "該應用暫不支援喚起,請手動導入,已自動複製訂閱地址",

View File

@ -25,6 +25,24 @@ export async function getApplication(options?: { [key: string]: any }) {
}); });
} }
/** Check verification code POST /v1/common/check_verification_code */
export async function checkVerificationCode(
body: API.CheckVerificationCodeRequest,
options?: { [key: string]: any },
) {
return request<API.Response & { data?: API.CheckVerificationCodeRespone }>(
'/v1/common/check_verification_code',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
data: body,
...(options || {}),
},
);
}
/** Get verification code POST /v1/common/send_code */ /** Get verification code POST /v1/common/send_code */
export async function sendEmailCode(body: API.SendCodeRequest, options?: { [key: string]: any }) { export async function sendEmailCode(body: API.SendCodeRequest, options?: { [key: string]: any }) {
return request<API.Response & { data?: API.SendCodeResponse }>('/v1/common/send_code', { return request<API.Response & { data?: API.SendCodeResponse }>('/v1/common/send_code', {

View File

@ -121,6 +121,17 @@ declare namespace API {
telephone: string; telephone: string;
}; };
type CheckVerificationCodeRequest = {
method: 'email' | 'mobile';
account: string;
code: string;
type: number;
};
type CheckVerificationCodeRespone = {
status: boolean;
};
type CloseOrderRequest = { type CloseOrderRequest = {
orderNo: string; orderNo: string;
}; };
@ -910,6 +921,7 @@ declare namespace API {
subscribe: Subscribe; subscribe: Subscribe;
start_time: number; start_time: number;
expire_time: number; expire_time: number;
finished_at: number;
reset_time: number; reset_time: number;
traffic: number; traffic: number;
download: number; download: number;

View File

@ -1010,6 +1010,7 @@ declare namespace API {
subscribe: Subscribe; subscribe: Subscribe;
start_time: number; start_time: number;
expire_time: number; expire_time: number;
finished_at: number;
reset_time: number; reset_time: number;
traffic: number; traffic: number;
download: number; download: number;