notificationPage.tsx 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 [reservationAfter2025, setReservationAfter2025] = useState([]);
  21. const [passingThisPromotionToBell, setPassingThisPromotionToBell] = useState([]);
  22. const fetchData = async () => {
  23. try {
  24. const results = await Promise.allSettled([
  25. chargeStationService.fetchReservationHistories(),
  26. chargeStationService.getAdvertise()
  27. ]);
  28. // Handle reservation data
  29. if (results[0].status === 'fulfilled') {
  30. const year2025 = new Date('2025-02-01T00:00:00.000Z');
  31. const reservationAfter2025 = results[0].value.filter((r: any) => {
  32. const date = new Date(r.createdAt);
  33. return date > year2025;
  34. });
  35. setReservationAfter2025(reservationAfter2025);
  36. } else if (results[0].status === 'rejected') {
  37. Alert.alert('Error fetching reservations:', results[0].reason);
  38. }
  39. // Handle promotion data
  40. if (results[1].status === 'fulfilled') {
  41. const passingThisPromotionToBell = results[1].value.filter((p: any) => p.is_show);
  42. setPassingThisPromotionToBell(passingThisPromotionToBell);
  43. } else if (results[1].status === 'rejected') {
  44. Alert.alert('Error fetching promotions:', results[1].reason);
  45. }
  46. } catch (error) {
  47. console.log('Error fetching data');
  48. } finally {
  49. }
  50. };
  51. useEffect(() => {
  52. fetchData();
  53. }, []);
  54. return (
  55. <SafeAreaView className="flex-1 bg-white" edges={['top', 'left', 'right']}>
  56. <View style={{ minHeight: screenHeight, flex: 1 }}>
  57. <View className="mx-[5%]" style={{ marginTop: 25 }}>
  58. <Pressable
  59. onPress={() => {
  60. if (router.canGoBack()) {
  61. router.back();
  62. } else {
  63. router.replace('/optionPage');
  64. }
  65. }}
  66. hitSlop={{ top: 20, bottom: 20, left: 20, right: 20 }}
  67. >
  68. <CrossLogoSvg />
  69. </Pressable>
  70. <Text style={{ fontSize: 45, marginVertical: 25 }}>通知</Text>
  71. </View>
  72. <View className="flex-1">
  73. <NotificationTabView
  74. titles={['充電資訊', '活動優惠']}
  75. reservationAfter2025={reservationAfter2025}
  76. passingThisPromotionToBell={passingThisPromotionToBell}
  77. />
  78. </View>
  79. </View>
  80. </SafeAreaView>
  81. );
  82. };
  83. export default NotificationPageComponent;