mirror of https://gitlab.com/m3f_usm/SmartStopAPK
243 lines
5.8 KiB
TypeScript
243 lines
5.8 KiB
TypeScript
import {ActivityIndicator, StyleSheet, View} from 'react-native';
|
|
import Container from '../components/Container';
|
|
import Header from '../components/Header';
|
|
import {Text} from 'react-native';
|
|
import useDevices, {Status} from '../../infraestructure/hooks/useDevices';
|
|
import Banner from '../components/Banner';
|
|
import {useEffect, useState} from 'react';
|
|
import remoteConfig from '@react-native-firebase/remote-config';
|
|
import RemoteConfigKeys from '../../utils/RemoteConfigKeys';
|
|
|
|
export interface Line {
|
|
lineNumber: string;
|
|
lineLetter: string;
|
|
letterColor: string;
|
|
backgroundColor: string;
|
|
estimatedArrivalTimeInMinutes: string;
|
|
lineDescription: string;
|
|
}
|
|
|
|
interface TableProps {
|
|
data: Line[];
|
|
}
|
|
|
|
const Table = ({data}: TableProps) => {
|
|
const rows = 7;
|
|
const columns = 3;
|
|
|
|
const baseTableData: Line[][] = Array.from({length: rows}, () =>
|
|
new Array(columns).fill({
|
|
lineNumber: '',
|
|
lineLetter: '',
|
|
letterColor: '',
|
|
backgroundColor: '',
|
|
estimatedArrivalTimeInMinutes: '',
|
|
}),
|
|
);
|
|
|
|
data.map((item, index) => {
|
|
const row = Math.floor(index / columns);
|
|
const column = index % columns;
|
|
baseTableData[row][column] = item;
|
|
});
|
|
|
|
return (
|
|
<View style={tableStyles.table}>
|
|
{baseTableData.map((row, rowIndex) => (
|
|
<View key={rowIndex} style={tableStyles.row}>
|
|
{row.map((cell, cellIndex) => {
|
|
if (cell.lineNumber === '') {
|
|
return <View style={tableStyles.cell} key={cellIndex} />;
|
|
}
|
|
|
|
const [first, second] = cell.lineDescription.split('-');
|
|
|
|
return (
|
|
<View style={[tableStyles.cell]} key={cellIndex}>
|
|
<View style={tableStyles.lineInformationContainer}>
|
|
<Text style={tableStyles.lineNumber}>{cell.lineNumber}</Text>
|
|
<View
|
|
style={[
|
|
tableStyles.letterContainer,
|
|
{backgroundColor: `#${cell.backgroundColor}` || 'grey'},
|
|
]}>
|
|
<Text style={tableStyles.lineLetter}>
|
|
{cell.lineLetter}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
<View
|
|
style={[
|
|
tableStyles.timeContainer,
|
|
{backgroundColor: `#${cell.backgroundColor}` || 'grey'},
|
|
]}>
|
|
<Text style={tableStyles.time} numberOfLines={1}>
|
|
{first}
|
|
</Text>
|
|
<Text style={tableStyles.time} numberOfLines={1}>
|
|
{second}
|
|
</Text>
|
|
<Text style={tableStyles.time}>
|
|
{cell.estimatedArrivalTimeInMinutes}
|
|
</Text>
|
|
</View>
|
|
</View>
|
|
);
|
|
})}
|
|
</View>
|
|
))}
|
|
</View>
|
|
);
|
|
};
|
|
|
|
const BusStopInfoScreen = () => {
|
|
const {
|
|
state: {status, displayedLines, stopName},
|
|
} = useDevices();
|
|
const [isLoading, setIsLoading] = useState(true);
|
|
const image = remoteConfig().getString(RemoteConfigKeys.HEADER_IMAGE_URL);
|
|
|
|
useEffect(() => {
|
|
const init = async () => {
|
|
await remoteConfig().setConfigSettings({
|
|
minimumFetchIntervalMillis: 3600000,
|
|
});
|
|
|
|
await remoteConfig().setDefaults({
|
|
BASE_URL: '',
|
|
HEADER_IMAGE_URL: '',
|
|
UPDATE_INTERVAL: 0,
|
|
USER: '',
|
|
PASS: '',
|
|
});
|
|
|
|
const isActivated = await remoteConfig().fetchAndActivate();
|
|
|
|
if (isActivated) {
|
|
setIsLoading(false);
|
|
}
|
|
};
|
|
|
|
init();
|
|
}, []);
|
|
|
|
const splitStopName = stopName.split('-');
|
|
let title = splitStopName[0] ? `${splitStopName[0].trim()}` : '';
|
|
const subTitle = splitStopName[1] ? `${splitStopName[1].trim()}` : '';
|
|
|
|
if (isLoading) {
|
|
return (
|
|
<Container style={styles.container}>
|
|
<ActivityIndicator />
|
|
</Container>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<Container style={styles.container}>
|
|
<Header
|
|
style={styles.headerContainer}
|
|
subTitle={subTitle}
|
|
title={title}
|
|
image={image}
|
|
/>
|
|
<Banner
|
|
style={styles.bannerContainer}
|
|
text="Buses que se detienen en esta parada"
|
|
/>
|
|
|
|
<View style={styles.bodyContainer}>
|
|
{status === Status.LOADING ? (
|
|
<ActivityIndicator />
|
|
) : (
|
|
<Table data={displayedLines} />
|
|
)}
|
|
</View>
|
|
<View style={styles.footerContainer}>
|
|
{/* {TODO implement footer} */}
|
|
</View>
|
|
</Container>
|
|
);
|
|
};
|
|
|
|
const styles = StyleSheet.create({
|
|
container: {
|
|
justifyContent: 'center',
|
|
},
|
|
headerContainer: {
|
|
flex: 1.5,
|
|
backgroundColor: 'orange',
|
|
},
|
|
bannerContainer: {
|
|
flex: 0.5,
|
|
backgroundColor: 'grey',
|
|
},
|
|
bodyContainer: {
|
|
flex: 10,
|
|
justifyContent: 'center',
|
|
},
|
|
busContainer: {
|
|
backgroundColor: 'brown',
|
|
flexDirection: 'column',
|
|
},
|
|
footerContainer: {
|
|
flex: 1,
|
|
backgroundColor: 'grey',
|
|
},
|
|
});
|
|
|
|
const tableStyles = StyleSheet.create({
|
|
table: {
|
|
flex: 1,
|
|
backgroundColor: 'white',
|
|
},
|
|
row: {
|
|
flex: 1,
|
|
flexDirection: 'row',
|
|
},
|
|
cell: {
|
|
flex: 1,
|
|
borderWidth: 1,
|
|
flexDirection: 'column',
|
|
borderColor: 'grey',
|
|
},
|
|
lineInformationContainer: {
|
|
flex: 1,
|
|
flexDirection: 'row',
|
|
justifyContent: 'center',
|
|
alignItems: 'center',
|
|
},
|
|
timeContainer: {
|
|
alignItems: 'center',
|
|
backgroundColor: 'blue',
|
|
},
|
|
lineNumber: {
|
|
fontSize: 20,
|
|
marginRight: 8,
|
|
fontWeight: 'bold',
|
|
color: 'grey',
|
|
},
|
|
lineLetter: {
|
|
fontSize: 14,
|
|
color: 'white',
|
|
fontWeight: 'bold',
|
|
},
|
|
letterContainer: {
|
|
paddingHorizontal: 16,
|
|
paddingVertical: 8,
|
|
borderRadius: 50,
|
|
},
|
|
time: {
|
|
fontSize: 12,
|
|
fontWeight: 'bold',
|
|
color: 'white',
|
|
},
|
|
lineDescription: {
|
|
fontSize: 12,
|
|
fontWeight: 'bold',
|
|
color: 'white',
|
|
},
|
|
});
|
|
|
|
export default BusStopInfoScreen;
|