From e881778659670740d0bfe536f41fdeb9436cfd15 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 15:48:18 +0000 Subject: [PATCH] feat: Implement sidebar layout for filters --- src/components/profile/RideCreditFilters.tsx | 33 ++- src/components/profile/RideCreditsManager.tsx | 277 ++++++++++-------- 2 files changed, 174 insertions(+), 136 deletions(-) diff --git a/src/components/profile/RideCreditFilters.tsx b/src/components/profile/RideCreditFilters.tsx index 1db2c4c2..e522fe4a 100644 --- a/src/components/profile/RideCreditFilters.tsx +++ b/src/components/profile/RideCreditFilters.tsx @@ -18,6 +18,7 @@ interface RideCreditFiltersProps { activeFilterCount: number; resultCount: number; totalCount: number; + compact?: boolean; } export function RideCreditFilters({ @@ -28,7 +29,11 @@ export function RideCreditFilters({ activeFilterCount, resultCount, totalCount, + compact = false, }: RideCreditFiltersProps) { + const spacingClass = compact ? 'space-y-3' : 'space-y-4'; + const sectionSpacing = compact ? 'space-y-2' : 'space-y-3'; + const paddingClass = compact ? 'p-4' : 'pt-6'; // Extract unique values from credits for filter options const filterOptions = useMemo(() => { const countries = new Set(); @@ -99,9 +104,10 @@ export function RideCreditFilters({ }; return ( -
- {/* Search Bar - Always Visible */} -
+
+
+ {/* Search Bar - Always Visible */} +
))} -
+
- {/* Collapsible Filter Sections */} -
+ {/* Collapsible Filter Sections */} +
{/* Geographic Filters */} @@ -356,11 +362,11 @@ export function RideCreditFilters({
-
+
- {/* Active Filters Display */} - {activeFilterCount > 0 && ( -
+ {/* Active Filters Display */} + {activeFilterCount > 0 && ( +
Showing {resultCount} of {totalCount} credits @@ -410,10 +416,11 @@ export function RideCreditFilters({ Has inversions removeFilter('hasInversions')} /> - )} + )} +
-
- )} + )} +
); } diff --git a/src/components/profile/RideCreditsManager.tsx b/src/components/profile/RideCreditsManager.tsx index cbad1b15..8cfd7043 100644 --- a/src/components/profile/RideCreditsManager.tsx +++ b/src/components/profile/RideCreditsManager.tsx @@ -12,6 +12,7 @@ import { SortableRideCreditCard } from './SortableRideCreditCard'; import { RideCreditFilters } from './RideCreditFilters'; import { UserRideCredit } from '@/types/database'; import { useRideCreditFilters } from '@/hooks/useRideCreditFilters'; +import { useIsMobile } from '@/hooks/use-mobile'; import { DndContext, DragEndEvent, @@ -37,6 +38,7 @@ export function RideCreditsManager({ userId }: RideCreditsManagerProps) { const [sortBy, setSortBy] = useState<'date' | 'count' | 'name' | 'custom'>('custom'); const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); const [isEditMode, setIsEditMode] = useState(false); + const isMobile = useIsMobile(); // Use the filter hook const { @@ -328,146 +330,175 @@ export function RideCreditsManager({ userId }: RideCreditsManagerProps) { - {/* Filters */} - - - - - - - {/* Controls */} -
-
- - - -
- -
- - -
- - -
-
-
- - {/* Credits Display */} - {displayCredits.length === 0 ? ( - - -
- {credits.length === 0 ? ( - <> -

No Ride Credits Yet

-

- Start tracking your ride experiences -

- - - ) : ( - <> -

No Results Found

-

- Try adjusting your filters -

- - - )} + {/* Main Content Area with Sidebar */} +
+ {/* Left Sidebar - Desktop Only */} + {!isMobile && ( + + )} + + {/* Right Content Area */} +
+ {/* Mobile Filters - Collapsible Card */} + {isMobile && ( + + + + + + )} + + {/* Controls */} +
+
+ + + +
+ +
+ + +
+ + +
+
+
+ + {/* Credits Display */} + {displayCredits.length === 0 ? ( + + +
+ {credits.length === 0 ? ( + <> +

No Ride Credits Yet

+

+ Start tracking your ride experiences +

+ + + ) : ( + <> +

No Results Found

+

+ Try adjusting your filters +

+ + + )} +
+
+
+ ) : isEditMode ? ( + + c.id)} + strategy={verticalListSortingStrategy} + > +
+ {displayCredits.map((credit, index) => ( + handleCreditDeleted(credit.id)} + onReorder={handleReorder} + /> + ))} +
+
+
+ ) : (
{displayCredits.map((credit, index) => ( - handleCreditDeleted(credit.id)} - onReorder={handleReorder} /> ))}
- - - ) : ( -
- {displayCredits.map((credit, index) => ( - handleCreditDeleted(credit.id)} - /> - ))} + )}
- )} +
{/* Add Credit Dialog */}