diff --git a/apps/admin-web/src/lib/api.ts b/apps/admin-web/src/lib/api.ts index 42edfd6..4558676 100644 --- a/apps/admin-web/src/lib/api.ts +++ b/apps/admin-web/src/lib/api.ts @@ -449,6 +449,17 @@ export const kolManageApi = { {}, ); }, + selfSubscribePackage(id: number) { + return apiClient.post>( + `/api/tenant/kol/manage/packages/${id}/self-subscription`, + {}, + ); + }, + cancelSelfSubscription(id: number) { + return apiClient.remove( + `/api/tenant/kol/manage/packages/${id}/self-subscription`, + ); + }, deletePackage(id: number) { return apiClient.remove(`/api/tenant/kol/manage/packages/${id}`); }, diff --git a/apps/admin-web/src/views/KolManageView.vue b/apps/admin-web/src/views/KolManageView.vue index 2646698..5966a57 100644 --- a/apps/admin-web/src/views/KolManageView.vue +++ b/apps/admin-web/src/views/KolManageView.vue @@ -11,6 +11,8 @@ import { CloudUploadOutlined, InboxOutlined, DeleteOutlined, + CheckCircleOutlined, + StopOutlined, } from "@ant-design/icons-vue"; import KolPackageFormModal from "@/components/kol/KolPackageFormModal.vue"; @@ -79,6 +81,24 @@ const archivePackageMutation = useMutation({ onError: (error) => message.error(formatError(error)), }); +const selfSubscribePackageMutation = useMutation({ + mutationFn: (id: number) => kolManageApi.selfSubscribePackage(id), + onSuccess: () => { + message.success("已订阅自己的订阅包"); + invalidateKolPackageAccess(); + }, + onError: (error) => message.error(formatError(error)), +}); + +const cancelSelfSubscriptionMutation = useMutation({ + mutationFn: (id: number) => kolManageApi.cancelSelfSubscription(id), + onSuccess: () => { + message.success("已取消订阅自己的订阅包"); + invalidateKolPackageAccess(); + }, + onError: (error) => message.error(formatError(error)), +}); + const deletePackageMutation = useMutation({ mutationFn: (id: number) => kolManageApi.deletePackage(id), onSuccess: (_, id) => { @@ -150,6 +170,12 @@ const deletePromptMutation = useMutation({ }, }); +function invalidateKolPackageAccess() { + void queryClient.invalidateQueries({ queryKey: ["kol", "packages"] }); + void queryClient.invalidateQueries({ queryKey: ["kol", "my-subscription-prompts"] }); + void queryClient.invalidateQueries({ queryKey: ["workspace"] }); +} + const packageInitialValue = computed | undefined>(() => { if (!editingPackage.value) return undefined; return { @@ -220,6 +246,18 @@ function packageStatusLabel(status: string) { if (status === "archived") return t("kol.manage.packageStatus.archived"); return t("kol.manage.packageStatus.draft"); } + +function isSelfSubscribed(pkg: KolPackageSummary) { + return pkg.self_subscription?.status === "active"; +} + +function canSelfSubscribe(pkg: KolPackageSummary) { + return pkg.status === "published" && !isSelfSubscribed(pkg); +} + +function canCancelSelfSubscription(pkg: KolPackageSummary) { + return pkg.self_subscription?.status === "active"; +}