🐛 fix: Add copy subscription functionality to user subscription dashboard and improve localization for new features

This commit is contained in:
web
2025-09-14 23:09:59 -07:00
parent 1d52642cb7
commit e2a357fea7
30 changed files with 137 additions and 63 deletions
@@ -2,6 +2,7 @@
import { Display } from '@/components/display';
import { ProTable, ProTableActions } from '@/components/pro-table';
import useGlobalStore from '@/config/use-global';
import {
createUserSubscribe,
deleteUserSubscribe,
@@ -28,6 +29,7 @@ export default function UserSubscription({ userId }: { userId: number }) {
const t = useTranslations('user');
const [loading, setLoading] = useState(false);
const ref = useRef<ProTableActions>(null);
const { getUserSubscribeUrls } = useGlobalStore();
return (
<ProTable<API.UserSubscribe, Record<string, unknown>>
@@ -146,6 +148,16 @@ export default function UserSubscription({ userId }: { userId: number }) {
return true;
}}
/>,
<Button
key='copy'
variant='secondary'
onClick={async () => {
await navigator.clipboard.writeText(getUserSubscribeUrls(row.token)[0] || '');
toast.success(t('copySuccess'));
}}
>
{t('copySubscription')}
</Button>,
<ConfirmButton
key='delete'
trigger={<Button variant='destructive'>{t('delete')}</Button>}
+20 -1
View File
@@ -1,3 +1,5 @@
import { NEXT_PUBLIC_API_URL, NEXT_PUBLIC_SITE_URL } from '@/config/constants';
import { extractDomain } from '@workspace/ui/utils';
import { create } from 'zustand';
export interface GlobalStore {
@@ -5,9 +7,10 @@ export interface GlobalStore {
user?: API.User;
setCommon: (common: Partial<API.GetGlobalConfigResponse>) => void;
setUser: (user?: API.User) => void;
getUserSubscribeUrls: (uuid: string, type?: string) => string[];
}
export const useGlobalStore = create<GlobalStore>((set) => ({
export const useGlobalStore = create<GlobalStore>((set, get) => ({
common: {
site: {
host: '',
@@ -77,6 +80,22 @@ export const useGlobalStore = create<GlobalStore>((set) => ({
},
})),
setUser: (user) => set({ user }),
getUserSubscribeUrls: (uuid: string, type?: string) => {
const { pan_domain, subscribe_domain, subscribe_path } = get().common.subscribe || {};
const domains = subscribe_domain
? subscribe_domain.split('\n')
: [extractDomain(NEXT_PUBLIC_API_URL || NEXT_PUBLIC_SITE_URL || '', pan_domain)];
return domains.map((domain) => {
if (pan_domain) {
if (type) return `https://${uuid}.${type}.${domain}`;
return `https://${uuid}.${domain}`;
} else {
if (type) return `https://${domain}${subscribe_path}?token=${uuid}&type=${type}`;
return `https://${domain}${subscribe_path}?token=${uuid}`;
}
});
},
}));
export default useGlobalStore;
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Potvrdit",
"confirmDelete": "Opravdu chcete smazat?",
"confirmOffline": "Potvrdit offline",
"copySubscription": "Kopírovat předplatné",
"copySuccess": "Kopírování bylo úspěšné",
"create": "Vytvořit",
"createSubscription": "Vytvořit předplatné",
"createSuccess": "Vytvoření úspěšné",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Bestätigen",
"confirmDelete": "Sind Sie sicher, dass Sie löschen möchten?",
"confirmOffline": "Offline bestätigen",
"copySubscription": "Abonnement kopieren",
"copySuccess": "Kopie erfolgreich",
"create": "Erstellen",
"createSubscription": "Abonnement erstellen",
"createSuccess": "Erstellung erfolgreich",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Confirm",
"confirmDelete": "Confirm Delete",
"confirmOffline": "Confirm Offline",
"copySubscription": "Copy Subscription",
"copySuccess": "Copy successful",
"create": "Create",
"createSubscription": "Create Subscription",
"createSuccess": "Create successful",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Confirmar",
"confirmDelete": "¿Está seguro de que desea eliminar?",
"confirmOffline": "Confirmar sin conexión",
"copySubscription": "Copiar Suscripción",
"copySuccess": "Copia exitosa",
"create": "Crear",
"createSubscription": "Crear suscripción",
"createSuccess": "Creación exitosa",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Confirmar",
"confirmDelete": "¿Está seguro de que desea eliminar?",
"confirmOffline": "Confirmar sin conexión",
"copySubscription": "Copiar Suscripción",
"copySuccess": "Copia exitosa",
"create": "Crear",
"createSubscription": "Crear Suscripción",
"createSuccess": "Creación exitosa",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "تأیید",
"confirmDelete": "آیا مطمئن هستید که می‌خواهید حذف کنید؟",
"confirmOffline": "تأیید آفلاین",
"copySubscription": "کپی اشتراک",
"copySuccess": "کپی با موفقیت انجام شد",
"create": "ایجاد",
"createSubscription": "ایجاد اشتراک",
"createSuccess": "ایجاد با موفقیت انجام شد",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Vahvista",
"confirmDelete": "Oletko varma, että haluat poistaa?",
"confirmOffline": "Vahvista offline-tila",
"copySubscription": "Kopioi tilaus",
"copySuccess": "Kopiointi onnistui",
"create": "Luo",
"createSubscription": "Luo tilaus",
"createSuccess": "Luonti onnistui",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Confirmer",
"confirmDelete": "Êtes-vous sûr de vouloir supprimer ?",
"confirmOffline": "Confirmer hors ligne",
"copySubscription": "Copier l'abonnement",
"copySuccess": "Copie réussie",
"create": "Créer",
"createSubscription": "Créer un abonnement",
"createSuccess": "Création réussie",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "पुष्टि करें",
"confirmDelete": "क्या आप वाकई हटाना चाहते हैं?",
"confirmOffline": "ऑफ़लाइन की पुष्टि करें",
"copySubscription": "सदस्यता कॉपी करें",
"copySuccess": "कॉपी सफल",
"create": "सृजन",
"createSubscription": "सदस्यता बनाएं",
"createSuccess": "सृजन सफल",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Megerősítés",
"confirmDelete": "Biztosan törölni szeretné?",
"confirmOffline": "Megerősítés offline",
"copySubscription": "Előfizetés másolása",
"copySuccess": "Másolás sikeres",
"create": "Létrehozás",
"createSubscription": "Előfizetés létrehozása",
"createSuccess": "Sikeres létrehozás",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "確認",
"confirmDelete": "削除してもよろしいですか?",
"confirmOffline": "オフラインを確認",
"copySubscription": "サブスクリプションをコピー",
"copySuccess": "コピーが成功しました",
"create": "作成",
"createSubscription": "サブスクリプションを作成",
"createSuccess": "作成成功",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "확인",
"confirmDelete": "삭제하시겠습니까?",
"confirmOffline": "오프라인 확인",
"copySubscription": "구독 복사",
"copySuccess": "복사 성공",
"create": "생성",
"createSubscription": "구독 생성",
"createSuccess": "생성 성공",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "bekreft",
"confirmDelete": "Er du sikker på at du vil slette?",
"confirmOffline": "Bekreft frakoblet",
"copySubscription": "Kopier abonnement",
"copySuccess": "Kopiering vellykket",
"create": "opprett",
"createSubscription": "Opprett abonnement",
"createSuccess": "Opprettelse vellykket",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Potwierdź",
"confirmDelete": "Czy na pewno chcesz usunąć?",
"confirmOffline": "Potwierdź tryb offline",
"copySubscription": "Kopiuj subskrypcję",
"copySuccess": "Kopiowanie zakończone sukcesem",
"create": "Utwórz",
"createSubscription": "Utwórz subskrypcję",
"createSuccess": "Utworzono pomyślnie",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "confirmar",
"confirmDelete": "Você tem certeza de que deseja excluir?",
"confirmOffline": "Confirmar Offline",
"copySubscription": "Copiar Assinatura",
"copySuccess": "Cópia bem-sucedida",
"create": "Criar",
"createSubscription": "Criar Assinatura",
"createSuccess": "Criação bem-sucedida",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Confirmare",
"confirmDelete": "Sunteți sigur că doriți să ștergeți?",
"confirmOffline": "Confirmare Offline",
"copySubscription": "Copiază Abonamentul",
"copySuccess": "Copiază cu succes",
"create": "crea",
"createSubscription": "Creează Abonament",
"createSuccess": "Creat cu succes",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Подтвердить",
"confirmDelete": "Вы уверены, что хотите удалить?",
"confirmOffline": "Подтвердить офлайн",
"copySubscription": "Копировать подписку",
"copySuccess": "Копирование успешно",
"create": "Создать",
"createSubscription": "Создать подписку",
"createSuccess": "Создание успешно",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "ยืนยัน",
"confirmDelete": "คุณแน่ใจหรือว่าต้องการลบ?",
"confirmOffline": "ยืนยันออฟไลน์",
"copySubscription": "คัดลอกการสมัครสมาชิก",
"copySuccess": "คัดลอกสำเร็จ",
"create": "สร้าง",
"createSubscription": "สร้างการสมัครสมาชิก",
"createSuccess": "สร้างสำเร็จ",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Onayla",
"confirmDelete": "Silmek istediğinizden emin misiniz?",
"confirmOffline": "Çevrimdışı Onayla",
"copySubscription": "Aboneliği Kopyala",
"copySuccess": "Kopyalama başarılı",
"create": "oluştur",
"createSubscription": "Abonelik Oluştur",
"createSuccess": "Başarıyla oluşturuldu",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Підтвердити",
"confirmDelete": "Ви впевнені, що хочете видалити?",
"confirmOffline": "Підтвердити офлайн",
"copySubscription": "Копіювати підписку",
"copySuccess": "Копіювання успішне",
"create": "створити",
"createSubscription": "Створити підписку",
"createSuccess": "Створено успішно",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "Xác nhận",
"confirmDelete": "Bạn có chắc chắn muốn xóa không?",
"confirmOffline": "Xác nhận Ngoại tuyến",
"copySubscription": "Sao chép Đăng ký",
"copySuccess": "Sao chép thành công",
"create": "Tạo",
"createSubscription": "Tạo Đăng Ký",
"createSuccess": "Tạo thành công",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "确认",
"confirmDelete": "确认删除",
"confirmOffline": "确认下线",
"copySubscription": "复制订阅",
"copySuccess": "复制成功",
"create": "创建",
"createSubscription": "创建订阅",
"createSuccess": "创建成功",
+2
View File
@@ -17,6 +17,8 @@
"confirm": "確認",
"confirmDelete": "您確定要刪除嗎?",
"confirmOffline": "確認離線",
"copySubscription": "複製訂閱",
"copySuccess": "複製成功",
"create": "建立",
"createSubscription": "建立訂閱",
"createSuccess": "建立成功",
+1 -1
View File
@@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as ads from './ads';
+1 -1
View File
@@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';
+1 -1
View File
@@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as auth from './auth';
+1 -1
View File
@@ -1,5 +1,5 @@
// @ts-ignore
// API 更新时间:
// API 唯一标识:
import * as announcement from './announcement';