notificationPage.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import {
  2. View,
  3. Text,
  4. Pressable,
  5. Image,
  6. ScrollView,
  7. Alert,
  8. ImageBackground,
  9. ActivityIndicator,
  10. Dimensions
  11. } from 'react-native';
  12. import { SafeAreaView } from 'react-native-safe-area-context';
  13. import { router, useLocalSearchParams } from 'expo-router';
  14. import { CrossLogoSvg, PreviousPageBlackSvg } from '../../../../component/global/SVG';
  15. import { useEffect, useState } from 'react';
  16. import { chargeStationService } from '../../../../service/chargeStationService';
  17. import NotificationTabView from '../../../../component/global/notificationTabViewComponent';
  18. const NotificationPageComponent = () => {
  19. const screenHeight = Dimensions.get('window').height;
  20. const [loading, setLoading] = useState(false);
  21. const [loading1, setLoading1] = useState(false);
  22. const [reservationAfter2025, setReservationAfter2025] = useState([]);
  23. const [passingThisPromotionToBell, setPassingThisPromotionToBell] = useState([]);
  24. const fetchData = async () => {
  25. try {
  26. const results = await Promise.allSettled([
  27. chargeStationService.fetchReservationHistories(),
  28. chargeStationService.getAdvertise()
  29. ]);
  30. console.log('results', results);
  31. // Handle reservation data
  32. if (results[0].status === 'fulfilled') {
  33. const year2025 = new Date('2025-02-01T00:00:00.000Z');
  34. const reservationAfter2025 = results[0].value.filter((r: any) => {
  35. const date = new Date(r.createdAt);
  36. return date > year2025;
  37. });
  38. setReservationAfter2025(reservationAfter2025);
  39. } else if (results[0].status === 'rejected') {
  40. Alert.alert('Error fetching reservations:', results[0].reason);
  41. }
  42. // Handle promotion data
  43. if (results[1].status === 'fulfilled') {
  44. const passingThisPromotionToBell = results[1].value.filter((p: any) => p.is_show);
  45. setPassingThisPromotionToBell(passingThisPromotionToBell);
  46. } else if (results[1].status === 'rejected') {
  47. Alert.alert('Error fetching promotions:', results[1].reason);
  48. }
  49. } catch (error) {
  50. Alert.alert('Error fetching data');
  51. } finally {
  52. }
  53. }
  54. useEffect(() => {
  55. fetchData()
  56. }, [])
  57. return (
  58. <SafeAreaView className="flex-1 bg-white" edges={['top']}>
  59. <View style={{ minHeight: screenHeight, flex: 1 }} className="mx-[5%]">
  60. <View style={{ marginTop: 25 }}>
  61. <Pressable
  62. onPress={() => {
  63. if (router.canGoBack()) {
  64. router.back();
  65. } else {
  66. router.replace('/optionPage');
  67. }
  68. }}
  69. hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
  70. >
  71. <CrossLogoSvg />
  72. </Pressable>
  73. <Text style={{ fontSize: 45, marginVertical: 25 }}>通知</Text>
  74. </View>
  75. <View className="flex-1">
  76. <NotificationTabView
  77. titles={['充電資訊', '活動優惠']}
  78. reservationAfter2025={reservationAfter2025}
  79. passingThisPromotionToBell={passingThisPromotionToBell}
  80. />
  81. </View>
  82. </View>
  83. </SafeAreaView>
  84. );
  85. };
  86. export default NotificationPageComponent;