export const Filters = () => {
const filters: { id: FilterId; title: string; options: string[]; multi?: boolean }[] = [
{ id: 'epic', title: 'Epic', options: ['Refonte design', 'Onboarding', 'Facturation'] },
{ id: 'type', title: 'Type', options: ['Bug', 'Story', 'Tâche'] },
{
id: 'filtresRapides',
title: 'Filtres rapides',
options: ['Assigné à moi', 'En cours', 'En retard'],
multi: true,
},
];
const [openId, setOpenId] = React.useState<FilterId | null>(null);
const [singleSelected, setSingleSelected] = React.useState<Partial<Record<FilterId, string>>>({});
const [multiSelected, setMultiSelected] = React.useState<Partial<Record<FilterId, string[]>>>({});
return (
<ScrollView
horizontal
nestedScrollEnabled
directionalLockEnabled={Platform.OS === 'ios'}
showsHorizontalScrollIndicator={false}
contentContainerStyle={{ flexDirection: 'row', gap: 8, paddingHorizontal: 16 }}
>
{filters.map(filter => {
const isOpen = openId === filter.id;
const hasSelection = filter.multi
? (multiSelected[filter.id]?.length ?? 0) > 0
: singleSelected[filter.id] != null;
return (
<ActionMenu
key={filter.id}
placement="bottom-start"
scrollable={false}
open={isOpen}
setOpen={open => setOpenId(open ? filter.id : null)}
renderTrigger={() => (
<Button
variant="secondary"
title={filter.multi ? filter.title : (singleSelected[filter.id] ?? filter.title)}
endIcon="ChevronDown"
size="sm"
selected={hasSelection}
active={isOpen}
/>
)}
>
{filter.options.map(option => {
const isSelected = filter.multi
? (multiSelected[filter.id] ?? []).includes(option)
: singleSelected[filter.id] === option;
return (
<ActionMenu.Item
key={option}
title={option}
selected={isSelected}
onPress={() => {
if (filter.multi) {
setMultiSelected(prev => {
const current = prev[filter.id] ?? [];
return {
...prev,
[filter.id]: current.includes(option)
? current.filter(o => o !== option)
: [...current, option],
};
});
} else {
setSingleSelected(prev => ({
...prev,
[filter.id]: prev[filter.id] === option ? undefined : option,
}));
setOpenId(null);
}
}}
/>
);
})}
</ActionMenu>
);
})}
</ScrollView>
);
};