IPFilter.tsx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { Images } from '@/constants/images';
  2. import { IPItem } from '@/services/award';
  3. import React from 'react';
  4. import { ImageBackground, ScrollView, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
  5. // 小程序 item 宽度 174rpx = 87pt, 高度 84rpx = 42pt
  6. const ITEM_WIDTH = 87;
  7. const ITEM_HEIGHT = 42;
  8. interface IPFilterProps {
  9. data: IPItem[];
  10. activeIndex: number;
  11. onSelect?: (item: IPItem, index: number) => void;
  12. }
  13. export function IPFilter({ data, activeIndex, onSelect }: IPFilterProps) {
  14. return (
  15. <View style={styles.container}>
  16. <ScrollView
  17. horizontal
  18. showsHorizontalScrollIndicator={false}
  19. contentContainerStyle={styles.content}
  20. >
  21. {data.map((item, index) => (
  22. <TouchableOpacity
  23. key={item.id || index}
  24. activeOpacity={0.7}
  25. onPress={() => onSelect?.(item, index)}
  26. style={styles.itemWrapper}
  27. >
  28. <ImageBackground
  29. source={{ uri: activeIndex === index ? Images.home.typeBgOn : Images.home.typeBg }}
  30. style={styles.item}
  31. resizeMode="cover"
  32. >
  33. <Text style={styles.text} numberOfLines={1}>
  34. {item.name}
  35. </Text>
  36. </ImageBackground>
  37. </TouchableOpacity>
  38. ))}
  39. </ScrollView>
  40. </View>
  41. );
  42. }
  43. const styles = StyleSheet.create({
  44. container: {
  45. width: '100%',
  46. paddingTop: 10,
  47. },
  48. content: {
  49. paddingHorizontal: 8,
  50. },
  51. itemWrapper: {
  52. marginHorizontal: 8,
  53. },
  54. item: {
  55. width: ITEM_WIDTH,
  56. height: ITEM_HEIGHT,
  57. justifyContent: 'center',
  58. alignItems: 'center',
  59. paddingTop: 3,
  60. },
  61. text: {
  62. fontWeight: 'bold',
  63. fontSize: 16,
  64. color: '#fff',
  65. textShadowColor: '#000',
  66. textShadowOffset: { width: 1, height: 1 },
  67. textShadowRadius: 1,
  68. },
  69. });