import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { membershipService, MembershipTier, MembershipTierCreateData, MembershipTierUpdateData } from '../services/membershipService'; const MembershipTiers: React.FC = () => { const navigate = useNavigate(); const [tiers, setTiers] = useState([]); const [loading, setLoading] = useState(true); const [showCreateForm, setShowCreateForm] = useState(false); const [editingTier, setEditingTier] = useState(null); useEffect(() => { loadTiers(); }, []); const loadTiers = async () => { try { setLoading(true); const tierData = await membershipService.getAllTiers(true); setTiers(tierData); } catch (error) { console.error('Failed to load tiers:', error); alert('Failed to load membership tiers'); } finally { setLoading(false); } }; const handleCreateTier = async (data: MembershipTierCreateData | MembershipTierUpdateData) => { try { await membershipService.createTier(data as MembershipTierCreateData); setShowCreateForm(false); loadTiers(); } catch (error: any) { alert(error.response?.data?.detail || 'Failed to create tier'); } }; const handleUpdateTier = async (tierId: number, data: MembershipTierUpdateData) => { try { await membershipService.updateTier(tierId, data); setEditingTier(null); loadTiers(); } catch (error: any) { alert(error.response?.data?.detail || 'Failed to update tier'); } }; const handleDeleteTier = async (tierId: number) => { if (!confirm('Are you sure you want to delete this membership tier? This action cannot be undone.')) { return; } try { await membershipService.deleteTier(tierId); loadTiers(); } catch (error: any) { alert(error.response?.data?.detail || 'Failed to delete tier'); } }; const handleEditTier = (tier: MembershipTier) => { setEditingTier(tier); }; const handleCancelEdit = () => { setEditingTier(null); setShowCreateForm(false); }; if (loading) { return (
Loading membership tiers...
); } return (

Membership Tiers Management

Manage membership tiers and pricing

{tiers.map((tier) => (

{tier.name}

Annual Fee: £{tier.annual_fee.toFixed(2)}
Status: {tier.is_active ? 'Active' : 'Inactive'}
Benefits:

{tier.benefits}

))}
{(showCreateForm || editingTier) && ( handleUpdateTier(editingTier.id, data) : handleCreateTier} onCancel={handleCancelEdit} /> )}
); }; interface MembershipTierFormProps { tier: MembershipTier | null; onSave: (data: MembershipTierCreateData | MembershipTierUpdateData) => void; onCancel: () => void; } const MembershipTierForm: React.FC = ({ tier, onSave, onCancel }) => { const [formData, setFormData] = useState({ name: tier?.name || '', annual_fee: tier?.annual_fee || 0, benefits: tier?.benefits || '', is_active: tier?.is_active ?? true }); const handleChange = (field: string, value: any) => { setFormData(prev => ({ ...prev, [field]: value })); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); onSave(formData); }; return (

{tier ? 'Edit Membership Tier' : 'Create New Membership Tier'}

handleChange('name', e.target.value)} style={{ width: '100%', padding: '8px', border: '1px solid #ddd', borderRadius: '4px' }} required />
handleChange('annual_fee', parseFloat(e.target.value) || 0)} style={{ width: '100%', padding: '8px', border: '1px solid #ddd', borderRadius: '4px' }} required />