fix(tags): wlasna lista tagow dla wertykalow + bez tagow z zerem scen

Trzy rzeczy, jedna rodzina bledu "klikniecie prowadzi donikad".

1. Ekran Tags nie znal wertykalu, wiec z zakladki Anime i JAV pokazywal slownictwo
   GLOWNEGO katalogu. Backend liczyl to poprawnie od dawna (parametr ?vertical=),
   tylko apka go nie przekazywala. Po zmianie Anime dostaje swoje 3380 tagow
   (Schoolgirl, Rape, Uncensored, Harem) zamiast zachodnich, ktore w tej sekcji nie
   maja pokrycia. Tag otwarty z tej listy niesie wertykal dalej.

2. Lista i filtr przestaja pokazywac tagi z zerem scen: 33 427 z 208 822. To glownie
   slownictwo animacji i JAV, bo `tags.scene_count` z zalozenia nie liczy scen
   wertykalowych. Widac je bylo przy WYSZUKIWANIU (sortowanie po popularnosci trzymalo
   je na koncu listy), a kazdy taki tag konczyl sie pustym ekranem.

3. Znaczniki jakosci zniknely wczesniej po stronie danych, wpis w changelogu.

Zakres swiadomie zatrzymany: `/performers` nie ma wsparcia dla wertykalu, wiec przycisk
Performers na zakladce Anime nadal pokazuje zachodnia obsade. To wymaga zmiany backendu
i jest osobnym zadaniem.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
goon-foss 2026-08-14 12:41:07 +02:00
parent 8c8f22d388
commit 3818cd6141
5 changed files with 35 additions and 9 deletions

View file

@ -16,6 +16,15 @@ export type ChangelogEntry = {
};
export const CHANGELOG: ChangelogEntry[] = [
{
id: '2026-08-14d',
date: 'August 2026',
items: [
'The Anime and JAV sections now have their own tag list. Opening Tags from those tabs used to show the main catalogue vocabulary, where almost every tag led to an empty screen.',
'Tags that have no scenes are no longer listed or offered in filters. Searching the tag list used to turn up thousands of dead entries, mostly character names from animation.',
'Quality tags (HD, 4k, 720p) are gone. They were a claim by the site rather than a fact, and the app already works out real quality from the video sources.',
],
},
{
id: '2026-08-14c',
date: 'August 2026',

View file

@ -59,7 +59,9 @@ export type RootStackParamList = {
// StudioMovies: `slug` do filter movies `studio_slugs`, `studioId` (UUID) do favorite.
StudioMovies: { slug: string; name: string; studioId: string };
Favorites: undefined;
Tags: undefined;
// `vertical` przynoszony z zakladki (Anime/JAV). Bez niego lista tagow pokazywala
// slownictwo GLOWNEGO feedu, wiec z Anime kazdy tag prowadzil donikad.
Tags: { vertical?: string } | undefined;
TagScenes: { slug: string; name: string; vertical?: string | null };
AppLockSettings: undefined;
Blacklist: undefined;

View file

@ -89,9 +89,11 @@ export function ScenesFilterModal({
q: tagQ || undefined,
per_page: 200,
vertical,
// Wertykał liczy tagi na żywo i zwraca tylko swoje; w głównym feedzie
// zostawiamy dotychczasowe zachowanie.
only_with_content: vertical ? true : undefined,
// Zawsze, w obu trybach. Tag z zerem scen w danej sekcji nic nie odfiltruje,
// wiec oferowanie go w filtrze to obietnica bez pokrycia. W glownym feedzie
// takich tagow bylo 33 427 z 208 822 (cale slownictwo animacji i JAV, bo
// `tags.scene_count` z zalozenia nie liczy scen wertykalowych).
only_with_content: true,
}),
enabled: visible,
});

View file

@ -219,7 +219,7 @@ export function ScenesScreen() {
</Pressable>
<Pressable
style={styles.subButton}
onPress={() => navigation.navigate('Tags')}
onPress={() => navigation.navigate('Tags', verticalKey ? { vertical: verticalKey } : undefined)}
>
<Text style={styles.subButtonText}>Tags</Text>
</Pressable>

View file

@ -1,6 +1,7 @@
// Lista tagów + tap → TagScenes. Domyślny order: popular (po liczbie scen desc).
// Layout: chip-grid, bo nazwy tagów są krótkie i upacking ich w listę marnuje miejsce.
import { useNavigation } from '@react-navigation/native';
import { useNavigation, useRoute } from '@react-navigation/native';
import type { RouteProp } from '@react-navigation/native';
import { formatCount } from '../lib/formatCount';
import type { NativeStackNavigationProp } from '@react-navigation/native-stack';
import { useQuery } from '@tanstack/react-query';
@ -25,6 +26,8 @@ export function TagsScreen() {
const client = useClient();
const navigation =
useNavigation<NativeStackNavigationProp<RootStackParamList, 'Tags'>>();
const route = useRoute<RouteProp<RootStackParamList, 'Tags'>>();
const vertical = route.params?.vertical;
const [q, setQ] = useState('');
const [debouncedQ, setDebouncedQ] = useState('');
const [order, setOrder] = useState<Order>('popular');
@ -36,8 +39,18 @@ export function TagsScreen() {
}, [q]);
const { data, isLoading, error, refetch, isRefetching } = useQuery({
queryKey: ['tags', debouncedQ, order],
queryFn: () => client.listTags({ q: debouncedQ || undefined, order, per_page: 500 }),
queryKey: ['tags', debouncedQ, order, vertical ?? null],
queryFn: () =>
client.listTags({
q: debouncedQ || undefined,
order,
per_page: 500,
vertical,
// Tag z zerem scen prowadzi do pustego ekranu, wiec nie ma go po co pokazywac.
// W glownym feedzie bylo takich 33 427 z 208 822, w tym cale slownictwo
// animacji i JAV (licznik `tags.scene_count` z zalozenia pomija wertykaly).
only_with_content: true,
}),
});
const total = data?.items.length ?? 0;
@ -88,7 +101,7 @@ export function TagsScreen() {
<TagChip
tag={item}
onPress={() =>
navigation.navigate('TagScenes', { slug: item.slug, name: item.name })
navigation.navigate('TagScenes', { slug: item.slug, name: item.name, vertical })
}
/>
)}