| |
| import React, { useState } from "react"; |
| import { Send, X } from "lucide-react"; |
|
|
| export default function MembershipInviteForm({ |
| plans, |
| onSend, |
| onCancel, |
| isLoading, |
| }) { |
| const [email, setEmail] = useState("parent@email.com"); |
| const [selectedPlanId, setSelectedPlanId] = useState(""); |
| const [classDetails, setClassDetails] = useState(""); |
|
|
| const selectedPlan = plans.find((p) => p.id === parseInt(selectedPlanId)); |
|
|
| const handleSubmit = (e) => { |
| e.preventDefault(); |
| if (!email.trim() || !selectedPlanId) { |
| return; |
| } |
|
|
| onSend({ |
| email: email.trim(), |
| plan_id: parseInt(selectedPlanId), |
| class_details: classDetails.trim(), |
| invited_by: "admin", |
| }); |
| }; |
|
|
| return ( |
| <form onSubmit={handleSubmit} className="space-y-4"> |
| <div> |
| <label className="block text-sm font-medium text-stone-700 mb-1.5"> |
| Email Address |
| </label> |
| <input |
| type="email" |
| required |
| value={email} |
| onChange={(e) => setEmail(e.target.value)} |
| className="w-full rounded-lg border border-stone-200 px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-red-500 focus:border-red-500" |
| placeholder="parent@email.com" |
| /> |
| </div> |
| |
| <div> |
| <label className="block text-sm font-medium text-stone-700 mb-1.5"> |
| Membership Plan |
| </label> |
| <select |
| required |
| value={selectedPlanId} |
| onChange={(e) => setSelectedPlanId(e.target.value)} |
| className="w-full rounded-lg border border-stone-200 px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-red-500 focus:border-red-500" |
| > |
| <option value="">Select a plan...</option> |
| {plans |
| .filter((p) => p.is_active) |
| .map((plan) => ( |
| <option key={plan.id} value={plan.id}> |
| {plan.name} - ${plan.price}/{plan.billing_period} (Up to{" "} |
| {plan.max_students || 1} student{plan.max_students !== 1 ? "s" : ""}) |
| </option> |
| ))} |
| </select> |
| </div> |
| |
| <div> |
| <label className="block text-sm font-medium text-stone-700 mb-1.5"> |
| Class Information (shown to member) |
| </label> |
| <textarea |
| value={classDetails} |
| onChange={(e) => setClassDetails(e.target.value)} |
| rows={4} |
| className="w-full rounded-lg border border-stone-200 px-3 py-2 text-sm focus:outline-none focus:ring-1 focus:ring-red-500 focus:border-red-500" |
| placeholder="e.g., Beginner Karate - Mon & Wed 4:00 PM, Advanced Karate - Fri 5:00 PM" |
| /> |
| <p className="text-xs text-stone-500 mt-1"> |
| Describe the classes included so the member knows what they're signing |
| up for |
| </p> |
| </div> |
| |
| <div className="flex items-center justify-end gap-2 pt-2"> |
| <button |
| type="button" |
| onClick={onCancel} |
| disabled={isLoading} |
| className="inline-flex items-center gap-2 rounded-lg border border-stone-200 px-4 py-2 text-sm font-medium text-stone-700 hover:bg-stone-50 disabled:opacity-50" |
| > |
| <X className="w-4 h-4" /> |
| Cancel |
| </button> |
| <button |
| type="submit" |
| disabled={isLoading || !email.trim() || !selectedPlanId} |
| className="inline-flex items-center gap-2 rounded-lg bg-red-600 hover:bg-red-700 text-white text-sm font-medium px-4 py-2 disabled:opacity-50 disabled:cursor-not-allowed" |
| > |
| <Send className="w-4 h-4" /> |
| {isLoading ? "Sending..." : "Send Invite"} |
| </button> |
| </div> |
| </form> |
| ); |
| } |
|
|
|
|