Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🚀 Feat: Horário de funcionamento #104

Merged
merged 1 commit into from
Mar 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
"@turf/turf": "^6.5.0",
"@yudiel/react-qr-scanner": "^1.1.9",
"axios": "^1.1.3",
"date-fns": "^3.3.1",
"leaflet": "^1.9.3",
"leaflet-control-geocoder": "^2.4.0",
"react": "^18.2.0",
Expand Down
29 changes: 24 additions & 5 deletions src/components/InfoCard/InfoCard.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { TripContext } from '../../hooks/getTrips'
import { RoutesContext } from '../../hooks/getRoutes'
import { GPSContext } from "../../hooks/getGPS"
import { ServiceIdContext } from "../../hooks/getServiceId"
import { format, parse, addDays } from "date-fns"



Expand Down Expand Up @@ -69,6 +70,19 @@ export function InfoCard() {
);
}
}, [plataforms])
function convertTime(timeString) {
const [hoursStr, minutesStr] = timeString.split(':');
const hours = parseInt(hoursStr, 10);
const minutes = parseInt(minutesStr, 10);

if (hours >= 24) {
const baseDate = new Date('1970-01-01');
const newDate = addDays(baseDate, Math.floor(hours / 24));
return parse(`${format(newDate, 'yyyy-MM-dd')} ${hours % 24}:${minutes}:00`, 'yyyy-MM-dd HH:mm:ss', new Date());
} else {
return parse(`1970-01-01 ${hours}:${minutes}:00`, 'yyyy-MM-dd HH:mm:ss', new Date());
}
}

