| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| import { useState, useEffect } from 'react'; |
| import { useTranslation } from 'react-i18next'; |
| import { API, showError, showSuccess } from '../../helpers'; |
| import { useTableCompactMode } from '../common/useTableCompactMode'; |
|
|
| export const useSubscriptionsData = () => { |
| const { t } = useTranslation(); |
| const [compactMode, setCompactMode] = useTableCompactMode('subscriptions'); |
|
|
| |
| const [allPlans, setAllPlans] = useState([]); |
| const [loading, setLoading] = useState(true); |
|
|
| |
| const [activePage, setActivePage] = useState(1); |
| const [pageSize, setPageSize] = useState(10); |
|
|
| |
| const [showEdit, setShowEdit] = useState(false); |
| const [editingPlan, setEditingPlan] = useState(null); |
| const [sheetPlacement, setSheetPlacement] = useState('left'); |
|
|
| |
| const loadPlans = async () => { |
| setLoading(true); |
| try { |
| const res = await API.get('/api/subscription/admin/plans'); |
| if (res.data?.success) { |
| const next = res.data.data || []; |
| setAllPlans(next); |
|
|
| |
| const totalPages = Math.max(1, Math.ceil(next.length / pageSize)); |
| setActivePage((p) => Math.min(p || 1, totalPages)); |
| } else { |
| showError(res.data?.message || t('加载失败')); |
| } |
| } catch (e) { |
| showError(t('请求失败')); |
| } finally { |
| setLoading(false); |
| } |
| }; |
|
|
| |
| const refresh = async () => { |
| await loadPlans(); |
| }; |
|
|
| const handlePageChange = (page) => { |
| setActivePage(page); |
| }; |
|
|
| const handlePageSizeChange = (size) => { |
| setPageSize(size); |
| setActivePage(1); |
| }; |
|
|
| |
| const setPlanEnabled = async (planRecordOrId, enabled) => { |
| const planId = |
| typeof planRecordOrId === 'number' |
| ? planRecordOrId |
| : planRecordOrId?.plan?.id; |
| if (!planId) return; |
| setLoading(true); |
| try { |
| const res = await API.patch(`/api/subscription/admin/plans/${planId}`, { |
| enabled: !!enabled, |
| }); |
| if (res.data?.success) { |
| showSuccess(enabled ? t('已启用') : t('已禁用')); |
| await loadPlans(); |
| } else { |
| showError(res.data?.message || t('操作失败')); |
| } |
| } catch (e) { |
| showError(t('请求失败')); |
| } finally { |
| setLoading(false); |
| } |
| }; |
|
|
| |
| const closeEdit = () => { |
| setShowEdit(false); |
| setEditingPlan(null); |
| }; |
|
|
| const openCreate = () => { |
| setSheetPlacement('left'); |
| setEditingPlan(null); |
| setShowEdit(true); |
| }; |
|
|
| const openEdit = (planRecord) => { |
| setSheetPlacement('right'); |
| setEditingPlan(planRecord); |
| setShowEdit(true); |
| }; |
|
|
| |
| useEffect(() => { |
| loadPlans(); |
| }, []); |
|
|
| const planCount = allPlans.length; |
| const plans = allPlans.slice( |
| Math.max(0, (activePage - 1) * pageSize), |
| Math.max(0, (activePage - 1) * pageSize) + pageSize, |
| ); |
|
|
| return { |
| |
| plans, |
| planCount, |
| loading, |
|
|
| |
| showEdit, |
| editingPlan, |
| sheetPlacement, |
| setShowEdit, |
| setEditingPlan, |
|
|
| |
| compactMode, |
| setCompactMode, |
|
|
| |
| activePage, |
| pageSize, |
| handlePageChange, |
| handlePageSizeChange, |
|
|
| |
| loadPlans, |
| setPlanEnabled, |
| refresh, |
| closeEdit, |
| openCreate, |
| openEdit, |
|
|
| |
| t, |
| }; |
| }; |
|
|