diff --git a/apps/expo/app/(app)/(tabs)/(home)/index.tsx b/apps/expo/app/(app)/(tabs)/(home)/index.tsx index 4226ac6288..5a649f791e 100644 --- a/apps/expo/app/(app)/(tabs)/(home)/index.tsx +++ b/apps/expo/app/(app)/(tabs)/(home)/index.tsx @@ -9,6 +9,7 @@ import { ListSectionHeader, } from '@packrat/ui/nativewindui'; import { Icon } from 'expo-app/components/Icon'; +import { LargeTitleHeaderSearchContentContainer } from 'expo-app/components/LargeTitleHeaderSearchContentContainer'; import TabScreen from 'expo-app/components/TabScreen'; import { appConfig, featureFlags } from 'expo-app/config'; import { AIChatTile } from 'expo-app/features/ai/components/AIChatTile'; @@ -235,57 +236,61 @@ export default function DashboardScreen() { ref: asNonNullableRef(searchBarRef), onChangeText: setSearchValue, placeholder: appConfig.dashboard.strings.searchPlaceholder, - content: searchValue ? ( - { - assertIsString(item); - if (!item.startsWith(DASHBOARD_GAP_PREFIX)) { - const Component = tileInfo[item as TileName].component; - return ( - { - setSearchValue(''); - searchBarRef.current?.clearText(); - }} - > - - - ); - } - return null; - }} - ListHeaderComponent={() => - filteredTiles.length > 0 ? ( - - {filteredTiles.length}{' '} - {filteredTiles.length === 1 - ? appConfig.dashboard.strings.resultSingular - : appConfig.dashboard.strings.resultPlural} - - ) : null - } - ListEmptyComponent={() => ( - - - - - {t('dashboard.noResults')} - - - {t('dashboard.tryDifferent')} - + content: ( + + {searchValue ? ( + { + assertIsString(item); + if (!item.startsWith(DASHBOARD_GAP_PREFIX)) { + const Component = tileInfo[item as TileName].component; + return ( + { + setSearchValue(''); + searchBarRef.current?.clearText(); + }} + > + + + ); + } + return null; + }} + ListHeaderComponent={() => + filteredTiles.length > 0 ? ( + + {filteredTiles.length}{' '} + {filteredTiles.length === 1 + ? appConfig.dashboard.strings.resultSingular + : appConfig.dashboard.strings.resultPlural} + + ) : null + } + ListEmptyComponent={() => ( + + + + + {t('dashboard.noResults')} + + + {t('dashboard.tryDifferent')} + + + )} + /> + ) : ( + + {t('dashboard.searchPlaceholder')} )} - /> - ) : ( - - {t('dashboard.searchPlaceholder')} - + ), }} backVisible={false} diff --git a/apps/expo/components/LargeTitleHeaderSearchContentContainer.tsx b/apps/expo/components/LargeTitleHeaderSearchContentContainer.tsx new file mode 100644 index 0000000000..f3960ac31f --- /dev/null +++ b/apps/expo/components/LargeTitleHeaderSearchContentContainer.tsx @@ -0,0 +1,14 @@ +import { useColorScheme } from '@packrat/ui/nativewindui'; +import { Platform, SafeAreaView, View } from 'react-native'; + +export const LargeTitleHeaderSearchContentContainer = ({ + children, +}: { + children: React.ReactNode; +}) => { + const { colors } = useColorScheme(); + + const Container = Platform.OS === 'ios' ? SafeAreaView : View; + + return {children}; +}; diff --git a/apps/expo/features/catalog/screens/CatalogItemsScreen.tsx b/apps/expo/features/catalog/screens/CatalogItemsScreen.tsx index cfb6c417b7..ca3050769d 100644 --- a/apps/expo/features/catalog/screens/CatalogItemsScreen.tsx +++ b/apps/expo/features/catalog/screens/CatalogItemsScreen.tsx @@ -2,6 +2,7 @@ import { LargeTitleHeader, type LargeTitleSearchBarMethods, Text } from '@packra import { searchValueAtom } from 'expo-app/atoms/itemListAtoms'; import { CategoriesFilter } from 'expo-app/components/CategoriesFilter'; import { Icon } from 'expo-app/components/Icon'; +import { LargeTitleHeaderSearchContentContainer } from 'expo-app/components/LargeTitleHeaderSearchContentContainer'; import TabScreen from 'expo-app/components/TabScreen'; import { withAuthWall } from 'expo-app/features/auth/hocs'; import { useColorScheme } from 'expo-app/lib/hooks/useColorScheme'; @@ -141,7 +142,7 @@ function CatalogItemsScreen() { placeholder: t('catalog.searchPlaceholder'), content: ( - + {isSearching ? ( isVectorLoading || !isQueryReady ? ( @@ -199,7 +200,7 @@ function CatalogItemsScreen() { {t('catalog.searchCatalog')} )} - + ), }} /> diff --git a/apps/expo/features/packs/components/SearchResults.tsx b/apps/expo/features/packs/components/SearchResults.tsx index 965302dd47..5931267892 100644 --- a/apps/expo/features/packs/components/SearchResults.tsx +++ b/apps/expo/features/packs/components/SearchResults.tsx @@ -11,33 +11,30 @@ type SearchResultsProps = { export function SearchResults({ results, searchValue, onResultPress }: SearchResultsProps) { if (!searchValue) return null; - return ( - - {results.length > 0 ? ( - item.id} - renderItem={({ item }) => ( - onResultPress(item)} - className="flex-row items-center border-b border-border px-4 py-3 active:bg-muted" - > - - - - - {item.name} - {item.category} - - - - )} - /> - ) : ( - - No packs found for "{searchValue}" - + return results.length > 0 ? ( + item.id} + contentContainerClassName="pb-4" + renderItem={({ item }) => ( + onResultPress(item)} + className="flex-row items-center border-b border-border px-4 py-3 active:bg-muted" + > + + + + + {item.name} + {item.category} + + + )} + /> + ) : ( + + No packs found for "{searchValue}" ); } diff --git a/apps/expo/features/packs/screens/PackListScreen.tsx b/apps/expo/features/packs/screens/PackListScreen.tsx index af6ef3b4b8..b3ec1ba4b7 100644 --- a/apps/expo/features/packs/screens/PackListScreen.tsx +++ b/apps/expo/features/packs/screens/PackListScreen.tsx @@ -6,6 +6,7 @@ import { SegmentedControl, } from '@packrat/ui/nativewindui'; import { Icon } from 'expo-app/components/Icon'; +import { LargeTitleHeaderSearchContentContainer } from 'expo-app/components/LargeTitleHeaderSearchContentContainer'; import TabScreen from 'expo-app/components/TabScreen'; import { useAuth } from 'expo-app/features/auth/hooks/useAuth'; import { PackCard } from 'expo-app/features/packs/components/PackCard'; @@ -189,16 +190,20 @@ export function PackListScreen() { onChangeText(text) { setSearchValue(text); }, - content: searchValue ? ( - - ) : ( - - {t('packs.searchPacks')} - + content: ( + + {searchValue ? ( + + ) : ( + + {t('packs.searchPacks')} + + )} + ), }} rightView={() => ( diff --git a/apps/expo/features/trips/screens/TripListScreen.tsx b/apps/expo/features/trips/screens/TripListScreen.tsx index 3a1345307a..0dbb1e1b36 100644 --- a/apps/expo/features/trips/screens/TripListScreen.tsx +++ b/apps/expo/features/trips/screens/TripListScreen.tsx @@ -1,5 +1,6 @@ import { LargeTitleHeader, type LargeTitleSearchBarMethods } from '@packrat/ui/nativewindui'; import { Icon } from 'expo-app/components/Icon'; +import { LargeTitleHeaderSearchContentContainer } from 'expo-app/components/LargeTitleHeaderSearchContentContainer'; import TabScreen from 'expo-app/components/TabScreen'; import { useColorScheme } from 'expo-app/lib/hooks/useColorScheme'; import { useTranslation } from 'expo-app/lib/hooks/useTranslation'; @@ -108,9 +109,11 @@ export function TripsListScreen() { ref: asNonNullableRef(searchBarRef), onChangeText: setSearchValue, content: ( - - {t('trips.searchTrips')} - + + + {t('trips.searchTrips')} + + ), }} rightView={() => (