Skip to content

Commit f05e12f

Browse files
committed
Create ProductFilters.component.tsx
1 parent c287d34 commit f05e12f

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
import { Dispatch, SetStateAction } from 'react';
2+
3+
interface ProductFiltersProps {
4+
selectedSizes: string[];
5+
setSelectedSizes: Dispatch<SetStateAction<string[]>>;
6+
selectedColors: string[];
7+
setSelectedColors: Dispatch<SetStateAction<string[]>>;
8+
priceRange: [number, number];
9+
setPriceRange: Dispatch<SetStateAction<[number, number]>>;
10+
}
11+
12+
const ProductFilters = ({
13+
selectedSizes,
14+
setSelectedSizes,
15+
selectedColors,
16+
setSelectedColors,
17+
priceRange,
18+
setPriceRange,
19+
}: ProductFiltersProps) => {
20+
const sizes = ['XS', 'S', 'M', 'L', 'XL', 'XXL'];
21+
const colors = [
22+
{ name: 'Svart', class: 'bg-black' },
23+
{ name: 'Brun', class: 'bg-brown-500' },
24+
{ name: 'Beige', class: 'bg-[#D2B48C]' },
25+
{ name: 'Grå', class: 'bg-gray-500' },
26+
{ name: 'Hvit', class: 'bg-white border border-gray-300' },
27+
{ name: 'Blå', class: 'bg-blue-500' }
28+
];
29+
30+
const toggleSize = (size: string) => {
31+
setSelectedSizes(prev =>
32+
prev.includes(size)
33+
? prev.filter(s => s !== size)
34+
: [...prev, size]
35+
);
36+
};
37+
38+
const toggleColor = (color: string) => {
39+
setSelectedColors(prev =>
40+
prev.includes(color)
41+
? prev.filter(c => c !== color)
42+
: [...prev, color]
43+
);
44+
};
45+
46+
return (
47+
<div className="w-full md:w-64 flex-shrink-0">
48+
<div className="bg-white p-6 rounded-lg shadow-sm">
49+
<div className="mb-8">
50+
<h3 className="font-semibold mb-4">PRODUKT TYPE</h3>
51+
<div className="space-y-2">
52+
<label className="flex items-center">
53+
<input type="checkbox" className="form-checkbox" />
54+
<span className="ml-2">T-Shirts</span>
55+
</label>
56+
<label className="flex items-center">
57+
<input type="checkbox" className="form-checkbox" />
58+
<span className="ml-2">Gensere</span>
59+
</label>
60+
<label className="flex items-center">
61+
<input type="checkbox" className="form-checkbox" />
62+
<span className="ml-2">Singlet</span>
63+
</label>
64+
<label className="flex items-center">
65+
<input type="checkbox" className="form-checkbox" />
66+
<span className="ml-2">Skjorter</span>
67+
</label>
68+
</div>
69+
</div>
70+
71+
<div className="mb-8">
72+
<h3 className="font-semibold mb-4">PRIS</h3>
73+
<input
74+
type="range"
75+
min="0"
76+
max="1000"
77+
value={priceRange[1]}
78+
onChange={(e) => setPriceRange([priceRange[0], parseInt(e.target.value)])}
79+
className="w-full"
80+
/>
81+
<div className="flex justify-between mt-2">
82+
<span>kr {priceRange[0]}</span>
83+
<span>kr {priceRange[1]}</span>
84+
</div>
85+
</div>
86+
87+
<div className="mb-8">
88+
<h3 className="font-semibold mb-4">STØRRELSE</h3>
89+
<div className="grid grid-cols-3 gap-2">
90+
{sizes.map((size) => (
91+
<button
92+
key={size}
93+
onClick={() => toggleSize(size)}
94+
className={`px-3 py-1 border rounded ${
95+
selectedSizes.includes(size)
96+
? 'bg-gray-900 text-white'
97+
: 'hover:bg-gray-100'
98+
}`}
99+
>
100+
{size}
101+
</button>
102+
))}
103+
</div>
104+
</div>
105+
106+
<div>
107+
<h3 className="font-semibold mb-4">FARGE</h3>
108+
<div className="grid grid-cols-3 gap-2">
109+
{colors.map((color) => (
110+
<button
111+
key={color.name}
112+
onClick={() => toggleColor(color.name)}
113+
className={`w-8 h-8 rounded-full ${color.class} ${
114+
selectedColors.includes(color.name)
115+
? 'ring-2 ring-offset-2 ring-gray-900'
116+
: ''
117+
}`}
118+
title={color.name}
119+
/>
120+
))}
121+
</div>
122+
</div>
123+
</div>
124+
</div>
125+
);
126+
};
127+
128+
export default ProductFilters;

0 commit comments

Comments
 (0)