bookingMenuPage.tsx 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { View, Text, StyleSheet, ScrollView, Dimensions, ActivityIndicator, RefreshControl } from 'react-native';
  2. import TabViewComponent, { TabItem } from '../global/tabView';
  3. import NormalButton from '../global/normal_button';
  4. import { SafeAreaView } from 'react-native-safe-area-context';
  5. import RecentlyBookedScrollView from '../global/recentlyBookedScrollView';
  6. import { router } from 'expo-router';
  7. import { useCallback, useEffect, useMemo, useState } from 'react';
  8. import { chargeStationService } from '../../service/chargeStationService';
  9. import { calculateDistance } from '../global/distanceCalculator';
  10. import React from 'react';
  11. import BookingTabViewComponent from '../global/bookingTabViewComponent';
  12. interface BookingMenuPageProps {}
  13. const BookingMenuPageComponent: React.FC<BookingMenuPageProps> = () => {
  14. // console.log('BookingMenuPageComponent rendering');
  15. const [refreshing, setRefreshing] = useState(false);
  16. const [refetchTrigger, setRefetchTrigger] = useState(0);
  17. const calculateResponsivePadding = useCallback(() => {
  18. const screenHeight = Dimensions.get('window').height;
  19. return screenHeight * 0.03;
  20. }, []);
  21. const calculateTabViewHeight = useCallback(() => {
  22. const screenHeight = Dimensions.get('window').height;
  23. if (screenHeight > 800) return 500;
  24. else if (screenHeight > 550) return 300;
  25. else return 150;
  26. }, []);
  27. const onRefresh = useCallback(() => {
  28. setRefreshing(true);
  29. setRefetchTrigger((prev) => prev + 1);
  30. // Simulate a delay to show the refresh indicator
  31. setTimeout(() => {
  32. setRefreshing(false);
  33. }, 1000);
  34. }, []);
  35. return (
  36. <SafeAreaView edges={['top', 'left', 'right']} className="flex-1 bg-white">
  37. <ScrollView
  38. className="flex-1 mt-8"
  39. nestedScrollEnabled={true}
  40. showsVerticalScrollIndicator={false}
  41. refreshControl={
  42. <RefreshControl
  43. refreshing={refreshing}
  44. onRefresh={onRefresh}
  45. colors={['#34657b']} // Android
  46. tintColor="#34657b" // iOS
  47. />
  48. }
  49. >
  50. <View className="mx-[5%]">
  51. <View>
  52. <Text className="text-5xl pt-1 pb-6">預約</Text>
  53. <NormalButton
  54. title={<Text style={{ color: 'white', fontSize: 16, fontWeight: '800' }}>+ 新增預約</Text>}
  55. onPress={() => router.push('reservationLocationPage')}
  56. extendedStyle={{ padding: calculateResponsivePadding() }}
  57. />
  58. </View>
  59. <RecentlyBookedScrollView />
  60. </View>
  61. <View className="flex-1" style={{ height: calculateTabViewHeight() }}>
  62. <BookingTabViewComponent titles={['已預約', '已完成']} refetchTrigger={refetchTrigger} />
  63. {/* <TabViewComponent
  64. titles={['已預約', '已完成']}
  65. tabItems={tabItems}
  66. isLoading={isLoading}
  67. completedReservationTabItems={completedReservationTabItems}
  68. /> */}
  69. </View>
  70. </ScrollView>
  71. </SafeAreaView>
  72. );
  73. };
  74. export default React.memo(BookingMenuPageComponent);