Compare commits
13 Commits
v1.0.0-beta.34
...
v1.0.2
| Author | SHA1 | Date | |
|---|---|---|---|
| 9235fef3c6 | |||
| ee0c3371f7 | |||
| 7d18ff6825 | |||
| c86d28f798 | |||
| d323af8bb6 | |||
| 356ae5b777 | |||
| 50bdd2cd21 | |||
| 4a4d364f17 | |||
| 5ea64893e8 | |||
| 674a01c813 | |||
| 3c5542a3ea | |||
| 6e0c9b6698 | |||
| 3bb714d15c |
+394
-1
@@ -1,24 +1,417 @@
|
|||||||
<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.2](https://github.com/perfect-panel/ppanel-web/compare/v1.0.1...v1.0.2) (2025-06-29)
|
||||||
|
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* **subscription**: User subscription information ([7d18ff6](https://github.com/perfect-panel/ppanel-web/commit/7d18ff6))
|
||||||
|
|
||||||
|
## [1.0.1](https://github.com/perfect-panel/ppanel-web/compare/v1.0.0...v1.0.1) (2025-04-28)
|
||||||
|
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
* **payment**: Disable webhook_secret field in PaymentForm component ([d323af8](https://github.com/perfect-panel/ppanel-web/commit/d323af8))
|
||||||
|
* **recharge**: Set balance prop to false in PaymentMethods component ([356ae5b](https://github.com/perfect-panel/ppanel-web/commit/356ae5b))
|
||||||
|
|
||||||
|
# 1.0.0 (2025-04-24)
|
||||||
|
|
||||||
|
|
||||||
|
### ♻ Code Refactoring
|
||||||
|
|
||||||
|
* **api**: Sort and Announcement ([38d5616](https://github.com/perfect-panel/ppanel-web/commit/38d5616))
|
||||||
|
* **auth**: Refactor user authorization handling and improve error logging ([68bc18f](https://github.com/perfect-panel/ppanel-web/commit/68bc18f))
|
||||||
|
* **config**: GenerateMetadata ([a0bb101](https://github.com/perfect-panel/ppanel-web/commit/a0bb101))
|
||||||
|
* **config**: Simplify environment variable handling and improve build script ([cf54d0f](https://github.com/perfect-panel/ppanel-web/commit/cf54d0f))
|
||||||
|
* **config**: Viewport ([24b8601](https://github.com/perfect-panel/ppanel-web/commit/24b8601))
|
||||||
|
* **core**: Restructure project for better module separation ([9d0cb8b](https://github.com/perfect-panel/ppanel-web/commit/9d0cb8b))
|
||||||
|
* **deps**: Update ([19837a1](https://github.com/perfect-panel/ppanel-web/commit/19837a1))
|
||||||
|
* **empty**: Content ([aa4c667](https://github.com/perfect-panel/ppanel-web/commit/aa4c667))
|
||||||
|
* **payment**: Reconstruct the payment page ([7109472](https://github.com/perfect-panel/ppanel-web/commit/7109472))
|
||||||
|
* **sbscribe**: Rename and reorganize components for better structure and clarity ([5e5e4ed](https://github.com/perfect-panel/ppanel-web/commit/5e5e4ed))
|
||||||
|
* **ui**: Dependencies ([727d779](https://github.com/perfect-panel/ppanel-web/commit/727d779))
|
||||||
|
* **ui**: Layout ([9262d7d](https://github.com/perfect-panel/ppanel-web/commit/9262d7d))
|
||||||
|
* **ui**: Optimize document display ([2ca2992](https://github.com/perfect-panel/ppanel-web/commit/2ca2992))
|
||||||
|
* Enhance user navigation dropdown ui and styling ([d2732e6](https://github.com/perfect-panel/ppanel-web/commit/d2732e6))
|
||||||
|
* Reduce code complexity and improve readability ([e11f18c](https://github.com/perfect-panel/ppanel-web/commit/e11f18c))
|
||||||
|
|
||||||
|
|
||||||
|
### ⚡ Performance Improvements
|
||||||
|
|
||||||
|
* **subscribe**: Form discount price ([059a892](https://github.com/perfect-panel/ppanel-web/commit/059a892))
|
||||||
|
|
||||||
|
|
||||||
### ✨ Features
|
### ✨ Features
|
||||||
|
|
||||||
|
* **accounts**: Update third-party account binding and unbinding ([1841552](https://github.com/perfect-panel/ppanel-web/commit/1841552))
|
||||||
|
* **ad**: Advertise ([b1105cd](https://github.com/perfect-panel/ppanel-web/commit/b1105cd))
|
||||||
* **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))
|
||||||
|
* **affiliate**: Add Affiliate component with commission display and invite link functionality ([4aea4e8](https://github.com/perfect-panel/ppanel-web/commit/4aea4e8))
|
||||||
|
* **affiliate**: Affiliate Detail ([a782c17](https://github.com/perfect-panel/ppanel-web/commit/a782c17))
|
||||||
|
* **affiliate**: Commission Rate ([5eec430](https://github.com/perfect-panel/ppanel-web/commit/5eec430))
|
||||||
|
* **affiliate**: Update affiliate component to display total commission and improve data fetching ([cc834ca](https://github.com/perfect-panel/ppanel-web/commit/cc834ca))
|
||||||
|
* **announcement**: Popup and pinned ([f3680a7](https://github.com/perfect-panel/ppanel-web/commit/f3680a7))
|
||||||
* **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))
|
||||||
|
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([48a1b97](https://github.com/perfect-panel/ppanel-web/commit/48a1b97))
|
||||||
|
* **api**: Add CheckoutOrder request and response types, and update user purchase request parameters ([dddc21c](https://github.com/perfect-panel/ppanel-web/commit/dddc21c))
|
||||||
|
* **api**: Add new subscription properties and locale support for deduction ratios and reset cycles ([fec80f5](https://github.com/perfect-panel/ppanel-web/commit/fec80f5))
|
||||||
|
* **api**: Add Time Period Configuration ([837157c](https://github.com/perfect-panel/ppanel-web/commit/837157c))
|
||||||
|
* **api**: Telegram ([17ce96a](https://github.com/perfect-panel/ppanel-web/commit/17ce96a))
|
||||||
|
* **auth-control**: Adding phone number labels to mobile verification configurations in multiple languages ([046740f](https://github.com/perfect-panel/ppanel-web/commit/046740f))
|
||||||
|
* **auth-control**: Update general ([3883646](https://github.com/perfect-panel/ppanel-web/commit/3883646))
|
||||||
|
* **auth**: Add email and SMS code sending functionality with localization updates ([57eaa55](https://github.com/perfect-panel/ppanel-web/commit/57eaa55))
|
||||||
|
* **auth**: Add Oauth configuration for Telegram, Facebook, Google, Github, and Apple ([18ee600](https://github.com/perfect-panel/ppanel-web/commit/18ee600))
|
||||||
|
* **auth**: Add privacy policy link to the footer ([8e16ef1](https://github.com/perfect-panel/ppanel-web/commit/8e16ef1))
|
||||||
|
* **auth**: Add SMS and email configuration options to global store and update localization ([4acf7b1](https://github.com/perfect-panel/ppanel-web/commit/4acf7b1))
|
||||||
|
* **auth**: Add type parameter to SendCode and update related API typings ([4198871](https://github.com/perfect-panel/ppanel-web/commit/4198871))
|
||||||
|
* **auth**: Enhance user registration with invite handling and logo display ([207bc24](https://github.com/perfect-panel/ppanel-web/commit/207bc24))
|
||||||
|
* **auth**: Redirect user after OAuth login and add logos icon collection ([aa6dda8](https://github.com/perfect-panel/ppanel-web/commit/aa6dda8))
|
||||||
|
* **auth**: Refactor mobile authentication config to support whitelist functionality ([c761ec7](https://github.com/perfect-panel/ppanel-web/commit/c761ec7))
|
||||||
|
* **billing**: Update Billing ([078fc9d](https://github.com/perfect-panel/ppanel-web/commit/078fc9d))
|
||||||
|
* **cdn**: Add CDN URL configuration and update related references ([0c90733](https://github.com/perfect-panel/ppanel-web/commit/0c90733))
|
||||||
|
* **config**: Add application selection and encryption settings to configuration form ([88b3504](https://github.com/perfect-panel/ppanel-web/commit/88b3504))
|
||||||
|
* **config**: FormatBytes ([9251a09](https://github.com/perfect-panel/ppanel-web/commit/9251a09))
|
||||||
|
* **config**: Protocol type ([a3b45b4](https://github.com/perfect-panel/ppanel-web/commit/a3b45b4))
|
||||||
|
* **config**: Update encryption fields in configuration form and refactor OAuth callback parameters ([652e032](https://github.com/perfect-panel/ppanel-web/commit/652e032))
|
||||||
|
* **config**: Webhook Domain ([01e06c6](https://github.com/perfect-panel/ppanel-web/commit/01e06c6))
|
||||||
|
* **dashboard**: Optimization ([5b3f4b4](https://github.com/perfect-panel/ppanel-web/commit/5b3f4b4))
|
||||||
|
* **dashboard**: Statistics ([2926abc](https://github.com/perfect-panel/ppanel-web/commit/2926abc))
|
||||||
|
* **device**: Modify IMEI to device identifier support ([e3f9ef6](https://github.com/perfect-panel/ppanel-web/commit/e3f9ef6))
|
||||||
|
* **email**: Add traffic exhaustion template ([bb3bd7b](https://github.com/perfect-panel/ppanel-web/commit/bb3bd7b))
|
||||||
|
* **favicon**: Update SVG favicon design for admin and user interfaces ([1d91738](https://github.com/perfect-panel/ppanel-web/commit/1d91738))
|
||||||
|
* **formatting**: Update differenceInDays function to return whole days or two decimal places ([bf58f25](https://github.com/perfect-panel/ppanel-web/commit/bf58f25))
|
||||||
|
* **form**: Make version field optional and set default value; update site domain placeholder for clarity ([42ba9e8](https://github.com/perfect-panel/ppanel-web/commit/42ba9e8))
|
||||||
|
* **global**: Add custom data ([6dbebd1](https://github.com/perfect-panel/ppanel-web/commit/6dbebd1))
|
||||||
|
* **global**: Add SMS configuration options to global store ([39a9ce6](https://github.com/perfect-panel/ppanel-web/commit/39a9ce6))
|
||||||
|
* **header**: Update locales ([bfb6c27](https://github.com/perfect-panel/ppanel-web/commit/bfb6c27))
|
||||||
|
* **imei**: Add IMEI related internationalization support and menu items ([13c3337](https://github.com/perfect-panel/ppanel-web/commit/13c3337))
|
||||||
|
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([ce31972](https://github.com/perfect-panel/ppanel-web/commit/ce31972))
|
||||||
|
* **input**: Add minimum value constraint and enhance number handling in EnhancedInput ([94822d9](https://github.com/perfect-panel/ppanel-web/commit/94822d9))
|
||||||
|
* **loading**: Add loading components and integrate them in Providers ([d5847fa](https://github.com/perfect-panel/ppanel-web/commit/d5847fa))
|
||||||
|
* **loading**: Replace loading animation with a simpler spinner and loading text ([f72df3a](https://github.com/perfect-panel/ppanel-web/commit/f72df3a))
|
||||||
|
* **loading**: Replace loading animation with a simpler spinner and loading text ([b8316bb](https://github.com/perfect-panel/ppanel-web/commit/b8316bb))
|
||||||
|
* **locale**: Add Persian ([93a0a88](https://github.com/perfect-panel/ppanel-web/commit/93a0a88))
|
||||||
|
* **locales**: Add area code and telephone fields to user forms in multiple languages ([9b8258c](https://github.com/perfect-panel/ppanel-web/commit/9b8258c))
|
||||||
|
* **locales**: Add description information of communication keys and encryption methods to enhance client configuration capabilities ([d1f5a9b](https://github.com/perfect-panel/ppanel-web/commit/d1f5a9b))
|
||||||
|
* **locales**: Add kick offline confirmation and success messages in multiple languages ([5db5343](https://github.com/perfect-panel/ppanel-web/commit/5db5343))
|
||||||
|
* **locales**: Add multiple languages ([b243ab9](https://github.com/perfect-panel/ppanel-web/commit/b243ab9))
|
||||||
|
* **locales**: Replace 'nodeGroupId' with 'groupId' in multiple language files for consistency ([a4e9d5d](https://github.com/perfect-panel/ppanel-web/commit/a4e9d5d))
|
||||||
|
* **locales**: Update 'deductBalance' to 'giftAmount' across multiple languages and fix newline in announcement.json ([70497af](https://github.com/perfect-panel/ppanel-web/commit/70497af))
|
||||||
|
* **locales**: Update 'sms' to 'mobile' in authentication methods across multiple languages ([fea2171](https://github.com/perfect-panel/ppanel-web/commit/fea2171))
|
||||||
|
* **log**: Add message log retrieval functionality and update related typings ([1c0ecae](https://github.com/perfect-panel/ppanel-web/commit/1c0ecae))
|
||||||
|
* **node-form**: Update number input fields to enforce step, min, and max values ([3f7b6d1](https://github.com/perfect-panel/ppanel-web/commit/3f7b6d1))
|
||||||
|
* **node-subscription**: Add copy functionality for columns ([3a81e37](https://github.com/perfect-panel/ppanel-web/commit/3a81e37))
|
||||||
|
* **node**: Add NodeStatus ([c712624](https://github.com/perfect-panel/ppanel-web/commit/c712624))
|
||||||
|
* **node**: Add protocol ([301b635](https://github.com/perfect-panel/ppanel-web/commit/301b635))
|
||||||
|
* **node**: Add serverKey ([25ce37e](https://github.com/perfect-panel/ppanel-web/commit/25ce37e))
|
||||||
|
* **node**: Add status ([c06372b](https://github.com/perfect-panel/ppanel-web/commit/c06372b))
|
||||||
|
* **node**: Add tags ([f408fdf](https://github.com/perfect-panel/ppanel-web/commit/f408fdf))
|
||||||
|
* **node**: Move the node configuration to the server module ([7f0f5ce](https://github.com/perfect-panel/ppanel-web/commit/7f0f5ce))
|
||||||
|
* **oauth**: Add certification component for handling OAuth login callbacks and improve user authentication flow ([5ed04c0](https://github.com/perfect-panel/ppanel-web/commit/5ed04c0))
|
||||||
|
* **oauth**: Implement OAuth token retrieval and refactor login callback handling ([40a6f7c](https://github.com/perfect-panel/ppanel-web/commit/40a6f7c))
|
||||||
|
* **oauth**: Refactor platform parameter handling and improve logout redirection logic ([8346c85](https://github.com/perfect-panel/ppanel-web/commit/8346c85))
|
||||||
|
* **oauth**: Update OAuth login handling to use callback parameter and improve URL parameter retrieval ([9227411](https://github.com/perfect-panel/ppanel-web/commit/9227411))
|
||||||
|
* **payment**: Add bank card payment ([7fa3a57](https://github.com/perfect-panel/ppanel-web/commit/7fa3a57))
|
||||||
|
* **payment**: Add isEdit prop to PaymentForm and disable fields when editing ([85f55de](https://github.com/perfect-panel/ppanel-web/commit/85f55de))
|
||||||
|
* **platform**: Update platform naming and add keywords and custom HTML fields ([6384237](https://github.com/perfect-panel/ppanel-web/commit/6384237))
|
||||||
|
* **privacy-policy**: Add privacy policy related text and links ([baa68f0](https://github.com/perfect-panel/ppanel-web/commit/baa68f0))
|
||||||
|
* **profile**: Update localization strings and enhance third-party account binding ([2d1effb](https://github.com/perfect-panel/ppanel-web/commit/2d1effb))
|
||||||
|
* **relay**: Add relay mode configuration and update related schemas ([3cc9477](https://github.com/perfect-panel/ppanel-web/commit/3cc9477))
|
||||||
|
* **release**: Extend supported platforms for Docker images, closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([e3a31eb](https://github.com/perfect-panel/ppanel-web/commit/e3a31eb))
|
||||||
|
* **schema**: Add security field to hysteria2 and tuic schemas ([cd59d44](https://github.com/perfect-panel/ppanel-web/commit/cd59d44))
|
||||||
|
* **site**: Added localization support for custom HTML and keyword fields ([f9d7736](https://github.com/perfect-panel/ppanel-web/commit/f9d7736))
|
||||||
|
* **sms**: Update locales ([938363b](https://github.com/perfect-panel/ppanel-web/commit/938363b))
|
||||||
|
* **stats**: Replace dynamic stat fetching with environment constants for user, server, and location counts ([46ae166](https://github.com/perfect-panel/ppanel-web/commit/46ae166))
|
||||||
|
* **subscribe**: Add 'sold' column to SubscribeTable and update inventory terminology ([19619fd](https://github.com/perfect-panel/ppanel-web/commit/19619fd))
|
||||||
|
* **subscribe**: Add reset_time to API typings and update unsubscribe logic ([eeea165](https://github.com/perfect-panel/ppanel-web/commit/eeea165))
|
||||||
|
* **subscribe**: Add subscribe_discount type ([f99c604](https://github.com/perfect-panel/ppanel-web/commit/f99c604))
|
||||||
|
* **subscribe**: Add subscription credits ([5bc7905](https://github.com/perfect-panel/ppanel-web/commit/5bc7905))
|
||||||
|
* **subscribe**: Add unit time ([39d07ec](https://github.com/perfect-panel/ppanel-web/commit/39d07ec))
|
||||||
|
* **subscribe**: Add unsubscribe functionality with confirmation messages and localized strings ([b2a2f42](https://github.com/perfect-panel/ppanel-web/commit/b2a2f42))
|
||||||
|
* **subscribe**: Improve error handling in subscription forms and update component props ([d28a10b](https://github.com/perfect-panel/ppanel-web/commit/d28a10b))
|
||||||
|
* **subscribe**: Improve layout and styling in subscription components ([5766376](https://github.com/perfect-panel/ppanel-web/commit/5766376))
|
||||||
|
* **subscribe**: Move subscription configuration and application to subscription module ([f90d4d2](https://github.com/perfect-panel/ppanel-web/commit/f90d4d2))
|
||||||
|
* **subscribe**: Update SubscribeTable component to use API.SubscribeItem type and ensure proper type casting ([f26f1c2](https://github.com/perfect-panel/ppanel-web/commit/f26f1c2))
|
||||||
|
* **subscribe**: Update suffix from 'MB' to 'Mbps' and enhance speed limit display logic ([3547bb1](https://github.com/perfect-panel/ppanel-web/commit/3547bb1))
|
||||||
|
* **subscription**: Improve layout and organization of subscription detail tabs ([e4630f8](https://github.com/perfect-panel/ppanel-web/commit/e4630f8))
|
||||||
|
* **subscription**: Add delete user subscription functionality ([1fc3a10](https://github.com/perfect-panel/ppanel-web/commit/1fc3a10))
|
||||||
|
* **subscription**: Add localized messages for existing subscriptions and deletion restrictions ([e8a72d5](https://github.com/perfect-panel/ppanel-web/commit/e8a72d5))
|
||||||
|
* **subscription**: Refactor subscription handling and update imports for better organization ([2215c7f](https://github.com/perfect-panel/ppanel-web/commit/2215c7f))
|
||||||
|
* **table**: Add sorting support for Node and subscription columns ([27924b0](https://github.com/perfect-panel/ppanel-web/commit/27924b0))
|
||||||
|
* **table**: Supports drag and drop sorting ([2f56ef5](https://github.com/perfect-panel/ppanel-web/commit/2f56ef5))
|
||||||
|
* **timeline**: Simplify timeline component layout and remove commented-out code ([fbad3b0](https://github.com/perfect-panel/ppanel-web/commit/fbad3b0))
|
||||||
|
* **tos**: Display data ([6024454](https://github.com/perfect-panel/ppanel-web/commit/6024454))
|
||||||
|
* **tutorial**: Add common tutorial list ([872252c](https://github.com/perfect-panel/ppanel-web/commit/872252c))
|
||||||
|
* **tutorial**: Fetch the latest tutorial version from GitHub API for dynamic URL generation ([28f8c78](https://github.com/perfect-panel/ppanel-web/commit/28f8c78))
|
||||||
|
* **ui**: System Tool ([1836980](https://github.com/perfect-panel/ppanel-web/commit/1836980))
|
||||||
|
* **ui**: Update homepage data ([8425b13](https://github.com/perfect-panel/ppanel-web/commit/8425b13))
|
||||||
|
* **ui**: Update input components and enhance card minimum width for better layout ([8a02310](https://github.com/perfect-panel/ppanel-web/commit/8a02310))
|
||||||
|
* **user**: Add 'gift_amount' field and update related references in user services and components ([b13c77e](https://github.com/perfect-panel/ppanel-web/commit/b13c77e))
|
||||||
|
* **user**: Add telephone input with area code selection and update localization ([585b99c](https://github.com/perfect-panel/ppanel-web/commit/585b99c))
|
||||||
|
* **user**: Add user Detail ([3a3d223](https://github.com/perfect-panel/ppanel-web/commit/3a3d223))
|
||||||
|
* **user**: Add User Detail ([fdaf11b](https://github.com/perfect-panel/ppanel-web/commit/fdaf11b))
|
||||||
* **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))
|
||||||
|
* Update Auth Control ([c59742a](https://github.com/perfect-panel/ppanel-web/commit/c59742a))
|
||||||
|
|
||||||
|
|
||||||
|
### 🎫 Chores
|
||||||
|
|
||||||
|
* **config**: Entry locale ([5737331](https://github.com/perfect-panel/ppanel-web/commit/5737331))
|
||||||
|
* **deps**: Update package dependencies across multiple projects for improved stability and performance ([b01a5bc](https://github.com/perfect-panel/ppanel-web/commit/b01a5bc))
|
||||||
|
* **init**: Project initialization ([829edfa](https://github.com/perfect-panel/ppanel-web/commit/829edfa))
|
||||||
|
* **merge**: Add advertising module and device settings ([0130e02](https://github.com/perfect-panel/ppanel-web/commit/0130e02))
|
||||||
|
* **merge**: Bump version to 1.0.0-beta.26 and update changelog ([3222016](https://github.com/perfect-panel/ppanel-web/commit/3222016))
|
||||||
|
* **release**: V1.0.0-beta.1 [skip ci] ([7284d1c](https://github.com/perfect-panel/ppanel-web/commit/7284d1c))
|
||||||
|
* **release**: V1.0.0-beta.10 [skip ci] ([5cf573a](https://github.com/perfect-panel/ppanel-web/commit/5cf573a))
|
||||||
|
* **release**: V1.0.0-beta.11 [skip ci] ([1f29506](https://github.com/perfect-panel/ppanel-web/commit/1f29506))
|
||||||
|
* **release**: V1.0.0-beta.12 [skip ci] ([4418c47](https://github.com/perfect-panel/ppanel-web/commit/4418c47))
|
||||||
|
* **release**: V1.0.0-beta.13 [skip ci] ([23c974a](https://github.com/perfect-panel/ppanel-web/commit/23c974a))
|
||||||
|
* **release**: V1.0.0-beta.14 [skip ci] ([0fb0d8b](https://github.com/perfect-panel/ppanel-web/commit/0fb0d8b))
|
||||||
|
* **release**: V1.0.0-beta.15 [skip ci] ([b2e8fad](https://github.com/perfect-panel/ppanel-web/commit/b2e8fad))
|
||||||
|
* **release**: V1.0.0-beta.16 [skip ci] ([c3eff0a](https://github.com/perfect-panel/ppanel-web/commit/c3eff0a))
|
||||||
|
* **release**: V1.0.0-beta.17 [skip ci] ([5b64389](https://github.com/perfect-panel/ppanel-web/commit/5b64389))
|
||||||
|
* **release**: V1.0.0-beta.18 [skip ci] ([4a00233](https://github.com/perfect-panel/ppanel-web/commit/4a00233))
|
||||||
|
* **release**: V1.0.0-beta.19 [skip ci] ([0f15fb8](https://github.com/perfect-panel/ppanel-web/commit/0f15fb8))
|
||||||
|
* **release**: V1.0.0-beta.2 [skip ci] ([087c36c](https://github.com/perfect-panel/ppanel-web/commit/087c36c))
|
||||||
|
* **release**: V1.0.0-beta.20 [skip ci] ([bbd44f0](https://github.com/perfect-panel/ppanel-web/commit/bbd44f0))
|
||||||
|
* **release**: V1.0.0-beta.21 [skip ci] ([ca642c2](https://github.com/perfect-panel/ppanel-web/commit/ca642c2))
|
||||||
|
* **release**: V1.0.0-beta.22 [skip ci] ([c0fb34f](https://github.com/perfect-panel/ppanel-web/commit/c0fb34f))
|
||||||
|
* **release**: V1.0.0-beta.23 [skip ci] ([cf1d66d](https://github.com/perfect-panel/ppanel-web/commit/cf1d66d))
|
||||||
|
* **release**: V1.0.0-beta.24 [skip ci] ([01a3aa0](https://github.com/perfect-panel/ppanel-web/commit/01a3aa0))
|
||||||
|
* **release**: V1.0.0-beta.25 [skip ci] ([047a698](https://github.com/perfect-panel/ppanel-web/commit/047a698))
|
||||||
|
* **release**: V1.0.0-beta.26 [skip ci] ([79edea7](https://github.com/perfect-panel/ppanel-web/commit/79edea7))
|
||||||
|
* **release**: V1.0.0-beta.27 [skip ci] ([092477b](https://github.com/perfect-panel/ppanel-web/commit/092477b))
|
||||||
|
* **release**: V1.0.0-beta.27 [skip ci] ([85fdc36](https://github.com/perfect-panel/ppanel-web/commit/85fdc36))
|
||||||
|
* **release**: V1.0.0-beta.28 [skip ci] ([786ba0e](https://github.com/perfect-panel/ppanel-web/commit/786ba0e))
|
||||||
|
* **release**: V1.0.0-beta.28 [skip ci] ([d10ecc9](https://github.com/perfect-panel/ppanel-web/commit/d10ecc9))
|
||||||
|
* **release**: V1.0.0-beta.29 [skip ci] ([29bc3c7](https://github.com/perfect-panel/ppanel-web/commit/29bc3c7))
|
||||||
|
* **release**: V1.0.0-beta.3 [skip ci] ([cd49427](https://github.com/perfect-panel/ppanel-web/commit/cd49427))
|
||||||
|
* **release**: V1.0.0-beta.30 [skip ci] ([db0d9e0](https://github.com/perfect-panel/ppanel-web/commit/db0d9e0))
|
||||||
|
* **release**: V1.0.0-beta.31 [skip ci] ([aa1d426](https://github.com/perfect-panel/ppanel-web/commit/aa1d426))
|
||||||
|
* **release**: V1.0.0-beta.32 [skip ci] ([fa56eb8](https://github.com/perfect-panel/ppanel-web/commit/fa56eb8))
|
||||||
|
* **release**: V1.0.0-beta.33 [skip ci] ([383638f](https://github.com/perfect-panel/ppanel-web/commit/383638f))
|
||||||
|
* **release**: V1.0.0-beta.34 [skip ci] ([7023875](https://github.com/perfect-panel/ppanel-web/commit/7023875))
|
||||||
|
* **release**: V1.0.0-beta.4 [skip ci] ([10d322f](https://github.com/perfect-panel/ppanel-web/commit/10d322f))
|
||||||
|
* **release**: V1.0.0-beta.5 [skip ci] ([f275f01](https://github.com/perfect-panel/ppanel-web/commit/f275f01))
|
||||||
|
* **release**: V1.0.0-beta.6 [skip ci] ([dd23279](https://github.com/perfect-panel/ppanel-web/commit/dd23279))
|
||||||
|
* **release**: V1.0.0-beta.7 [skip ci] ([f60d40c](https://github.com/perfect-panel/ppanel-web/commit/f60d40c))
|
||||||
|
* **release**: V1.0.0-beta.8 [skip ci], closes [#9](https://github.com/perfect-panel/ppanel-web/issues/9) ([a593eac](https://github.com/perfect-panel/ppanel-web/commit/a593eac))
|
||||||
|
* **release**: V1.0.0-beta.9 [skip ci] ([855d1b0](https://github.com/perfect-panel/ppanel-web/commit/855d1b0))
|
||||||
|
* **ui**: Update package dependencies for improved stability and performance ([25da429](https://github.com/perfect-panel/ppanel-web/commit/25da429))
|
||||||
|
* Merge branch 'beta' into develop ([f219c52](https://github.com/perfect-panel/ppanel-web/commit/f219c52))
|
||||||
|
* Update changelog, enhance prepare script, and add openapi command ([a93db4e](https://github.com/perfect-panel/ppanel-web/commit/a93db4e))
|
||||||
|
|
||||||
|
|
||||||
### 🐛 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))
|
||||||
|
* **affiliate**: Update user identifier ([35f92c9](https://github.com/perfect-panel/ppanel-web/commit/35f92c9))
|
||||||
|
* **api**: Fix type error in API request and add return URL parameter ([ee286dd](https://github.com/perfect-panel/ppanel-web/commit/ee286dd))
|
||||||
|
* **api**: PreCreateOrder ([ca747f5](https://github.com/perfect-panel/ppanel-web/commit/ca747f5))
|
||||||
|
* **api**: Purge ([98c1c30](https://github.com/perfect-panel/ppanel-web/commit/98c1c30))
|
||||||
|
* **api**: Remove redundant requestType parameter in appleLoginCallback ([0aa5d5b](https://github.com/perfect-panel/ppanel-web/commit/0aa5d5b))
|
||||||
|
* **api**: Rename app-related functions and types to application for consistency ([9d8b814](https://github.com/perfect-panel/ppanel-web/commit/9d8b814))
|
||||||
|
* **api**: Replace 'deduction' with 'gift_amount' and add 'commission' field in type definitions ([77edf1d](https://github.com/perfect-panel/ppanel-web/commit/77edf1d))
|
||||||
|
* **api**: Server and order ([255bd82](https://github.com/perfect-panel/ppanel-web/commit/255bd82))
|
||||||
|
* **api**: Statistics ([7962162](https://github.com/perfect-panel/ppanel-web/commit/7962162))
|
||||||
|
* **api**: Subscribe token ([1932ba7](https://github.com/perfect-panel/ppanel-web/commit/1932ba7))
|
||||||
|
* **api**: Update API type definitions to replace 'deduction' with 'gift_amount' and make 'commission' field optional ([c2af060](https://github.com/perfect-panel/ppanel-web/commit/c2af060))
|
||||||
|
* **api**: Update Model ([39aaa73](https://github.com/perfect-panel/ppanel-web/commit/39aaa73))
|
||||||
|
* **api**: Update subscription_protocol to subscribe_type for consistency across services ([b6da51b](https://github.com/perfect-panel/ppanel-web/commit/b6da51b))
|
||||||
|
* **auth-control**: Fix citation error for platform values ([c940f3c](https://github.com/perfect-panel/ppanel-web/commit/c940f3c))
|
||||||
|
* **auth-control**: Fix citation error for platform values ([28813d2](https://github.com/perfect-panel/ppanel-web/commit/28813d2))
|
||||||
|
* **auth-control**: Rename phone_variable to phone_number in mobile verification configuration ([e5455aa](https://github.com/perfect-panel/ppanel-web/commit/e5455aa))
|
||||||
|
* **auth**: Add error handling to form submission and reset Turnstile on failure ([715d011](https://github.com/perfect-panel/ppanel-web/commit/715d011))
|
||||||
|
* **auth**: Change Textarea value to defaultValue for client_secret in Apple auth page ([69fc670](https://github.com/perfect-panel/ppanel-web/commit/69fc670))
|
||||||
|
* **auth**: Refactor forms to use Turnstile ref for reset functionality ([320a7dc](https://github.com/perfect-panel/ppanel-web/commit/320a7dc))
|
||||||
|
* **auth**: Refactor reset password form to simplify code input and update placeholder text ([23833b4](https://github.com/perfect-panel/ppanel-web/commit/23833b4))
|
||||||
|
* **auth**: Refactor user authentication forms to remove global store dependency and improve type handling ([12026b0](https://github.com/perfect-panel/ppanel-web/commit/12026b0))
|
||||||
|
* **auth**: Remove unused telephone code login function and update typings for telephone login requests ([7239685](https://github.com/perfect-panel/ppanel-web/commit/7239685))
|
||||||
|
* **auth**: Require minimum length for invite string when forced invite is enabled ([a604f28](https://github.com/perfect-panel/ppanel-web/commit/a604f28))
|
||||||
|
* **auth**: Simplify email verification code input rendering ([6f7bc37](https://github.com/perfect-panel/ppanel-web/commit/6f7bc37))
|
||||||
|
* **auth**: Update authentication configuration and localization strings ([47f2c58](https://github.com/perfect-panel/ppanel-web/commit/47f2c58))
|
||||||
|
* **auth**: Update email verification logic to use domain suffix check ([62662bb](https://github.com/perfect-panel/ppanel-web/commit/62662bb))
|
||||||
|
* **auth**: Update user authentication flow to include email and phone code verification ([5d078fd](https://github.com/perfect-panel/ppanel-web/commit/5d078fd))
|
||||||
|
* **auth**: Update UserCheckForm to use setInitialValues and modify onSubmit type ([c984c0d](https://github.com/perfect-panel/ppanel-web/commit/c984c0d))
|
||||||
|
* **billing**: ExpiryDate ([e85e545](https://github.com/perfect-panel/ppanel-web/commit/e85e545))
|
||||||
|
* **billing**: I18n and styles ([81e0f21](https://github.com/perfect-panel/ppanel-web/commit/81e0f21))
|
||||||
|
* **changelog**: Update change log style ([cfa3fc0](https://github.com/perfect-panel/ppanel-web/commit/cfa3fc0))
|
||||||
|
* **config**: AlipayF2F ([6c07107](https://github.com/perfect-panel/ppanel-web/commit/6c07107))
|
||||||
|
* **config**: Bugs ([f57e40c](https://github.com/perfect-panel/ppanel-web/commit/f57e40c))
|
||||||
|
* **config**: Checkout Order ([a31e763](https://github.com/perfect-panel/ppanel-web/commit/a31e763))
|
||||||
|
* **config**: FormatBytes ([bbc2da0](https://github.com/perfect-panel/ppanel-web/commit/bbc2da0))
|
||||||
|
* **config**: NoStore ([2cc18cf](https://github.com/perfect-panel/ppanel-web/commit/2cc18cf))
|
||||||
|
* **config**: Runtime env ([a1e4999](https://github.com/perfect-panel/ppanel-web/commit/a1e4999))
|
||||||
|
* **config**: Status Percentag ([8f322fb](https://github.com/perfect-panel/ppanel-web/commit/8f322fb))
|
||||||
|
* **config**: SubLink ([1c61966](https://github.com/perfect-panel/ppanel-web/commit/1c61966))
|
||||||
|
* **config**: Subscribe Link ([11ea821](https://github.com/perfect-panel/ppanel-web/commit/11ea821))
|
||||||
|
* **content**: Parse subscription description and display features with icons ([3c5542a](https://github.com/perfect-panel/ppanel-web/commit/3c5542a))
|
||||||
|
* **controller**: Order status ([8c6a097](https://github.com/perfect-panel/ppanel-web/commit/8c6a097))
|
||||||
|
* **coupon**: Rename 'server' field to 'subscribe' in coupon form and update coupon update request type ([f8b6d82](https://github.com/perfect-panel/ppanel-web/commit/f8b6d82))
|
||||||
|
* **dashboard**: Improve URL encoding for subscription links and enhance success message handling ([4983c33](https://github.com/perfect-panel/ppanel-web/commit/4983c33))
|
||||||
|
* **dashboard**: Update date display to use start_time if available ([e551232](https://github.com/perfect-panel/ppanel-web/commit/e551232))
|
||||||
|
* **dashboard**: Correct progress value calculations and update groupId accessor ([36c7667](https://github.com/perfect-panel/ppanel-web/commit/36c7667))
|
||||||
|
* **dashboard**: Display subscription creation date in user dashboard ([d0e6df0](https://github.com/perfect-panel/ppanel-web/commit/d0e6df0))
|
||||||
|
* **dashboard**: Format Bytes ([d8b0bd9](https://github.com/perfect-panel/ppanel-web/commit/d8b0bd9))
|
||||||
|
* **dashboard**: Update icon imports for platform consistency and adjust icon size ([3e8912e](https://github.com/perfect-panel/ppanel-web/commit/3e8912e))
|
||||||
|
* **dashboard**: Update platform detection logic and improve layout responsiveness ([b0aa364](https://github.com/perfect-panel/ppanel-web/commit/b0aa364))
|
||||||
|
* **deps**: Remove outdated @iconify/react dependency and add iconify-json packages ([d6fbc38](https://github.com/perfect-panel/ppanel-web/commit/d6fbc38))
|
||||||
|
* **deps**: Typescript config ([34e24b8](https://github.com/perfect-panel/ppanel-web/commit/34e24b8))
|
||||||
|
* **deps**: Update clipboard ([5572710](https://github.com/perfect-panel/ppanel-web/commit/5572710))
|
||||||
|
* **editor**: Change value ([4fdfeb2](https://github.com/perfect-panel/ppanel-web/commit/4fdfeb2))
|
||||||
|
* **email**: Update platform configuration handling to use current ref for consistency ([c90175b](https://github.com/perfect-panel/ppanel-web/commit/c90175b))
|
||||||
|
* **footer**: Email address ([a451f44](https://github.com/perfect-panel/ppanel-web/commit/a451f44))
|
||||||
|
* **forms**: Add step attribute to number inputs for better value control ([b8f4f1e](https://github.com/perfect-panel/ppanel-web/commit/b8f4f1e))
|
||||||
|
* **icon**: Comment out unused icon collection imports ([f17bf8d](https://github.com/perfect-panel/ppanel-web/commit/f17bf8d))
|
||||||
|
* **layout**: Remove unnecessary cookie initialization in Logout function ([3065c3a](https://github.com/perfect-panel/ppanel-web/commit/3065c3a))
|
||||||
|
* **locale**: Default value ([937408f](https://github.com/perfect-panel/ppanel-web/commit/937408f))
|
||||||
|
* **locale**: Document ([6f0fa20](https://github.com/perfect-panel/ppanel-web/commit/6f0fa20))
|
||||||
|
* **locale**: Empty ([3832d20](https://github.com/perfect-panel/ppanel-web/commit/3832d20))
|
||||||
|
* **locale**: Input Placeholder Webhook Domain ([bca0935](https://github.com/perfect-panel/ppanel-web/commit/bca0935))
|
||||||
|
* **locale**: Language Select ([0befdb0](https://github.com/perfect-panel/ppanel-web/commit/0befdb0))
|
||||||
|
* **locales**: Add error message for incorrect user information ([52c1d1f](https://github.com/perfect-panel/ppanel-web/commit/52c1d1f))
|
||||||
|
* **locales**: Add error message for incorrect user information ([3d92902](https://github.com/perfect-panel/ppanel-web/commit/3d92902))
|
||||||
|
* **locales**: Add logout message to authentication localization files ([1d0d911](https://github.com/perfect-panel/ppanel-web/commit/1d0d911))
|
||||||
|
* **locales**: Fixed description in multilingual files, updated text related to email registration functionality ([c356bc2](https://github.com/perfect-panel/ppanel-web/commit/c356bc2))
|
||||||
|
* **locales**: Order recharge related fields ([35210fe](https://github.com/perfect-panel/ppanel-web/commit/35210fe))
|
||||||
|
* **locales**: Removed language file import to clean up unnecessary language support ([68f6ab2](https://github.com/perfect-panel/ppanel-web/commit/68f6ab2))
|
||||||
|
* **locales**: Removed multilingual files to clean up unnecessary language support ([5b151cd](https://github.com/perfect-panel/ppanel-web/commit/5b151cd))
|
||||||
|
* **locale**: Subscription Path Description ([4c67387](https://github.com/perfect-panel/ppanel-web/commit/4c67387))
|
||||||
|
* **locales**: Update custom HTML description for clarity across multiple languages ([557c5cd](https://github.com/perfect-panel/ppanel-web/commit/557c5cd))
|
||||||
|
* **locales**: Update custom HTML description in language file, ([87381da](https://github.com/perfect-panel/ppanel-web/commit/87381da))
|
||||||
|
* **locales**: Update expiration time description from minutes to seconds in multiple languages ([5bac933](https://github.com/perfect-panel/ppanel-web/commit/5bac933))
|
||||||
|
* **locales**: Update Hong Kong ([6d0d069](https://github.com/perfect-panel/ppanel-web/commit/6d0d069))
|
||||||
|
* **locales**: Update invite code text to indicate it's optional ([6a34bfb](https://github.com/perfect-panel/ppanel-web/commit/6a34bfb))
|
||||||
|
* **logs**: Update log display to render key-value pairs and remove badge ([5ea6489](https://github.com/perfect-panel/ppanel-web/commit/5ea6489))
|
||||||
|
* **metadata**: Global metadata ([15d5ecf](https://github.com/perfect-panel/ppanel-web/commit/15d5ecf))
|
||||||
|
* **nav**: Comment out unused social login options to simplify navigation configuration ([cefcb31](https://github.com/perfect-panel/ppanel-web/commit/cefcb31))
|
||||||
|
* **node-config**: Add null checks for time slots and ensure proper handling of undefined values ([1cdb7e7](https://github.com/perfect-panel/ppanel-web/commit/1cdb7e7))
|
||||||
|
* **node**: Add country and city fields to the form schema and localization files ([8775fb6](https://github.com/perfect-panel/ppanel-web/commit/8775fb6))
|
||||||
* **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))
|
||||||
|
* **node**: Locale and form ([38be4d5](https://github.com/perfect-panel/ppanel-web/commit/38be4d5))
|
||||||
|
* **node**: Port config ([a20834a](https://github.com/perfect-panel/ppanel-web/commit/a20834a))
|
||||||
|
* **node**: Reality config ([fadd17f](https://github.com/perfect-panel/ppanel-web/commit/fadd17f))
|
||||||
|
* **node**: Service Name config ([d0be685](https://github.com/perfect-panel/ppanel-web/commit/d0be685))
|
||||||
|
* **node**: TLS config ([57fae12](https://github.com/perfect-panel/ppanel-web/commit/57fae12))
|
||||||
|
* **node**: Trojan protocol config ([7e1eb90](https://github.com/perfect-panel/ppanel-web/commit/7e1eb90))
|
||||||
|
* **notify**: Ensure user info is updated after notification settings submission ([9bc3a94](https://github.com/perfect-panel/ppanel-web/commit/9bc3a94))
|
||||||
|
* **notify**: Set default values for notification settings to false ([3652819](https://github.com/perfect-panel/ppanel-web/commit/3652819))
|
||||||
|
* **oauth**: Refactor OAuth configuration types and update related API methods ([6227ba9](https://github.com/perfect-panel/ppanel-web/commit/6227ba9))
|
||||||
|
* **oauth**: Remove redundant checks when updating configuration to simplify logic ([9140b8a](https://github.com/perfect-panel/ppanel-web/commit/9140b8a))
|
||||||
|
* **payment**: Add notification URL field to payment management interface ([5c710e1](https://github.com/perfect-panel/ppanel-web/commit/5c710e1))
|
||||||
|
* **payment**: Config and types ([b0c87fb](https://github.com/perfect-panel/ppanel-web/commit/b0c87fb))
|
||||||
|
* **payment**: Fix payment related type definitions and update payment method references ([c3138a8](https://github.com/perfect-panel/ppanel-web/commit/c3138a8))
|
||||||
|
* **payment**: Qrcode ([a9a535b](https://github.com/perfect-panel/ppanel-web/commit/a9a535b))
|
||||||
|
* **payment**: Refactor payment form placeholder and update localization files ([4a4d364](https://github.com/perfect-panel/ppanel-web/commit/4a4d364))
|
||||||
|
* **payment**: Refactor purchaseCheckout usage and remove redundant code ([a5e2079](https://github.com/perfect-panel/ppanel-web/commit/a5e2079))
|
||||||
|
* **payment**: Replace window.open with window.location.href for checkout links ([1d8c765](https://github.com/perfect-panel/ppanel-web/commit/1d8c765))
|
||||||
|
* **payment**: Update checkout type from 'link' to 'url' for consistency ([136a1ab](https://github.com/perfect-panel/ppanel-web/commit/136a1ab))
|
||||||
|
* **payment**: Update payment information ([70d6a38](https://github.com/perfect-panel/ppanel-web/commit/70d6a38))
|
||||||
|
* **payment**: Update payment method update logic to include row data ([6752420](https://github.com/perfect-panel/ppanel-web/commit/6752420))
|
||||||
|
* **phone**: Update SMS expiration time field to use 'sms_expire_time' with default value of 300 ([18b07c7](https://github.com/perfect-panel/ppanel-web/commit/18b07c7))
|
||||||
|
* **profile**: Restore filter to ensure only valid OAuth accounts are shown ([315c8f9](https://github.com/perfect-panel/ppanel-web/commit/315c8f9))
|
||||||
|
* **purchasing**: Update payment type to lowercase and add optional chaining for discounts ([c06ea49](https://github.com/perfect-panel/ppanel-web/commit/c06ea49))
|
||||||
|
* **redirect**: Simplify redirect URL logic by removing unnecessary condition for sessionStorage ([c53ac61](https://github.com/perfect-panel/ppanel-web/commit/c53ac61))
|
||||||
|
* **redirect**: Update redirect URL logic to ensure proper handling of OAuth and auth paths ([7954762](https://github.com/perfect-panel/ppanel-web/commit/7954762))
|
||||||
|
* **register**: Adjust user email verification logic to handle domain suffix checks correctly ([686aa2d](https://github.com/perfect-panel/ppanel-web/commit/686aa2d))
|
||||||
|
* **request**: Add error code 40005 to trigger logout ([71bf002](https://github.com/perfect-panel/ppanel-web/commit/71bf002))
|
||||||
|
* **request**: Locale ([37d408f](https://github.com/perfect-panel/ppanel-web/commit/37d408f))
|
||||||
|
* **rule-form**: Remove redundant rule set display ([6e0c9b6](https://github.com/perfect-panel/ppanel-web/commit/6e0c9b6))
|
||||||
|
* **rules**: Remove unused MATCH rule ([674a01c](https://github.com/perfect-panel/ppanel-web/commit/674a01c))
|
||||||
|
* **site**: Add image upload functionality for site logo configuration ([4ea6e4a](https://github.com/perfect-panel/ppanel-web/commit/4ea6e4a))
|
||||||
|
* **site**: Se ref to store site configuration for updates ([0c8f091](https://github.com/perfect-panel/ppanel-web/commit/0c8f091))
|
||||||
|
* **sort**: Refactor sorting logic in NodeTable and SubscribeTable components for improved clarity and performance ([331bbea](https://github.com/perfect-panel/ppanel-web/commit/331bbea))
|
||||||
* **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**: Discount ([35a9f69](https://github.com/perfect-panel/ppanel-web/commit/35a9f69))
|
||||||
|
* **subscribe**: Extract Domain ([40d61a9](https://github.com/perfect-panel/ppanel-web/commit/40d61a9))
|
||||||
|
* **subscribe**: Handle optional values in price and discount calculations ([5939763](https://github.com/perfect-panel/ppanel-web/commit/5939763))
|
||||||
|
* **subscribe**: Jumps and internationalization ([13fdec3](https://github.com/perfect-panel/ppanel-web/commit/13fdec3))
|
||||||
* **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**: Server group id ([90e6764](https://github.com/perfect-panel/ppanel-web/commit/90e6764))
|
||||||
* **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))
|
||||||
|
* **subscribe**: Update forms to include refetch functionality and improve toast messages ([fc55e95](https://github.com/perfect-panel/ppanel-web/commit/fc55e95))
|
||||||
|
* **subscribe**: Update payment return URL ([2b80496](https://github.com/perfect-panel/ppanel-web/commit/2b80496))
|
||||||
|
* **subscribe**: Update subscription domain placeholder to include examples; improve site name retrieval in global store ([c65a44c](https://github.com/perfect-panel/ppanel-web/commit/c65a44c))
|
||||||
|
* **subscribe**: Update value validation to check for number type in subscribe form ([6de29d5](https://github.com/perfect-panel/ppanel-web/commit/6de29d5))
|
||||||
|
* **subscription**: Add reset functionality for user subscription token ([39e89bf](https://github.com/perfect-panel/ppanel-web/commit/39e89bf))
|
||||||
|
* **table**: Update privacy policy tab translation key and remove unnecessary requestType from OAuth callback ([14b3af5](https://github.com/perfect-panel/ppanel-web/commit/14b3af5))
|
||||||
|
* **third-party-accounts**: Remove mobile display logic from third-party accounts component ([b4946f7](https://github.com/perfect-panel/ppanel-web/commit/b4946f7))
|
||||||
|
* **third-party-accounts**: Update redirect property name in binding response handling ([012e83a](https://github.com/perfect-panel/ppanel-web/commit/012e83a))
|
||||||
|
* **turnstile**: Turnstile_site_key ([0327b73](https://github.com/perfect-panel/ppanel-web/commit/0327b73))
|
||||||
|
* **type**: Fix ts type check error ([3cb0629](https://github.com/perfect-panel/ppanel-web/commit/3cb0629))
|
||||||
|
* **types**: Add 'gift_amount' field to API type definitions ([8f8a12a](https://github.com/perfect-panel/ppanel-web/commit/8f8a12a))
|
||||||
|
* **types**: Checking ([2992824](https://github.com/perfect-panel/ppanel-web/commit/2992824))
|
||||||
|
* **types**: Order type ([c7e50a9](https://github.com/perfect-panel/ppanel-web/commit/c7e50a9))
|
||||||
|
* **ui**: Bugs ([b023d0f](https://github.com/perfect-panel/ppanel-web/commit/b023d0f))
|
||||||
|
* **ui**: Components ([a7927d7](https://github.com/perfect-panel/ppanel-web/commit/a7927d7))
|
||||||
|
* **ui**: Fix json formatting ([e1ddd94](https://github.com/perfect-panel/ppanel-web/commit/e1ddd94))
|
||||||
|
* **ui**: Improve dashboard layout and enhance button functionality; open checkout URLs in a new tab ([fc0da76](https://github.com/perfect-panel/ppanel-web/commit/fc0da76))
|
||||||
|
* **ui**: Multiple display bugs ([f5d8fd3](https://github.com/perfect-panel/ppanel-web/commit/f5d8fd3))
|
||||||
|
* **user-nav**: Update user avatar and label to display telephone if email is not available ([7b6bb7b](https://github.com/perfect-panel/ppanel-web/commit/7b6bb7b))
|
||||||
|
* **user**: Add the 'gift_amount' field to the user service's type definition ([6301409](https://github.com/perfect-panel/ppanel-web/commit/6301409))
|
||||||
|
* **user**: Refactor user form validation and reset password fields ([6733fc2](https://github.com/perfect-panel/ppanel-web/commit/6733fc2))
|
||||||
|
* **user**: Update locales ([4e7d249](https://github.com/perfect-panel/ppanel-web/commit/4e7d249))
|
||||||
|
* **user**: Update notification and verify code settings ([574b043](https://github.com/perfect-panel/ppanel-web/commit/574b043))
|
||||||
|
* **user**: Update user identifier field and localizations ([1b6befa](https://github.com/perfect-panel/ppanel-web/commit/1b6befa))
|
||||||
|
* **user**: Update user subscribe display ([3bb714d](https://github.com/perfect-panel/ppanel-web/commit/3bb714d))
|
||||||
|
* **utils**: Login redirect url ([cbe5f0d](https://github.com/perfect-panel/ppanel-web/commit/cbe5f0d))
|
||||||
|
* More bugs ([2d88a3a](https://github.com/perfect-panel/ppanel-web/commit/2d88a3a))
|
||||||
|
|
||||||
|
|
||||||
|
### 👷 Build System
|
||||||
|
|
||||||
|
* **config**: Update pm2 config ([d95b425](https://github.com/perfect-panel/ppanel-web/commit/d95b425))
|
||||||
|
|
||||||
|
|
||||||
|
### 💄 Styles
|
||||||
|
|
||||||
|
* **dashboard**: Adjust grid layout and update image dimensions in application display ([f3204b7](https://github.com/perfect-panel/ppanel-web/commit/f3204b7))
|
||||||
|
* **dashboard**: Enhance card components with full height and improved empty state handling ([7e1d551](https://github.com/perfect-panel/ppanel-web/commit/7e1d551))
|
||||||
|
* **document**: Update ([0a8109b](https://github.com/perfect-panel/ppanel-web/commit/0a8109b))
|
||||||
|
* **globals**: Refactor delete confirmation button and update badge styles in node and subscribe tables ([30ae781](https://github.com/perfect-panel/ppanel-web/commit/30ae781))
|
||||||
|
* **locales**: Remove unused subscription labels from multiple locale files ([fb0c510](https://github.com/perfect-panel/ppanel-web/commit/fb0c510))
|
||||||
|
* **locales**: Update server.json to reorganize relay mode options and improve labels ([701cdee](https://github.com/perfect-panel/ppanel-web/commit/701cdee))
|
||||||
|
* **node**: Form ([d5f5add](https://github.com/perfect-panel/ppanel-web/commit/d5f5add))
|
||||||
|
* **node**: Improve layout and spacing in NodeStatusCell component ([136287d](https://github.com/perfect-panel/ppanel-web/commit/136287d))
|
||||||
|
* **node**: Protocol Tab ([2bcb925](https://github.com/perfect-panel/ppanel-web/commit/2bcb925))
|
||||||
|
* **time-slot**: Add chart display ([c44ad47](https://github.com/perfect-panel/ppanel-web/commit/c44ad47))
|
||||||
|
* **ui**: Update mobile style ([eda18bc](https://github.com/perfect-panel/ppanel-web/commit/eda18bc))
|
||||||
|
* Update node secret UI and add telephone code field to authentication form ([770932e](https://github.com/perfect-panel/ppanel-web/commit/770932e))
|
||||||
|
|
||||||
|
|
||||||
|
### 📝 Documentation
|
||||||
|
|
||||||
|
* **readme**: License name ([74cb16b](https://github.com/perfect-panel/ppanel-web/commit/74cb16b))
|
||||||
|
|
||||||
|
|
||||||
|
### 🔧 Continuous Integration
|
||||||
|
|
||||||
|
* **github**: Release docker ([5af60aa](https://github.com/perfect-panel/ppanel-web/commit/5af60aa))
|
||||||
|
* **step**: Update step name ([9eca618](https://github.com/perfect-panel/ppanel-web/commit/9eca618))
|
||||||
|
|
||||||
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
### ✨ Features
|
||||||
|
|
||||||
|
- **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))
|
||||||
|
- **user**: Integrate subscription list into user management, update request parameters and types ([8d49dac](https://github.com/perfect-panel/ppanel-web/commit/8d49dac))
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- **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))
|
||||||
|
- **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**: 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))
|
||||||
|
|
||||||
<a name="readme-top"></a>
|
<a name="readme-top"></a>
|
||||||
|
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ export default function PaymentForm<T>({
|
|||||||
<FormLabel>{t('domain')}</FormLabel>
|
<FormLabel>{t('domain')}</FormLabel>
|
||||||
<FormControl>
|
<FormControl>
|
||||||
<EnhancedInput
|
<EnhancedInput
|
||||||
placeholder={t('domainPlaceholder', { example: 'http(s)://example.com' })}
|
placeholder='http(s)://example.com'
|
||||||
value={field.value}
|
value={field.value}
|
||||||
onValueChange={(value) => form.setValue('domain', value as string)}
|
onValueChange={(value) => form.setValue('domain', value as string)}
|
||||||
/>
|
/>
|
||||||
@@ -371,6 +371,7 @@ export default function PaymentForm<T>({
|
|||||||
? configValues[fieldKey]
|
? configValues[fieldKey]
|
||||||
: ''
|
: ''
|
||||||
}
|
}
|
||||||
|
disabled={fieldKey === 'webhook_secret'}
|
||||||
onValueChange={(value) => {
|
onValueChange={(value) => {
|
||||||
const newConfig = { ...configValues };
|
const newConfig = { ...configValues };
|
||||||
newConfig[fieldKey] = value;
|
newConfig[fieldKey] = value;
|
||||||
|
|||||||
@@ -201,7 +201,6 @@ export default function RuleForm<T extends Record<string, any>>({
|
|||||||
<p className='font-mono'>DST-PORT,80,DIRECT</p>
|
<p className='font-mono'>DST-PORT,80,DIRECT</p>
|
||||||
<p className='font-mono'>SRC-PORT,7777,REJECT</p>
|
<p className='font-mono'>SRC-PORT,7777,REJECT</p>
|
||||||
<p className='font-mono'>PROCESS-NAME,telegram</p>
|
<p className='font-mono'>PROCESS-NAME,telegram</p>
|
||||||
<p className='font-mono'>RULE-SET,netflix</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<FormMessage />
|
<FormMessage />
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ import {
|
|||||||
AlertDialogTitle,
|
AlertDialogTitle,
|
||||||
AlertDialogTrigger,
|
AlertDialogTrigger,
|
||||||
} from '@workspace/ui/components/alert-dialog';
|
} from '@workspace/ui/components/alert-dialog';
|
||||||
import { Badge } from '@workspace/ui/components/badge';
|
|
||||||
import { Button } from '@workspace/ui/components/button';
|
import { Button } from '@workspace/ui/components/button';
|
||||||
import {
|
import {
|
||||||
Card,
|
Card,
|
||||||
@@ -145,20 +144,24 @@ export default function Page() {
|
|||||||
<AccordionItem key={index} value={`item-${index}`} className='px-4'>
|
<AccordionItem key={index} value={`item-${index}`} className='px-4'>
|
||||||
<AccordionTrigger className='hover:no-underline'>
|
<AccordionTrigger className='hover:no-underline'>
|
||||||
<div className='flex w-full flex-col items-start space-y-2 sm:flex-row sm:items-center sm:space-x-4 sm:space-y-0'>
|
<div className='flex w-full flex-col items-start space-y-2 sm:flex-row sm:items-center sm:space-x-4 sm:space-y-0'>
|
||||||
<Badge
|
<span className='text-xs font-medium sm:text-sm'>{log.timestamp}</span>
|
||||||
variant='outline'
|
|
||||||
className={`${getLogLevelColor(log.level)} mb-2 sm:mb-0`}
|
|
||||||
>
|
|
||||||
{log.level}
|
|
||||||
</Badge>
|
|
||||||
<span className='text-xs font-medium sm:text-sm'>{log.time}</span>
|
|
||||||
<span className='text-muted-foreground flex-1 truncate text-xs sm:text-sm'>
|
|
||||||
{log.message}
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</AccordionTrigger>
|
</AccordionTrigger>
|
||||||
<AccordionContent className='px-2'>
|
<AccordionContent className='px-2'>
|
||||||
<div className='grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm'>
|
{
|
||||||
|
// 直接渲染 key: value
|
||||||
|
|
||||||
|
Object.entries(log).map(([key, value]) => (
|
||||||
|
<div
|
||||||
|
key={key}
|
||||||
|
className='grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm'
|
||||||
|
>
|
||||||
|
<span className='font-medium'>{key}:</span>
|
||||||
|
<span className='break-all'>{value as string}</span>
|
||||||
|
</div>
|
||||||
|
))
|
||||||
|
}
|
||||||
|
{/* <div className='grid grid-cols-1 gap-2 text-xs sm:grid-cols-2 sm:text-sm'>
|
||||||
<div className='font-medium'>{t('ip')}:</div>
|
<div className='font-medium'>{t('ip')}:</div>
|
||||||
<div>{log.ip}</div>
|
<div>{log.ip}</div>
|
||||||
<div className='font-medium'>{t('request')}:</div>
|
<div className='font-medium'>{t('request')}:</div>
|
||||||
@@ -173,7 +176,7 @@ export default function Page() {
|
|||||||
<div className='break-all'>{log.query || t('none')}</div>
|
<div className='break-all'>{log.query || t('none')}</div>
|
||||||
<div className='font-medium'>{t('userAgent')}:</div>
|
<div className='font-medium'>{t('userAgent')}:</div>
|
||||||
<div className='break-all'>{log['user-agent']}</div>
|
<div className='break-all'>{log['user-agent']}</div>
|
||||||
</div>
|
</div> */}
|
||||||
</AccordionContent>
|
</AccordionContent>
|
||||||
</AccordionItem>
|
</AccordionItem>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -45,6 +45,9 @@ const formSchema = z.object({
|
|||||||
speed_limit: z.number().optional(),
|
speed_limit: z.number().optional(),
|
||||||
device_limit: z.number().optional(),
|
device_limit: z.number().optional(),
|
||||||
expired_at: z.number().nullish().optional(),
|
expired_at: z.number().nullish().optional(),
|
||||||
|
upload: z.number().optional(),
|
||||||
|
download: z.number().optional(),
|
||||||
|
id: z.number().optional(),
|
||||||
});
|
});
|
||||||
|
|
||||||
export function SubscriptionForm({ trigger, title, loading, initialData, onSubmit }: Props) {
|
export function SubscriptionForm({ trigger, title, loading, initialData, onSubmit }: Props) {
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Popis",
|
"description": "Popis",
|
||||||
"descriptionPlaceholder": "Zadejte popis platební metody",
|
"descriptionPlaceholder": "Zadejte popis platební metody",
|
||||||
"domain": "Doména",
|
"domain": "Doména",
|
||||||
"domainPlaceholder": "volitelné, např. {example}",
|
|
||||||
"edit": "Upravit",
|
"edit": "Upravit",
|
||||||
"editPayment": "Upravit platební metodu",
|
"editPayment": "Upravit platební metodu",
|
||||||
"enable": "Povolit",
|
"enable": "Povolit",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Beschreibung",
|
"description": "Beschreibung",
|
||||||
"descriptionPlaceholder": "Geben Sie die Beschreibung der Zahlungsmethode ein",
|
"descriptionPlaceholder": "Geben Sie die Beschreibung der Zahlungsmethode ein",
|
||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
"domainPlaceholder": "optional, z.B. {example}",
|
|
||||||
"edit": "Bearbeiten",
|
"edit": "Bearbeiten",
|
||||||
"editPayment": "Zahlungsmethode bearbeiten",
|
"editPayment": "Zahlungsmethode bearbeiten",
|
||||||
"enable": "Aktivieren",
|
"enable": "Aktivieren",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Description",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Enter payment method description",
|
"descriptionPlaceholder": "Enter payment method description",
|
||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
"domainPlaceholder": "optional, e.g. {example}",
|
|
||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"editPayment": "Edit Payment Method",
|
"editPayment": "Edit Payment Method",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Descripción",
|
"description": "Descripción",
|
||||||
"descriptionPlaceholder": "Ingrese la descripción del método de pago",
|
"descriptionPlaceholder": "Ingrese la descripción del método de pago",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
"domainPlaceholder": "opcional, p. ej. {example}",
|
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"editPayment": "Editar Método de Pago",
|
"editPayment": "Editar Método de Pago",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Descripción",
|
"description": "Descripción",
|
||||||
"descriptionPlaceholder": "Ingresa la descripción del método de pago",
|
"descriptionPlaceholder": "Ingresa la descripción del método de pago",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
"domainPlaceholder": "opcional, p. ej. {example}",
|
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"editPayment": "Editar Método de Pago",
|
"editPayment": "Editar Método de Pago",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "توضیحات",
|
"description": "توضیحات",
|
||||||
"descriptionPlaceholder": "توضیحات روش پرداخت را وارد کنید",
|
"descriptionPlaceholder": "توضیحات روش پرداخت را وارد کنید",
|
||||||
"domain": "دامنه",
|
"domain": "دامنه",
|
||||||
"domainPlaceholder": "اختیاری، به عنوان مثال {example}",
|
|
||||||
"edit": "ویرایش",
|
"edit": "ویرایش",
|
||||||
"editPayment": "ویرایش روش پرداخت",
|
"editPayment": "ویرایش روش پرداخت",
|
||||||
"enable": "فعال کردن",
|
"enable": "فعال کردن",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Kuvaus",
|
"description": "Kuvaus",
|
||||||
"descriptionPlaceholder": "Syötä maksutavan kuvaus",
|
"descriptionPlaceholder": "Syötä maksutavan kuvaus",
|
||||||
"domain": "Verkkotunnus",
|
"domain": "Verkkotunnus",
|
||||||
"domainPlaceholder": "valinnainen, esim. {esimerkki}",
|
|
||||||
"edit": "Muokkaa",
|
"edit": "Muokkaa",
|
||||||
"editPayment": "Muokkaa maksutapaa",
|
"editPayment": "Muokkaa maksutapaa",
|
||||||
"enable": "Ota käyttöön",
|
"enable": "Ota käyttöön",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Description",
|
"description": "Description",
|
||||||
"descriptionPlaceholder": "Entrez la description du mode de paiement",
|
"descriptionPlaceholder": "Entrez la description du mode de paiement",
|
||||||
"domain": "Domaine",
|
"domain": "Domaine",
|
||||||
"domainPlaceholder": "facultatif, par exemple {exemple}",
|
|
||||||
"edit": "Modifier",
|
"edit": "Modifier",
|
||||||
"editPayment": "Modifier le mode de paiement",
|
"editPayment": "Modifier le mode de paiement",
|
||||||
"enable": "Activer",
|
"enable": "Activer",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "विवरण",
|
"description": "विवरण",
|
||||||
"descriptionPlaceholder": "भुगतान विधि का विवरण दर्ज करें",
|
"descriptionPlaceholder": "भुगतान विधि का विवरण दर्ज करें",
|
||||||
"domain": "डोमेन",
|
"domain": "डोमेन",
|
||||||
"domainPlaceholder": "वैकल्पिक, जैसे कि {example}",
|
|
||||||
"edit": "संपादित करें",
|
"edit": "संपादित करें",
|
||||||
"editPayment": "भुगतान विधि संपादित करें",
|
"editPayment": "भुगतान विधि संपादित करें",
|
||||||
"enable": "सक्षम करें",
|
"enable": "सक्षम करें",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Leírás",
|
"description": "Leírás",
|
||||||
"descriptionPlaceholder": "Írja be a fizetési mód leírását",
|
"descriptionPlaceholder": "Írja be a fizetési mód leírását",
|
||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
"domainPlaceholder": "opcionális, pl. {példa}",
|
|
||||||
"edit": "Szerkesztés",
|
"edit": "Szerkesztés",
|
||||||
"editPayment": "Fizetési mód szerkesztése",
|
"editPayment": "Fizetési mód szerkesztése",
|
||||||
"enable": "Engedélyezés",
|
"enable": "Engedélyezés",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "説明",
|
"description": "説明",
|
||||||
"descriptionPlaceholder": "支払い方法の説明を入力してください",
|
"descriptionPlaceholder": "支払い方法の説明を入力してください",
|
||||||
"domain": "ドメイン",
|
"domain": "ドメイン",
|
||||||
"domainPlaceholder": "任意、例:{example}",
|
|
||||||
"edit": "編集",
|
"edit": "編集",
|
||||||
"editPayment": "支払い方法を編集",
|
"editPayment": "支払い方法を編集",
|
||||||
"enable": "有効",
|
"enable": "有効",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "설명",
|
"description": "설명",
|
||||||
"descriptionPlaceholder": "결제 수단 설명을 입력하세요",
|
"descriptionPlaceholder": "결제 수단 설명을 입력하세요",
|
||||||
"domain": "도메인",
|
"domain": "도메인",
|
||||||
"domainPlaceholder": "선택 사항, 예: {example}",
|
|
||||||
"edit": "편집",
|
"edit": "편집",
|
||||||
"editPayment": "결제 수단 편집",
|
"editPayment": "결제 수단 편집",
|
||||||
"enable": "사용",
|
"enable": "사용",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Beskrivelse",
|
"description": "Beskrivelse",
|
||||||
"descriptionPlaceholder": "Skriv inn beskrivelse av betalingsmetode",
|
"descriptionPlaceholder": "Skriv inn beskrivelse av betalingsmetode",
|
||||||
"domain": "Domene",
|
"domain": "Domene",
|
||||||
"domainPlaceholder": "valgfritt, f.eks. {example}",
|
|
||||||
"edit": "Rediger",
|
"edit": "Rediger",
|
||||||
"editPayment": "Rediger betalingsmetode",
|
"editPayment": "Rediger betalingsmetode",
|
||||||
"enable": "Aktiver",
|
"enable": "Aktiver",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Opis",
|
"description": "Opis",
|
||||||
"descriptionPlaceholder": "Wprowadź opis metody płatności",
|
"descriptionPlaceholder": "Wprowadź opis metody płatności",
|
||||||
"domain": "Domena",
|
"domain": "Domena",
|
||||||
"domainPlaceholder": "opcjonalnie, np. {example}",
|
|
||||||
"edit": "Edytuj",
|
"edit": "Edytuj",
|
||||||
"editPayment": "Edytuj metodę płatności",
|
"editPayment": "Edytuj metodę płatności",
|
||||||
"enable": "Włącz",
|
"enable": "Włącz",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Descrição",
|
"description": "Descrição",
|
||||||
"descriptionPlaceholder": "Insira a descrição do método de pagamento",
|
"descriptionPlaceholder": "Insira a descrição do método de pagamento",
|
||||||
"domain": "Domínio",
|
"domain": "Domínio",
|
||||||
"domainPlaceholder": "opcional, por exemplo, {exemplo}",
|
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"editPayment": "Editar Método de Pagamento",
|
"editPayment": "Editar Método de Pagamento",
|
||||||
"enable": "Habilitar",
|
"enable": "Habilitar",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Descriere",
|
"description": "Descriere",
|
||||||
"descriptionPlaceholder": "Introduceți descrierea metodei de plată",
|
"descriptionPlaceholder": "Introduceți descrierea metodei de plată",
|
||||||
"domain": "Domeniu",
|
"domain": "Domeniu",
|
||||||
"domainPlaceholder": "opțional, de exemplu {example}",
|
|
||||||
"edit": "Editează",
|
"edit": "Editează",
|
||||||
"editPayment": "Editează Metodă de Plată",
|
"editPayment": "Editează Metodă de Plată",
|
||||||
"enable": "Activare",
|
"enable": "Activare",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Описание",
|
"description": "Описание",
|
||||||
"descriptionPlaceholder": "Введите описание метода оплаты",
|
"descriptionPlaceholder": "Введите описание метода оплаты",
|
||||||
"domain": "Домен",
|
"domain": "Домен",
|
||||||
"domainPlaceholder": "необязательно, например, {example}",
|
|
||||||
"edit": "Редактировать",
|
"edit": "Редактировать",
|
||||||
"editPayment": "Редактировать способ оплаты",
|
"editPayment": "Редактировать способ оплаты",
|
||||||
"enable": "Включить",
|
"enable": "Включить",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "คำอธิบาย",
|
"description": "คำอธิบาย",
|
||||||
"descriptionPlaceholder": "กรอกคำอธิบายวิธีการชำระเงิน",
|
"descriptionPlaceholder": "กรอกคำอธิบายวิธีการชำระเงิน",
|
||||||
"domain": "โดเมน",
|
"domain": "โดเมน",
|
||||||
"domainPlaceholder": "ไม่บังคับ เช่น {example}",
|
|
||||||
"edit": "แก้ไข",
|
"edit": "แก้ไข",
|
||||||
"editPayment": "แก้ไขวิธีการชำระเงิน",
|
"editPayment": "แก้ไขวิธีการชำระเงิน",
|
||||||
"enable": "เปิดใช้งาน",
|
"enable": "เปิดใช้งาน",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Açıklama",
|
"description": "Açıklama",
|
||||||
"descriptionPlaceholder": "Ödeme yöntemi açıklamasını girin",
|
"descriptionPlaceholder": "Ödeme yöntemi açıklamasını girin",
|
||||||
"domain": "Alan Adı",
|
"domain": "Alan Adı",
|
||||||
"domainPlaceholder": "isteğe bağlı, örn. {example}",
|
|
||||||
"edit": "Düzenle",
|
"edit": "Düzenle",
|
||||||
"editPayment": "Ödeme Yöntemini Düzenle",
|
"editPayment": "Ödeme Yöntemini Düzenle",
|
||||||
"enable": "Etkinleştir",
|
"enable": "Etkinleştir",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Опис",
|
"description": "Опис",
|
||||||
"descriptionPlaceholder": "Введіть опис способу оплати",
|
"descriptionPlaceholder": "Введіть опис способу оплати",
|
||||||
"domain": "Домен",
|
"domain": "Домен",
|
||||||
"domainPlaceholder": "необов'язково, наприклад, {example}",
|
|
||||||
"edit": "Редагувати",
|
"edit": "Редагувати",
|
||||||
"editPayment": "Редагувати спосіб оплати",
|
"editPayment": "Редагувати спосіб оплати",
|
||||||
"enable": "Увімкнути",
|
"enable": "Увімкнути",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "Mô tả",
|
"description": "Mô tả",
|
||||||
"descriptionPlaceholder": "Nhập mô tả phương thức thanh toán",
|
"descriptionPlaceholder": "Nhập mô tả phương thức thanh toán",
|
||||||
"domain": "Miền",
|
"domain": "Miền",
|
||||||
"domainPlaceholder": "tùy chọn, ví dụ: {example}",
|
|
||||||
"edit": "Chỉnh Sửa",
|
"edit": "Chỉnh Sửa",
|
||||||
"editPayment": "Chỉnh Sửa Phương Thức Thanh Toán",
|
"editPayment": "Chỉnh Sửa Phương Thức Thanh Toán",
|
||||||
"enable": "Kích hoạt",
|
"enable": "Kích hoạt",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "描述",
|
"description": "描述",
|
||||||
"descriptionPlaceholder": "输入支付方式描述",
|
"descriptionPlaceholder": "输入支付方式描述",
|
||||||
"domain": "域名",
|
"domain": "域名",
|
||||||
"domainPlaceholder": "可选,例如 {example}",
|
|
||||||
"edit": "编辑",
|
"edit": "编辑",
|
||||||
"editPayment": "编辑支付方式",
|
"editPayment": "编辑支付方式",
|
||||||
"enable": "启用",
|
"enable": "启用",
|
||||||
|
|||||||
@@ -22,7 +22,6 @@
|
|||||||
"description": "描述",
|
"description": "描述",
|
||||||
"descriptionPlaceholder": "輸入付款方式描述",
|
"descriptionPlaceholder": "輸入付款方式描述",
|
||||||
"domain": "域名",
|
"domain": "域名",
|
||||||
"domainPlaceholder": "可選,例如 {example}",
|
|
||||||
"edit": "編輯",
|
"edit": "編輯",
|
||||||
"editPayment": "編輯付款方式",
|
"editPayment": "編輯付款方式",
|
||||||
"enable": "啟用",
|
"enable": "啟用",
|
||||||
|
|||||||
@@ -9968,4 +9968,3 @@ rules:
|
|||||||
- PROCESS-NAME,Weiyun.exe,🎯 全球直连
|
- PROCESS-NAME,Weiyun.exe,🎯 全球直连
|
||||||
- PROCESS-NAME,baidunetdisk.exe,🎯 全球直连
|
- PROCESS-NAME,baidunetdisk.exe,🎯 全球直连
|
||||||
- GEOIP,CN,🎯 全球直连
|
- GEOIP,CN,🎯 全球直连
|
||||||
- MATCH,🐟 漏网之鱼
|
|
||||||
|
|||||||
+1
@@ -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;
|
||||||
|
|||||||
@@ -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', {
|
||||||
|
|||||||
+12
@@ -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;
|
||||||
|
|||||||
@@ -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,209 +166,259 @@ export default function Content() {
|
|||||||
</Tabs>
|
</Tabs>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{userSubscribe.map((item) => (
|
{userSubscribe.map((item) => {
|
||||||
<Card key={item.id}>
|
return (
|
||||||
<CardHeader className='flex flex-row flex-wrap items-center justify-between gap-2 space-y-0'>
|
<Card
|
||||||
<CardTitle className='font-medium'>
|
key={item.id}
|
||||||
{item.subscribe.name}
|
className={cn('relative', {
|
||||||
<p className='text-foreground/50 mt-1 text-sm'>{formatDate(item.start_time)}</p>
|
'relative opacity-80 grayscale': item.status === 3,
|
||||||
</CardTitle>
|
'relative hidden opacity-60 blur-[0.3px] grayscale': item.status === 4,
|
||||||
<div className='flex flex-wrap gap-2'>
|
})}
|
||||||
<AlertDialog>
|
>
|
||||||
<AlertDialogTrigger asChild>
|
{item.status >= 2 && (
|
||||||
<Button size='sm' variant='destructive'>
|
<div
|
||||||
{t('resetSubscription')}
|
className={cn(
|
||||||
</Button>
|
'pointer-events-none absolute left-0 top-0 z-10 h-full w-full overflow-hidden mix-blend-difference',
|
||||||
</AlertDialogTrigger>
|
{
|
||||||
<AlertDialogContent>
|
'text-destructive': item.status === 2,
|
||||||
<AlertDialogHeader>
|
'text-white': item.status === 3 || item.status === 4,
|
||||||
<AlertDialogTitle>{t('prompt')}</AlertDialogTitle>
|
},
|
||||||
<AlertDialogDescription>
|
)}
|
||||||
{t('confirmResetSubscription')}
|
style={{
|
||||||
</AlertDialogDescription>
|
filter: 'contrast(200%) brightness(150%) invert(0.2)',
|
||||||
</AlertDialogHeader>
|
}}
|
||||||
<AlertDialogFooter>
|
>
|
||||||
<AlertDialogCancel>{t('cancel')}</AlertDialogCancel>
|
<div className='absolute inset-0'>
|
||||||
<AlertDialogAction
|
{Array.from({ length: 16 }).map((_, i) => {
|
||||||
onClick={async () => {
|
const row = Math.floor(i / 4);
|
||||||
await resetUserSubscribeToken({
|
const col = i % 4;
|
||||||
user_subscribe_id: item.id,
|
// 计算位置百分比
|
||||||
});
|
const top = 10 + row * 25 + (col % 2 === 0 ? 5 : -5);
|
||||||
await refetch();
|
const left = 5 + col * 30 + (row % 2 === 0 ? 0 : 10);
|
||||||
toast.success(t('resetSuccess'));
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{t('confirm')}
|
|
||||||
</AlertDialogAction>
|
|
||||||
</AlertDialogFooter>
|
|
||||||
</AlertDialogContent>
|
|
||||||
</AlertDialog>
|
|
||||||
<ResetTraffic id={item.id} replacement={item.subscribe.replacement} />
|
|
||||||
<Renewal id={item.id} subscribe={item.subscribe} />
|
|
||||||
<Unsubscribe id={item.id} allowDeduction={item.subscribe.allow_deduction} />
|
|
||||||
</div>
|
|
||||||
</CardHeader>
|
|
||||||
<CardContent>
|
|
||||||
<ul className='grid grid-cols-2 gap-3 *:flex *:flex-col *:justify-between lg:grid-cols-4'>
|
|
||||||
<li>
|
|
||||||
<span className='text-muted-foreground'>{t('used')}</span>
|
|
||||||
<span className='text-2xl font-bold'>
|
|
||||||
<Display
|
|
||||||
type='traffic'
|
|
||||||
value={item.upload + item.download}
|
|
||||||
unlimited={!item.traffic}
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span className='text-muted-foreground'>{t('totalTraffic')}</span>
|
|
||||||
<span className='text-2xl font-bold'>
|
|
||||||
<Display type='traffic' value={item.traffic} unlimited={!item.traffic} />
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span className='text-muted-foreground'>{t('nextResetDays')}</span>
|
|
||||||
<span className='text-2xl font-semibold'>
|
|
||||||
{item.reset_time
|
|
||||||
? differenceInDays(new Date(item.reset_time), new Date())
|
|
||||||
: t('noReset')}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span className='text-muted-foreground'>{t('expirationDays')}</span>
|
|
||||||
<span className='text-2xl font-semibold'>
|
|
||||||
{}
|
|
||||||
{item.expire_time
|
|
||||||
? differenceInDays(new Date(item.expire_time), new Date()) || t('unknown')
|
|
||||||
: t('noLimit')}
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<Separator className='mt-4' />
|
|
||||||
<Accordion type='single' collapsible defaultValue='0' className='w-full'>
|
|
||||||
{getUserSubscribe(item.token, protocol)?.map((url, index) => (
|
|
||||||
<AccordionItem key={url} value={String(index)}>
|
|
||||||
<AccordionTrigger className='hover:no-underline'>
|
|
||||||
<div className='flex w-full flex-row items-center justify-between'>
|
|
||||||
<CardTitle className='text-sm font-medium'>
|
|
||||||
{t('subscriptionUrl')} {index + 1}
|
|
||||||
</CardTitle>
|
|
||||||
|
|
||||||
<CopyToClipboard
|
return (
|
||||||
text={url}
|
<span
|
||||||
onCopy={(text, result) => {
|
key={i}
|
||||||
if (result) {
|
className='absolute rotate-[-30deg] whitespace-nowrap text-lg font-black opacity-40'
|
||||||
toast.success(t('copySuccess'));
|
style={{
|
||||||
}
|
top: `${top}%`,
|
||||||
|
left: `${left}%`,
|
||||||
|
textShadow: '0px 0px 1px rgba(255,255,255,0.5)',
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<span
|
{statusWatermarks[item.status as keyof typeof statusWatermarks]}
|
||||||
className='text-primary hover:bg-accent mr-4 flex cursor-pointer rounded p-2 text-sm'
|
</span>
|
||||||
onClick={(e) => e.stopPropagation()}
|
);
|
||||||
|
})}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
<CardHeader className='flex flex-row flex-wrap items-center justify-between gap-2 space-y-0'>
|
||||||
|
<CardTitle className='font-medium'>
|
||||||
|
{item.subscribe.name}
|
||||||
|
<p className='text-foreground/50 mt-1 text-sm'>{formatDate(item.start_time)}</p>
|
||||||
|
</CardTitle>
|
||||||
|
{item.status !== 4 && (
|
||||||
|
<div className='flex flex-wrap gap-2'>
|
||||||
|
<AlertDialog>
|
||||||
|
<AlertDialogTrigger asChild>
|
||||||
|
<Button size='sm' variant='destructive'>
|
||||||
|
{t('resetSubscription')}
|
||||||
|
</Button>
|
||||||
|
</AlertDialogTrigger>
|
||||||
|
<AlertDialogContent>
|
||||||
|
<AlertDialogHeader>
|
||||||
|
<AlertDialogTitle>{t('prompt')}</AlertDialogTitle>
|
||||||
|
<AlertDialogDescription>
|
||||||
|
{t('confirmResetSubscription')}
|
||||||
|
</AlertDialogDescription>
|
||||||
|
</AlertDialogHeader>
|
||||||
|
<AlertDialogFooter>
|
||||||
|
<AlertDialogCancel>{t('cancel')}</AlertDialogCancel>
|
||||||
|
<AlertDialogAction
|
||||||
|
onClick={async () => {
|
||||||
|
await resetUserSubscribeToken({
|
||||||
|
user_subscribe_id: item.id,
|
||||||
|
});
|
||||||
|
await refetch();
|
||||||
|
toast.success(t('resetSuccess'));
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
<Icon icon='uil:copy' className='mr-2 size-5' />
|
{t('confirm')}
|
||||||
{t('copy')}
|
</AlertDialogAction>
|
||||||
</span>
|
</AlertDialogFooter>
|
||||||
</CopyToClipboard>
|
</AlertDialogContent>
|
||||||
</div>
|
</AlertDialog>
|
||||||
</AccordionTrigger>
|
<ResetTraffic id={item.id} replacement={item.subscribe.replacement} />
|
||||||
<AccordionContent>
|
<Renewal id={item.id} subscribe={item.subscribe} />
|
||||||
<div className='grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'>
|
|
||||||
{applications
|
|
||||||
?.filter((application) => {
|
|
||||||
const platformApps = application.platform?.[platform];
|
|
||||||
return platformApps && platformApps.length > 0;
|
|
||||||
})
|
|
||||||
.map((application) => {
|
|
||||||
const platformApps = application.platform?.[platform];
|
|
||||||
const app =
|
|
||||||
platformApps?.find((item) => item.is_default) || platformApps?.[0];
|
|
||||||
if (!app) return null;
|
|
||||||
|
|
||||||
const handleCopy = (text: string, result: boolean) => {
|
<Unsubscribe id={item.id} allowDeduction={item.subscribe.allow_deduction} />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent>
|
||||||
|
<ul className='grid grid-cols-2 gap-3 *:flex *:flex-col *:justify-between lg:grid-cols-4'>
|
||||||
|
<li>
|
||||||
|
<span className='text-muted-foreground'>{t('used')}</span>
|
||||||
|
<span className='text-2xl font-bold'>
|
||||||
|
<Display
|
||||||
|
type='traffic'
|
||||||
|
value={item.upload + item.download}
|
||||||
|
unlimited={!item.traffic}
|
||||||
|
/>
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span className='text-muted-foreground'>{t('totalTraffic')}</span>
|
||||||
|
<span className='text-2xl font-bold'>
|
||||||
|
<Display type='traffic' value={item.traffic} unlimited={!item.traffic} />
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span className='text-muted-foreground'>{t('nextResetDays')}</span>
|
||||||
|
<span className='text-2xl font-semibold'>
|
||||||
|
{item.reset_time
|
||||||
|
? differenceInDays(new Date(item.reset_time), new Date())
|
||||||
|
: t('noReset')}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span className='text-muted-foreground'>{t('expirationDays')}</span>
|
||||||
|
<span className='text-2xl font-semibold'>
|
||||||
|
{}
|
||||||
|
{item.expire_time
|
||||||
|
? differenceInDays(new Date(item.expire_time), new Date()) || t('unknown')
|
||||||
|
: t('noLimit')}
|
||||||
|
</span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<Separator className='mt-4' />
|
||||||
|
<Accordion type='single' collapsible defaultValue='0' className='w-full'>
|
||||||
|
{getUserSubscribe(item.token, protocol)?.map((url, index) => (
|
||||||
|
<AccordionItem key={url} value={String(index)}>
|
||||||
|
<AccordionTrigger className='hover:no-underline'>
|
||||||
|
<div className='flex w-full flex-row items-center justify-between'>
|
||||||
|
<CardTitle className='text-sm font-medium'>
|
||||||
|
{t('subscriptionUrl')} {index + 1}
|
||||||
|
</CardTitle>
|
||||||
|
|
||||||
|
<CopyToClipboard
|
||||||
|
text={url}
|
||||||
|
onCopy={(text, result) => {
|
||||||
if (result) {
|
if (result) {
|
||||||
const href = getAppSubLink(application.subscribe_type, url);
|
toast.success(t('copySuccess'));
|
||||||
const showSuccessMessage = () => {
|
|
||||||
toast.success(
|
|
||||||
<>
|
|
||||||
<p>{t('copySuccess')}</p>
|
|
||||||
<br />
|
|
||||||
<p>{t('manualImportMessage')}</p>
|
|
||||||
</>,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (isBrowser() && href) {
|
|
||||||
window.location.href = href;
|
|
||||||
const checkRedirect = setTimeout(() => {
|
|
||||||
if (window.location.href !== href) {
|
|
||||||
showSuccessMessage();
|
|
||||||
}
|
|
||||||
clearTimeout(checkRedirect);
|
|
||||||
}, 1000);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
showSuccessMessage();
|
|
||||||
}
|
}
|
||||||
};
|
}}
|
||||||
|
>
|
||||||
return (
|
<span
|
||||||
<div
|
className='text-primary hover:bg-accent mr-4 flex cursor-pointer rounded p-2 text-sm'
|
||||||
key={application.name}
|
onClick={(e) => e.stopPropagation()}
|
||||||
className='text-muted-foreground flex size-full flex-col items-center justify-between gap-2 text-xs'
|
>
|
||||||
>
|
<Icon icon='uil:copy' className='mr-2 size-5' />
|
||||||
<span>{application.name}</span>
|
{t('copy')}
|
||||||
|
</span>
|
||||||
{application.icon && (
|
</CopyToClipboard>
|
||||||
<Image
|
|
||||||
src={application.icon}
|
|
||||||
alt={application.name}
|
|
||||||
width={64}
|
|
||||||
height={64}
|
|
||||||
className='p-1'
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
<div className='flex'>
|
|
||||||
<Button
|
|
||||||
size='sm'
|
|
||||||
variant='secondary'
|
|
||||||
className='rounded-r-none px-1.5'
|
|
||||||
asChild
|
|
||||||
>
|
|
||||||
<Link href={app.url}>{t('download')}</Link>
|
|
||||||
</Button>
|
|
||||||
|
|
||||||
<CopyToClipboard
|
|
||||||
text={getAppSubLink(application.subscribe_type, url) || url}
|
|
||||||
onCopy={handleCopy}
|
|
||||||
>
|
|
||||||
<Button size='sm' className='rounded-l-none p-2'>
|
|
||||||
{t('import')}
|
|
||||||
</Button>
|
|
||||||
</CopyToClipboard>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
<div className='text-muted-foreground hidden size-full flex-col items-center justify-between gap-2 text-sm lg:flex'>
|
|
||||||
<span>{t('qrCode')}</span>
|
|
||||||
<QRCodeCanvas
|
|
||||||
value={url}
|
|
||||||
size={80}
|
|
||||||
bgColor='transparent'
|
|
||||||
fgColor='rgb(59, 130, 246)'
|
|
||||||
/>
|
|
||||||
<span className='text-center'>{t('scanToSubscribe')}</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</AccordionTrigger>
|
||||||
</AccordionContent>
|
<AccordionContent>
|
||||||
</AccordionItem>
|
<div className='grid grid-cols-2 gap-4 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6'>
|
||||||
))}
|
{applications
|
||||||
</Accordion>
|
?.filter((application) => {
|
||||||
</CardContent>
|
const platformApps = application.platform?.[platform];
|
||||||
</Card>
|
return platformApps && platformApps.length > 0;
|
||||||
))}
|
})
|
||||||
|
.map((application) => {
|
||||||
|
const platformApps = application.platform?.[platform];
|
||||||
|
const app =
|
||||||
|
platformApps?.find((item) => item.is_default) ||
|
||||||
|
platformApps?.[0];
|
||||||
|
if (!app) return null;
|
||||||
|
|
||||||
|
const handleCopy = (text: string, result: boolean) => {
|
||||||
|
if (result) {
|
||||||
|
const href = getAppSubLink(application.subscribe_type, url);
|
||||||
|
const showSuccessMessage = () => {
|
||||||
|
toast.success(
|
||||||
|
<>
|
||||||
|
<p>{t('copySuccess')}</p>
|
||||||
|
<br />
|
||||||
|
<p>{t('manualImportMessage')}</p>
|
||||||
|
</>,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isBrowser() && href) {
|
||||||
|
window.location.href = href;
|
||||||
|
const checkRedirect = setTimeout(() => {
|
||||||
|
if (window.location.href !== href) {
|
||||||
|
showSuccessMessage();
|
||||||
|
}
|
||||||
|
clearTimeout(checkRedirect);
|
||||||
|
}, 1000);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
showSuccessMessage();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div
|
||||||
|
key={application.name}
|
||||||
|
className='text-muted-foreground flex size-full flex-col items-center justify-between gap-2 text-xs'
|
||||||
|
>
|
||||||
|
<span>{application.name}</span>
|
||||||
|
|
||||||
|
{application.icon && (
|
||||||
|
<Image
|
||||||
|
src={application.icon}
|
||||||
|
alt={application.name}
|
||||||
|
width={64}
|
||||||
|
height={64}
|
||||||
|
className='p-1'
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
<div className='flex'>
|
||||||
|
<Button
|
||||||
|
size='sm'
|
||||||
|
variant='secondary'
|
||||||
|
className='rounded-r-none px-1.5'
|
||||||
|
asChild
|
||||||
|
>
|
||||||
|
<Link href={app.url}>{t('download')}</Link>
|
||||||
|
</Button>
|
||||||
|
|
||||||
|
<CopyToClipboard
|
||||||
|
text={getAppSubLink(application.subscribe_type, url) || url}
|
||||||
|
onCopy={handleCopy}
|
||||||
|
>
|
||||||
|
<Button size='sm' className='rounded-l-none p-2'>
|
||||||
|
{t('import')}
|
||||||
|
</Button>
|
||||||
|
</CopyToClipboard>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
<div className='text-muted-foreground hidden size-full flex-col items-center justify-between gap-2 text-sm lg:flex'>
|
||||||
|
<span>{t('qrCode')}</span>
|
||||||
|
<QRCodeCanvas
|
||||||
|
value={url}
|
||||||
|
size={80}
|
||||||
|
bgColor='transparent'
|
||||||
|
fgColor='rgb(59, 130, 246)'
|
||||||
|
/>
|
||||||
|
<span className='text-center'>{t('scanToSubscribe')}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</AccordionContent>
|
||||||
|
</AccordionItem>
|
||||||
|
))}
|
||||||
|
</Accordion>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
|
})}
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import { Button } from '@workspace/ui/components/button';
|
|||||||
import { Card, CardContent, CardHeader } from '@workspace/ui/components/card';
|
import { Card, CardContent, CardHeader } from '@workspace/ui/components/card';
|
||||||
import { Separator } from '@workspace/ui/components/separator';
|
import { Separator } from '@workspace/ui/components/separator';
|
||||||
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input';
|
||||||
|
import { Icon } from '@workspace/ui/custom-components/icon';
|
||||||
import { cn } from '@workspace/ui/lib/utils';
|
import { cn } from '@workspace/ui/lib/utils';
|
||||||
import { LoaderCircle } from 'lucide-react';
|
import { LoaderCircle } from 'lucide-react';
|
||||||
import { useTranslations } from 'next-intl';
|
import { useTranslations } from 'next-intl';
|
||||||
@@ -167,7 +168,51 @@ export default function Content({ subscription }: { subscription?: API.Subscribe
|
|||||||
<Card>
|
<Card>
|
||||||
<CardContent className='grid gap-3 p-6 text-sm'>
|
<CardContent className='grid gap-3 p-6 text-sm'>
|
||||||
<h2 className='text-xl font-semibold'>{subscription.name}</h2>
|
<h2 className='text-xl font-semibold'>{subscription.name}</h2>
|
||||||
<p className='text-muted-foreground'>{subscription.description}</p>
|
<ul className='flex flex-grow flex-col gap-3'>
|
||||||
|
{(() => {
|
||||||
|
let parsedDescription;
|
||||||
|
try {
|
||||||
|
parsedDescription = JSON.parse(subscription.description);
|
||||||
|
} catch {
|
||||||
|
parsedDescription = { description: '', features: [] };
|
||||||
|
}
|
||||||
|
|
||||||
|
const { description, features } = parsedDescription;
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{description && <li className='text-muted-foreground'>{description}</li>}
|
||||||
|
{features?.map(
|
||||||
|
(
|
||||||
|
feature: {
|
||||||
|
icon: string;
|
||||||
|
label: string;
|
||||||
|
type: 'default' | 'success' | 'destructive';
|
||||||
|
},
|
||||||
|
index: number,
|
||||||
|
) => (
|
||||||
|
<li
|
||||||
|
className={cn('flex items-center gap-1', {
|
||||||
|
'text-muted-foreground line-through': feature.type === 'destructive',
|
||||||
|
})}
|
||||||
|
key={index}
|
||||||
|
>
|
||||||
|
{feature.icon && (
|
||||||
|
<Icon
|
||||||
|
icon={feature.icon}
|
||||||
|
className={cn('text-primary size-5', {
|
||||||
|
'text-green-500': feature.type === 'success',
|
||||||
|
'text-destructive': feature.type === 'destructive',
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{feature.label}
|
||||||
|
</li>
|
||||||
|
),
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
})()}
|
||||||
|
</ul>
|
||||||
<SubscribeDetail
|
<SubscribeDetail
|
||||||
subscribe={{
|
subscribe={{
|
||||||
...subscription,
|
...subscription,
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ export default function Recharge(props: Readonly<ButtonProps>) {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<PaymentMethods
|
<PaymentMethods
|
||||||
|
balance={false}
|
||||||
value={params.payment}
|
value={params.payment}
|
||||||
onChange={(value) => setParams({ ...params, payment: value })}
|
onChange={(value) => setParams({ ...params, payment: value })}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "کپی",
|
"copy": "کپی",
|
||||||
"copyFailure": "کپی ناموفق بود، لطفاً به صورت دستی کپی کنید",
|
"copyFailure": "کپی ناموفق بود، لطفاً به صورت دستی کپی کنید",
|
||||||
"copySuccess": "کپی با موفقیت انجام شد",
|
"copySuccess": "کپی با موفقیت انجام شد",
|
||||||
|
"deducted": "لغو شده",
|
||||||
"download": "دانلود",
|
"download": "دانلود",
|
||||||
"expirationDays": "روزهای انقضا",
|
"expirationDays": "روزهای انقضا",
|
||||||
|
"expired": "منقضی شده",
|
||||||
|
"finished": "ترافیک تمام شده",
|
||||||
"import": "وارد کردن",
|
"import": "وارد کردن",
|
||||||
"latestAnnouncement": "آخرین اعلامیه",
|
"latestAnnouncement": "آخرین اعلامیه",
|
||||||
"manualImportMessage": "این برنامه از فعالسازی پشتیبانی نمیکند. لطفاً به صورت دستی وارد کنید. آدرس اشتراک کپی شده است.",
|
"manualImportMessage": "این برنامه از فعالسازی پشتیبانی نمیکند. لطفاً به صورت دستی وارد کنید. آدرس اشتراک کپی شده است.",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "प्रतिलिपि",
|
"copy": "प्रतिलिपि",
|
||||||
"copyFailure": "प्रतिलिपि बनाने में विफल, कृपया मैन्युअल रूप से प्रतिलिपि बनाएँ",
|
"copyFailure": "प्रतिलिपि बनाने में विफल, कृपया मैन्युअल रूप से प्रतिलिपि बनाएँ",
|
||||||
"copySuccess": "प्रतिलिपि सफल",
|
"copySuccess": "प्रतिलिपि सफल",
|
||||||
|
"deducted": "रद्द किया गया",
|
||||||
"download": "डाउनलोड",
|
"download": "डाउनलोड",
|
||||||
"expirationDays": "समाप्ति समय/दिन",
|
"expirationDays": "समाप्ति समय/दिन",
|
||||||
|
"expired": "समाप्त",
|
||||||
|
"finished": "ट्रैफ़िक समाप्त",
|
||||||
"import": "आयात",
|
"import": "आयात",
|
||||||
"latestAnnouncement": "नवीनतम घोषणा",
|
"latestAnnouncement": "नवीनतम घोषणा",
|
||||||
"manualImportMessage": "यह ऐप फिलहाल जागृत करने का समर्थन नहीं करता है, कृपया मैन्युअल रूप से आयात करें, सदस्यता पता स्वचालित रूप से कॉपी कर लिया गया है।",
|
"manualImportMessage": "यह ऐप फिलहाल जागृत करने का समर्थन नहीं करता है, कृपया मैन्युअल रूप से आयात करें, सदस्यता पता स्वचालित रूप से कॉपी कर लिया गया है।",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "コピー",
|
"copy": "コピー",
|
||||||
"copyFailure": "コピーに失敗しました。手動でコピーしてください",
|
"copyFailure": "コピーに失敗しました。手動でコピーしてください",
|
||||||
"copySuccess": "コピー成功",
|
"copySuccess": "コピー成功",
|
||||||
|
"deducted": "キャンセルされた",
|
||||||
"download": "ダウンロード",
|
"download": "ダウンロード",
|
||||||
"expirationDays": "有効期限/日",
|
"expirationDays": "有効期限/日",
|
||||||
|
"expired": "期限切れ",
|
||||||
|
"finished": "トラフィックが使い切られました",
|
||||||
"import": "インポート",
|
"import": "インポート",
|
||||||
"latestAnnouncement": "最新のお知らせ",
|
"latestAnnouncement": "最新のお知らせ",
|
||||||
"manualImportMessage": "このアプリは現在起動をサポートしていません。手動でインポートしてください。サブスクリプションアドレスは自動的にコピーされました。",
|
"manualImportMessage": "このアプリは現在起動をサポートしていません。手動でインポートしてください。サブスクリプションアドレスは自動的にコピーされました。",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "복사",
|
"copy": "복사",
|
||||||
"copyFailure": "복사 실패, 수동으로 복사하세요",
|
"copyFailure": "복사 실패, 수동으로 복사하세요",
|
||||||
"copySuccess": "복사 성공",
|
"copySuccess": "복사 성공",
|
||||||
|
"deducted": "취소됨",
|
||||||
"download": "다운로드",
|
"download": "다운로드",
|
||||||
"expirationDays": "만료일/일",
|
"expirationDays": "만료일/일",
|
||||||
|
"expired": "만료됨",
|
||||||
|
"finished": "트래픽 소진됨",
|
||||||
"import": "가져오기",
|
"import": "가져오기",
|
||||||
"latestAnnouncement": "최신 공지",
|
"latestAnnouncement": "최신 공지",
|
||||||
"manualImportMessage": "이 앱은 현재 호출을 지원하지 않습니다. 수동으로 가져오세요. 구독 주소가 자동으로 복사되었습니다.",
|
"manualImportMessage": "이 앱은 현재 호출을 지원하지 않습니다. 수동으로 가져오세요. 구독 주소가 자동으로 복사되었습니다.",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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.",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "Копировать",
|
"copy": "Копировать",
|
||||||
"copyFailure": "Не удалось скопировать, пожалуйста, скопируйте вручную",
|
"copyFailure": "Не удалось скопировать, пожалуйста, скопируйте вручную",
|
||||||
"copySuccess": "Копирование успешно",
|
"copySuccess": "Копирование успешно",
|
||||||
|
"deducted": "Отменено",
|
||||||
"download": "скачать",
|
"download": "скачать",
|
||||||
"expirationDays": "Срок действия/дни",
|
"expirationDays": "Срок действия/дни",
|
||||||
|
"expired": "Истекло",
|
||||||
|
"finished": "Трафик исчерпан",
|
||||||
"import": "Импорт",
|
"import": "Импорт",
|
||||||
"latestAnnouncement": "Последнее объявление",
|
"latestAnnouncement": "Последнее объявление",
|
||||||
"manualImportMessage": "Это приложение временно не поддерживает вызов, пожалуйста, импортируйте вручную, адрес подписки уже скопирован",
|
"manualImportMessage": "Это приложение временно не поддерживает вызов, пожалуйста, импортируйте вручную, адрес подписки уже скопирован",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "คัดลอก",
|
"copy": "คัดลอก",
|
||||||
"copyFailure": "คัดลอกไม่สำเร็จ กรุณาคัดลอกด้วยตนเอง",
|
"copyFailure": "คัดลอกไม่สำเร็จ กรุณาคัดลอกด้วยตนเอง",
|
||||||
"copySuccess": "คัดลอกสำเร็จ",
|
"copySuccess": "คัดลอกสำเร็จ",
|
||||||
|
"deducted": "ยกเลิก",
|
||||||
"download": "ดาวน์โหลด",
|
"download": "ดาวน์โหลด",
|
||||||
"expirationDays": "วันหมดอายุ/วัน",
|
"expirationDays": "วันหมดอายุ/วัน",
|
||||||
|
"expired": "หมดอายุ",
|
||||||
|
"finished": "การใช้งานหมด",
|
||||||
"import": "นำเข้า",
|
"import": "นำเข้า",
|
||||||
"latestAnnouncement": "ประกาศล่าสุด",
|
"latestAnnouncement": "ประกาศล่าสุด",
|
||||||
"manualImportMessage": "แอปนี้ยังไม่รองรับการเปิดใช้งาน กรุณานำเข้าด้วยตนเอง ที่อยู่การสมัครสมาชิกได้ถูกคัดลอกอัตโนมัติแล้ว",
|
"manualImportMessage": "แอปนี้ยังไม่รองรับการเปิดใช้งาน กรุณานำเข้าด้วยตนเอง ที่อยู่การสมัครสมาชิกได้ถูกคัดลอกอัตโนมัติแล้ว",
|
||||||
|
|||||||
@@ -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ı",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "Копіювати",
|
"copy": "Копіювати",
|
||||||
"copyFailure": "Не вдалося скопіювати, будь ласка, скопіюйте вручну",
|
"copyFailure": "Не вдалося скопіювати, будь ласка, скопіюйте вручну",
|
||||||
"copySuccess": "Скопійовано успішно",
|
"copySuccess": "Скопійовано успішно",
|
||||||
|
"deducted": "Скасовано",
|
||||||
"download": "завантажити",
|
"download": "завантажити",
|
||||||
"expirationDays": "Термін дії/дні",
|
"expirationDays": "Термін дії/дні",
|
||||||
|
"expired": "Термін закінчився",
|
||||||
|
"finished": "Трафік вичерпано",
|
||||||
"import": "Імпорт",
|
"import": "Імпорт",
|
||||||
"latestAnnouncement": "Останнє оголошення",
|
"latestAnnouncement": "Останнє оголошення",
|
||||||
"manualImportMessage": "Цей додаток тимчасово не підтримує виклик, будь ласка, імпортуйте вручну, адресу підписки вже скопійовано",
|
"manualImportMessage": "Цей додаток тимчасово не підтримує виклик, будь ласка, імпортуйте вручну, адресу підписки вже скопійовано",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "复制",
|
"copy": "复制",
|
||||||
"copyFailure": "复制失败,请手动复制",
|
"copyFailure": "复制失败,请手动复制",
|
||||||
"copySuccess": "复制成功",
|
"copySuccess": "复制成功",
|
||||||
|
"deducted": "已取消",
|
||||||
"download": "下载",
|
"download": "下载",
|
||||||
"expirationDays": "到期时间/天",
|
"expirationDays": "到期时间/天",
|
||||||
|
"expired": "已过期",
|
||||||
|
"finished": "流量已用尽",
|
||||||
"import": "导入",
|
"import": "导入",
|
||||||
"latestAnnouncement": "最新公告",
|
"latestAnnouncement": "最新公告",
|
||||||
"manualImportMessage": "该应用暂不支持唤起,请手动导入,已自动复制订阅地址",
|
"manualImportMessage": "该应用暂不支持唤起,请手动导入,已自动复制订阅地址",
|
||||||
|
|||||||
@@ -5,8 +5,11 @@
|
|||||||
"copy": "複製",
|
"copy": "複製",
|
||||||
"copyFailure": "複製失敗,請手動複製",
|
"copyFailure": "複製失敗,請手動複製",
|
||||||
"copySuccess": "複製成功",
|
"copySuccess": "複製成功",
|
||||||
|
"deducted": "已取消",
|
||||||
"download": "下載",
|
"download": "下載",
|
||||||
"expirationDays": "到期時間/天",
|
"expirationDays": "到期時間/天",
|
||||||
|
"expired": "已過期",
|
||||||
|
"finished": "流量已用盡",
|
||||||
"import": "匯入",
|
"import": "匯入",
|
||||||
"latestAnnouncement": "最新公告",
|
"latestAnnouncement": "最新公告",
|
||||||
"manualImportMessage": "該應用暫不支援喚起,請手動導入,已自動複製訂閱地址",
|
"manualImportMessage": "該應用暫不支援喚起,請手動導入,已自動複製訂閱地址",
|
||||||
|
|||||||
@@ -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', {
|
||||||
|
|||||||
+12
@@ -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;
|
||||||
|
|||||||
Vendored
+1
@@ -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;
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ppanel-web",
|
"name": "ppanel-web",
|
||||||
"version": "1.0.0-beta.34",
|
"version": "1.0.2",
|
||||||
"private": true,
|
"private": true,
|
||||||
"homepage": "https://github.com/perfect-panel/ppanel-web",
|
"homepage": "https://github.com/perfect-panel/ppanel-web",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
|
|||||||
Reference in New Issue
Block a user