2026-02-05 17:18:13 +00:00
|
|
|
import React, { useState, useMemo } from 'react';
|
|
|
|
|
import { LayoutGrid, List } from 'lucide-react';
|
|
|
|
|
import { useToast } from '@/components/feedback/ToastProvider';
|
2026-01-13 18:47:57 +00:00
|
|
|
import {
|
2026-02-05 17:18:13 +00:00
|
|
|
GearViewHeader,
|
|
|
|
|
GearFilters,
|
|
|
|
|
GearInventoryGrid,
|
|
|
|
|
GearDetailModal,
|
|
|
|
|
mockGearInventory,
|
|
|
|
|
type GearViewMode,
|
|
|
|
|
type GearFilterValue,
|
|
|
|
|
} from '@/features/inventory/components/gear';
|
|
|
|
|
import { cn } from '@/lib/utils';
|
2026-01-07 09:31:02 +00:00
|
|
|
|
|
|
|
|
export const GearView: React.FC = () => {
|
|
|
|
|
const { addToast } = useToast();
|
2026-02-05 17:18:13 +00:00
|
|
|
const [selectedItem, setSelectedItem] = useState<(typeof mockGearInventory)[0] | null>(null);
|
|
|
|
|
const [filter, setFilter] = useState<GearFilterValue>('All');
|
2026-01-07 09:31:02 +00:00
|
|
|
const [search, setSearch] = useState('');
|
2026-02-05 17:18:13 +00:00
|
|
|
const [viewMode, setViewMode] = useState<GearViewMode>('grid');
|
|
|
|
|
|
|
|
|
|
const filteredInventory = useMemo(() => {
|
|
|
|
|
return mockGearInventory.filter((item) => {
|
|
|
|
|
const matchesFilter = filter === 'All' || item.category === filter || item.status === filter;
|
|
|
|
|
const matchesSearch =
|
|
|
|
|
item.name.toLowerCase().includes(search.toLowerCase()) ||
|
|
|
|
|
item.brand.toLowerCase().includes(search.toLowerCase());
|
|
|
|
|
return matchesFilter && matchesSearch;
|
|
|
|
|
});
|
|
|
|
|
}, [filter, search]);
|
|
|
|
|
|
|
|
|
|
const handleListOnMarketplace = (item: (typeof mockGearInventory)[0]) => {
|
2026-01-13 18:47:57 +00:00
|
|
|
addToast(`Draft listing created for ${item.brand} ${item.name}`, 'success');
|
|
|
|
|
setSelectedItem(null);
|
2026-01-07 09:31:02 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
2026-02-05 17:18:13 +00:00
|
|
|
<div className="space-y-8 animate-fadeIn relative max-w-layout-content mx-auto px-4 md:px-6">
|
|
|
|
|
<GearViewHeader
|
|
|
|
|
onExport={() => addToast('Exporting Inventory CSV...')}
|
|
|
|
|
onRegister={() => addToast('Opens Registration Form')}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<GearFilters
|
|
|
|
|
search={search}
|
|
|
|
|
onSearchChange={setSearch}
|
|
|
|
|
filter={filter}
|
|
|
|
|
onFilterChange={setFilter}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
{/* View mode toggle — smooth grid/list transition (documented in GearInventoryGrid stories) */}
|
|
|
|
|
<div className="flex items-center justify-between">
|
|
|
|
|
<span className="text-sm text-muted-foreground font-mono">View</span>
|
|
|
|
|
<div className="flex gap-1 bg-muted p-1 rounded-lg border border-border">
|
|
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
onClick={() => setViewMode('grid')}
|
|
|
|
|
className={cn(
|
|
|
|
|
'p-1.5 rounded transition-colors',
|
|
|
|
|
viewMode === 'grid' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'
|
|
|
|
|
)}
|
|
|
|
|
aria-label="Grid view"
|
2026-01-13 18:47:57 +00:00
|
|
|
>
|
2026-02-05 17:18:13 +00:00
|
|
|
<LayoutGrid className="w-4 h-4" />
|
|
|
|
|
</button>
|
|
|
|
|
<button
|
|
|
|
|
type="button"
|
|
|
|
|
onClick={() => setViewMode('list')}
|
|
|
|
|
className={cn(
|
|
|
|
|
'p-1.5 rounded transition-colors',
|
|
|
|
|
viewMode === 'list' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:text-foreground'
|
|
|
|
|
)}
|
|
|
|
|
aria-label="List view"
|
|
|
|
|
>
|
|
|
|
|
<List className="w-4 h-4" />
|
|
|
|
|
</button>
|
2026-01-13 18:47:57 +00:00
|
|
|
</div>
|
2026-01-07 09:31:02 +00:00
|
|
|
</div>
|
|
|
|
|
|
2026-02-05 17:18:13 +00:00
|
|
|
<GearInventoryGrid
|
|
|
|
|
items={filteredInventory}
|
|
|
|
|
viewMode={viewMode}
|
|
|
|
|
onItemSelect={setSelectedItem}
|
|
|
|
|
onAddNew={() => addToast('Opens Registration Form')}
|
|
|
|
|
/>
|
2026-01-07 09:31:02 +00:00
|
|
|
|
|
|
|
|
{selectedItem && (
|
2026-02-05 17:18:13 +00:00
|
|
|
<GearDetailModal
|
|
|
|
|
item={selectedItem}
|
|
|
|
|
onClose={() => setSelectedItem(null)}
|
|
|
|
|
onSellOnMarketplace={handleListOnMarketplace}
|
|
|
|
|
onLogMaintenance={() => addToast('Maintenance Log Updated')}
|
|
|
|
|
onContactSupport={(item) => addToast(`Contacting ${item.supportContact}`)}
|
|
|
|
|
onUploadDocument={() => addToast('Upload document')}
|
|
|
|
|
/>
|
2026-01-07 09:31:02 +00:00
|
|
|
)}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
2026-01-13 18:47:57 +00:00
|
|
|
};
|