return (

Expand Down Expand Up @@ -108,7 +122,7 @@ export function InfoCard() {
strokeWidthSecondary={4}

/> : sortedPlatforms.map((e) => Object.values(e).map((values) => {
return <li key={Object.keys(values)[0]} className='flex justify-between border-b py-2.5' onClick={() => { getMultiplePages(`/stop_times/?stop_id=${Object.keys(values)[0]}&service_id=${serviceId}`), infoLinha(), setSelectedPlatform(Object.keys(values)), activateLoader(), setGpsUrl('?stop_id=' + Object.keys(values)[0]), multiModalTheme(Object.values(values)[0].trip_id.route_id.route_type) }}>
return <li key={Object.keys(values)[0]} className='flex justify-between border-b py-4' onClick={() => { getMultiplePages(`/stop_times/?stop_id=${Object.keys(values)[0]}&service_id=${serviceId}`), infoLinha(), setSelectedPlatform(Object.keys(values)), activateLoader(), setGpsUrl('?stop_id=' + Object.keys(values)[0]), multiModalTheme(Object.values(values)[0].trip_id.route_id.route_type) }}>
<div className={styles.routeName}>
{!Object.values(values)[0].isConvencionais ? <>
<div className={` ${styles.shortName} + bg-[#F8AC04]`}>
Expand Down Expand Up @@ -144,9 +158,9 @@ export function InfoCard() {
/>

: arrivals.map((e) => {
return <li key={e.id} onClick={() => setTrip({ trip_id: e.trip_id, smallestEtas: e.smallestEtas, stop_sequence: e.stop_sequence, frequencies: e.closestStartTime })} className="flex justify-between border-b py-2.5">
return <li key={e.id} onClick={() => setTrip({ trip_id: e.trip_id, smallestEtas: e.smallestEtas, stop_sequence: e.stop_sequence, frequencies: e.closestStartTime })} className="flex justify-between border-b py-4">
<div className={styles.routeName}>
<div className="flex">
<div className="flex max-h-[24px]">
<div className={` ${styles.shortName} ${e.trip_id.route_id.route_type === 702 ? 'bg-[#F8AC04]' :'bg-[#004a80]' }`}>
{e.trip_id.route_id.route_type === 702 ?<><img src={bus} alt="" />
<p className='ml-2 font-semibold leading-none'>{e.trip_id.trip_short_name}</p>
Expand All @@ -157,7 +171,12 @@ export function InfoCard() {
</>
}
</div>
<p className="text-sm ml-2.5">{e.trip_id?.trip_headsign ?? 'Circular'}</p>
<div className="flex flex-col ml-2.5">
<p className="text-sm">{e.trip_id?.trip_headsign ?? 'Circular'}</p>
<p className="text-xs">
Funcionamento: {format(convertTime(e.start_time), 'HH:mm')} - {format(convertTime(e.end_time), 'HH:mm')}
</p>
</div>
</div>

</div>
Expand Down Expand Up @@ -221,7 +240,7 @@ export function InfoCard() {
strokeWidthSecondary={4}

/></> : routesAndFrequencies.map((e) => {
return <li key={e.id} onClick={() => setTrip({trip_id: e.trip_id})} className="flex justify-between border-b py-2.5">
return <li key={e.id} onClick={() => setTrip({trip_id: e.trip_id})} className="flex justify-between border-b py-4">
<div className={`${styles.routeName} + flex`}>
<div className={` ${styles.shortName} + bg-[#004a80]`}>
<img src={busSppo} alt="" />
Expand Down
160 changes: 74 additions & 86 deletions src/hooks/getMovingMarkers.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -94,56 +94,33 @@ export function MovingMarkerProvider({ children }) {
}, [realtime]);


let frequenciesList = [];
async function getallFrequencies(url) {
const fetchTime = new Date();
const fetchHour = fetchTime.getHours();
const fetchMinute = fetchTime.getMinutes();
const fetchSecond = fetchTime.getSeconds();

try {
const { data } = await api.get(url);

const filteredData = await Promise.all(
data.results.map(async (item) => {
const startTime = item.start_time.split(":").map(Number);
const endTime = item.end_time.split(":").map(Number);
const tripTimesMap = {};

if (locationType === 1) {
if (
endTime[0] > fetchHour ||
(endTime[0] === fetchHour && endTime[1] > fetchMinute) ||
(endTime[0] === fetchHour &&
endTime[1] === fetchMinute &&
endTime[2] > fetchSecond)
) {
frequenciesList.push(item)
}
} else {
if (
(startTime[0] < fetchHour ||
(startTime[0] === fetchHour && startTime[1] < fetchMinute) ||
(startTime[0] === fetchHour &&
startTime[1] === fetchMinute &&
startTime[2] < fetchSecond)) &&
(endTime[0] > fetchHour ||
(endTime[0] === fetchHour && endTime[1] > fetchMinute) ||
(endTime[0] === fetchHour &&
endTime[1] === fetchMinute &&
endTime[2] > fetchSecond))
) {

frequenciesList.push(item)
}
data.results.forEach(item => {
const { trip_id, start_time, end_time } = item;
const { trip_short_name } = trip_id;

if (!tripTimesMap[trip_short_name]) {
tripTimesMap[trip_short_name] = {
...item,
start_time: item.start_time,
end_time: item.end_time,
};
} else {
if (start_time < tripTimesMap[trip_short_name].start_time) {
tripTimesMap[trip_short_name].start_time = start_time;
}
if (end_time > tripTimesMap[trip_short_name].end_time) {
tripTimesMap[trip_short_name].end_time = end_time;
}
})
);
}
});

if (data.next) {
await getallFrequencies(data.next);
} else {
setFrequencies([...frequenciesList]);
}
setFrequencies(Object.values(tripTimesMap));
} catch (error) {
console.error(error);
}
Expand All @@ -152,68 +129,80 @@ export function MovingMarkerProvider({ children }) {




useEffect(() => {
if (routes) {
if (locationType === 1) {
const tripsList = routes
.filter((i) => i.stop_sequence === 0)
// .filter((i) => i.stop_sequence === 0)
.map((i) => i.trip_id.trip_short_name)
getallFrequencies(`/frequencies/?trip_short_name=${tripsList}&service_id=${serviceId}`)
} else {
getallFrequencies(`/frequencies/?&stop_id=${stopId}&service_id=${serviceId}&show_all=true`)
}
}
}, [routes])
useEffect(() => {
if (routes && frequencies) {
const filteredFrequenciesList = routes.reduce((acc, obj1) => {
const matched = frequencies.filter((obj2) => {
return (
obj1.trip_id.trip_short_name === obj2.trip_id.trip_short_name &&
serviceId.includes(obj2.trip_id.service_id)
);



useEffect(() => {
if (routes && frequencies) {
const filteredFrequenciesList = routes.reduce((acc, obj1) => {
const matched = frequencies.filter((obj2) => {
return (
obj1.trip_id.trip_short_name === obj2.trip_id.trip_short_name &&
serviceId.includes(obj2.trip_id.service_id)
);
});
const combinedHeadways = matched.reduce((headwaysAcc, freq) => {
const headways = calculateHeadwayUntilEndTime(freq.start_time, freq.end_time, freq.headway_secs, freq.trip_id.shape_id, freq.trip_id.trip_id, freq.trip_id.direction_id);
return headwaysAcc.concat(headways);
}, []).sort((a, b) => a.start_time.localeCompare(b.start_time));

const currentTime = new Date().toLocaleString('en-US', { timeZone: 'America/Sao_Paulo', hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });
const filteredObj = { ...obj1, closestStartTime: null, start_time: matched[0].start_time ?? null, end_time: matched[0].end_time ?? null };

if (combinedHeadways.length > 0) {


const closestStartTime = combinedHeadways.find((headway) => {
if (locationType === 1) {
return headway.start_time > currentTime;
} else {
return headway.end_time > currentTime;
}
});
const combinedHeadways = matched.reduce((headwaysAcc, freq) => {
const headways = calculateHeadwayUntilEndTime(freq.start_time, freq.end_time, freq.headway_secs, freq.trip_id.shape_id, freq.trip_id.trip_id, freq.trip_id.direction_id);
return headwaysAcc.concat(headways);
}, []).sort((a, b) => a.start_time.localeCompare(b.start_time));

const currentTime = new Date().toLocaleString('en-US', { timeZone: 'America/Sao_Paulo', hour12: false, hour: '2-digit', minute: '2-digit', second: '2-digit' });
const filteredObj = { ...obj1, closestStartTime: null };
if (combinedHeadways.length > 0) {
const closestStartTime = combinedHeadways.find((headway) => {
if (locationType === 1) {
return headway.start_time > currentTime;
} else {
return headway.end_time > currentTime;
}
});

if (closestStartTime) {
filteredObj.closestStartTime = closestStartTime.start_time.slice(0, -3);
if (locationType === 0) {
filteredObj.trip_id.shape_id = closestStartTime.shape_id;
filteredObj.trip_id.trip_id = closestStartTime.trip_id;
filteredObj.trip_id.direction_id = closestStartTime.direction_id;
}

if (closestStartTime) {
filteredObj.closestStartTime = closestStartTime.start_time.slice(0, -3);
if (locationType === 0) {
filteredObj.trip_id.shape_id = closestStartTime.shape_id;
filteredObj.trip_id.trip_id = closestStartTime.trip_id;
filteredObj.trip_id.direction_id = closestStartTime.direction_id;
}
}
}

if (locationType === 1) {
if (filteredObj.lastStop.stop_id.stop_id !== selectedPlatform[0]) {
acc.push(filteredObj);
}
} else {

if (locationType === 1) {
if (filteredObj.lastStop.stop_id.stop_id !== selectedPlatform[0]) {
acc.push(filteredObj);
}
} else {
acc.push(filteredObj);
}

return acc;
}, []);
console.log(filteredFrequenciesList)

setRoutesAndFrequencies(filteredFrequenciesList);
}
}, [tracked, frequencies]);



return acc;
}, []);

setRoutesAndFrequencies(filteredFrequenciesList);
}
}, [tracked, frequencies]);



Expand Down Expand Up @@ -276,7 +265,6 @@ export function MovingMarkerProvider({ children }) {
}
return obj1;
});

setArrivals(arrivals);
}
}, [tracked, routesAndFrequencies]);
Expand Down
Loading
Loading