diff --git a/mobile/src/screens/PerformerScenesScreen.tsx b/mobile/src/screens/PerformerScenesScreen.tsx index 4a07a5e..032f0ef 100644 --- a/mobile/src/screens/PerformerScenesScreen.tsx +++ b/mobile/src/screens/PerformerScenesScreen.tsx @@ -13,6 +13,7 @@ import { Alert, FlatList, Pressable, + ScrollView, StyleSheet, Text, View, @@ -135,11 +136,16 @@ export function PerformerScenesScreen() { // eslint-disable-next-line react-hooks/exhaustive-deps }, [navigation, name, isFavorite, addMutation.isPending, removeMutation.isPending]); + // Filtr tagu IN-PLACE (bug-report 0264a3ff: wybór tagu ma filtrować sceny tej + // aktorki w tym widoku, nie nawigować do osobnego ekranu). null = bez filtra. + const [selectedTag, setSelectedTag] = React.useState<{ slug: string; name: string } | null>(null); + const scenesQuery = useQuery({ - queryKey: ['performer-scenes', id], + queryKey: ['performer-scenes', id, selectedTag?.slug ?? null], queryFn: () => client.listScenes({ performer_ids: [id], + tags: selectedTag ? [selectedTag.slug] : undefined, sort: 'release_date', per_page: 200, // Sceny TPDB/StashDB bez tube-linków nie są usable — zawsze filtrujemy. @@ -270,21 +276,31 @@ export function PerformerScenesScreen() { {tab === 'scenes' && !!tagsQuery.data?.items.length && ( - - {tagsQuery.data.items.map((t) => ( - - navigation.push('TagScenes', { slug: t.slug, name: t.name }) - } - > - - {t.name} - - - ))} - + + {tagsQuery.data.items.map((t) => { + const active = selectedTag?.slug === t.slug; + return ( + + setSelectedTag(active ? null : { slug: t.slug, name: t.name }) + } + > + + {active ? `${t.name} ✕` : t.name} + + + ); + })} + )} } @@ -418,10 +434,10 @@ const styles = StyleSheet.create({ actionBtnTextPrimary: { color: theme.accent, fontWeight: '700', fontSize: 12 }, tagRow: { flexDirection: 'row', - flexWrap: 'wrap', gap: 6, - marginHorizontal: 4, - marginBottom: 10, + paddingHorizontal: 4, + paddingBottom: 10, + alignItems: 'center', }, tagChip: { backgroundColor: theme.card, @@ -430,9 +446,11 @@ const styles = StyleSheet.create({ borderRadius: 14, paddingVertical: 4, paddingHorizontal: 10, - maxWidth: 160, + maxWidth: 200, }, + tagChipActive: { backgroundColor: theme.accent, borderColor: theme.accent }, tagChipText: { color: theme.muted, fontSize: 12, fontWeight: '600' }, + tagChipTextActive: { color: theme.fg, fontWeight: '700' }, tabRow: { flexDirection: 'row', gap: 8, marginBottom: 8 }, tabBtn: { flex: 1,