Show available Pilates classes without booking options or pricing
Removes booking functionality and price display from ClassCard and ClassesSection components. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 88cd88e4-2dbe-4df6-8c8a-7e38f13ef1ec Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/af8dabca-e746-4e53-9c29-d8d4d9cf30f5/6dde4ef6-6ad6-4713-b98b-6bd86ff25b19.jpg
This commit is contained in:
parent
6026c3269d
commit
1b50674491
|
|
@ -1,44 +1,17 @@
|
||||||
import { Class } from "@shared/schema";
|
import { Class } from "@shared/schema";
|
||||||
import { useAuth } from "@/hooks/use-auth";
|
|
||||||
import { useState } from "react";
|
|
||||||
import { useToast } from "@/hooks/use-toast";
|
|
||||||
import { useLocation } from "wouter";
|
|
||||||
import FadiaGroupClassImage from "../../assets/Fadia-15.jpg";
|
import FadiaGroupClassImage from "../../assets/Fadia-15.jpg";
|
||||||
import FadiaSmallGroupClassImage from "../../assets/Fadia-156.jpg";
|
import FadiaSmallGroupClassImage from "../../assets/Fadia-156.jpg";
|
||||||
import FadiaPrivateClassImage from "../../assets/Fadia-132.jpg";
|
import FadiaPrivateClassImage from "../../assets/Fadia-132.jpg";
|
||||||
|
|
||||||
interface ClassCardProps {
|
interface ClassCardProps {
|
||||||
classData: Class;
|
classData: Class;
|
||||||
onBookClick: (classId: number) => void;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function ClassCard({ classData, onBookClick }: ClassCardProps) {
|
export function ClassCard({ classData }: ClassCardProps) {
|
||||||
const { user } = useAuth();
|
|
||||||
const { toast } = useToast();
|
|
||||||
const [_, setLocation] = useLocation();
|
|
||||||
|
|
||||||
const formatPrice = (price: number) => {
|
|
||||||
return `$${(price / 100).toFixed(2)}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const formatDuration = (minutes: number) => {
|
const formatDuration = (minutes: number) => {
|
||||||
return `${minutes} minutes`;
|
return `${minutes} minutes`;
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleBookNow = () => {
|
|
||||||
if (!user) {
|
|
||||||
toast({
|
|
||||||
title: "Authentication required",
|
|
||||||
description: "Please login or sign up to book a class",
|
|
||||||
variant: "destructive"
|
|
||||||
});
|
|
||||||
setLocation("/auth");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
onBookClick(classData.id);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Determine badge color based on class type
|
// Determine badge color based on class type
|
||||||
const badgeColor = () => {
|
const badgeColor = () => {
|
||||||
switch (classData.classType) {
|
switch (classData.classType) {
|
||||||
|
|
@ -49,11 +22,6 @@ export function ClassCard({ classData, onBookClick }: ClassCardProps) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// All buttons use teal as the primary color
|
|
||||||
const buttonColor = () => {
|
|
||||||
return "bg-teal text-white";
|
|
||||||
};
|
|
||||||
|
|
||||||
// Format class type for display
|
// Format class type for display
|
||||||
const formatClassType = (type: string) => {
|
const formatClassType = (type: string) => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|
@ -91,18 +59,11 @@ export function ClassCard({ classData, onBookClick }: ClassCardProps) {
|
||||||
<p className="text-gray-600 mb-4">
|
<p className="text-gray-600 mb-4">
|
||||||
{classData.description}
|
{classData.description}
|
||||||
</p>
|
</p>
|
||||||
<div className="flex justify-between items-center">
|
<div className="flex items-center">
|
||||||
<span className="text-gray-700">
|
<span className="text-gray-700">
|
||||||
<i className="far fa-clock mr-1"></i> {formatDuration(classData.duration)}
|
<i className="far fa-clock mr-1"></i> {formatDuration(classData.duration)}
|
||||||
</span>
|
</span>
|
||||||
<span className="text-gray-700">{formatPrice(classData.price)} / class</span>
|
|
||||||
</div>
|
</div>
|
||||||
<button
|
|
||||||
className={`mt-4 w-full ${buttonColor()} font-medium py-2 px-4 rounded-md hover:bg-opacity-90 transition duration-300`}
|
|
||||||
onClick={handleBookNow}
|
|
||||||
>
|
|
||||||
Book Now
|
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,30 +1,14 @@
|
||||||
import { useState } from "react";
|
|
||||||
import { ClassCard } from "./class-card";
|
import { ClassCard } from "./class-card";
|
||||||
import { BookingCalendar } from "./booking-calendar";
|
|
||||||
import { useQuery } from "@tanstack/react-query";
|
import { useQuery } from "@tanstack/react-query";
|
||||||
import { Class } from "@shared/schema";
|
import { Class } from "@shared/schema";
|
||||||
import { Skeleton } from "@/components/ui/skeleton";
|
import { Skeleton } from "@/components/ui/skeleton";
|
||||||
import FadiaClassImage from "../../assets/Fadia-156.jpg";
|
import FadiaClassImage from "../../assets/Fadia-156.jpg";
|
||||||
|
|
||||||
export function ClassesSection() {
|
export function ClassesSection() {
|
||||||
const [selectedClassId, setSelectedClassId] = useState<number | null>(null);
|
|
||||||
|
|
||||||
const { data: classes, isLoading, error } = useQuery<Class[]>({
|
const { data: classes, isLoading, error } = useQuery<Class[]>({
|
||||||
queryKey: ["/api/classes"],
|
queryKey: ["/api/classes"],
|
||||||
});
|
});
|
||||||
|
|
||||||
const selectedClass = selectedClassId
|
|
||||||
? classes?.find(c => c.id === selectedClassId)
|
|
||||||
: null;
|
|
||||||
|
|
||||||
const handleBookClick = (classId: number) => {
|
|
||||||
setSelectedClassId(classId);
|
|
||||||
const element = document.getElementById('booking-calendar');
|
|
||||||
if (element) {
|
|
||||||
element.scrollIntoView({ behavior: 'smooth' });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section className="py-20" style={{ backgroundColor: 'rgba(181, 80, 118, 0.1)' }}>
|
<section className="py-20" style={{ backgroundColor: 'rgba(181, 80, 118, 0.1)' }}>
|
||||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
|
|
@ -65,7 +49,6 @@ export function ClassesSection() {
|
||||||
<Skeleton className="h-4 w-full mb-2" />
|
<Skeleton className="h-4 w-full mb-2" />
|
||||||
<Skeleton className="h-4 w-full mb-2" />
|
<Skeleton className="h-4 w-full mb-2" />
|
||||||
<Skeleton className="h-4 w-3/4 mb-4" />
|
<Skeleton className="h-4 w-3/4 mb-4" />
|
||||||
<Skeleton className="h-8 w-24 mt-4" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|
@ -80,28 +63,10 @@ export function ClassesSection() {
|
||||||
<ClassCard
|
<ClassCard
|
||||||
key={classData.id}
|
key={classData.id}
|
||||||
classData={classData}
|
classData={classData}
|
||||||
onBookClick={handleBookClick}
|
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{selectedClass && (
|
|
||||||
<div id="booking-calendar" className="mt-20 pt-10 border-t border-gray-200">
|
|
||||||
<h3 className="text-2xl font-playfair font-semibold text-center mb-8">
|
|
||||||
Book Your {selectedClass.name} Class
|
|
||||||
</h3>
|
|
||||||
<BookingCalendar selectedClass={selectedClass} />
|
|
||||||
<div className="text-center mt-8">
|
|
||||||
<button
|
|
||||||
onClick={() => setSelectedClassId(null)}
|
|
||||||
className="px-6 py-2 text-gray-600 hover:text-gray-900 border border-gray-300 hover:border-gray-500 transition-colors"
|
|
||||||
>
|
|
||||||
Cancel
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue