Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
351c224
Add 'show route on map' feature displaying the driveable route the se…
cosminpolifronie Aug 30, 2026
bc55017
Fix issue where LK537 would not be able to be used as route
cosminpolifronie Aug 30, 2026
ad25e38
Fix issue caused by Maków Podhalański having wrong coordinates will d…
cosminpolifronie Aug 30, 2026
829f204
Merge branch 'main' into train-route
cosminpolifronie Sep 18, 2026
1ee95f4
Re-work the preprocessing algorithm so the routing is more stable wit…
cosminpolifronie Sep 18, 2026
87eac0e
Add only selected train toggle
cosminpolifronie Sep 18, 2026
cd94fc2
Re-design the Follow Single Route toggles as inline so they take less…
cosminpolifronie Sep 18, 2026
617a120
Re-work the next signal area to occupy less vertical space
cosminpolifronie Sep 18, 2026
7998298
Move open in EDR button next to the train number to free up some vert…
cosminpolifronie Sep 18, 2026
9b75c1e
Move wagon count on the same line as the locomotive to free up vertic…
cosminpolifronie Sep 18, 2026
1af4d58
Further train panel looks improvements to make it as small as possibl…
cosminpolifronie Sep 18, 2026
0b66690
Add next signal information to hover panel
cosminpolifronie Sep 18, 2026
4e75492
Make arrows spacing uniform and less frequent
cosminpolifronie Sep 18, 2026
70e1d80
Fix train route retries and preferences
Julian-Louis Sep 20, 2026
2f3533e
Reduce train route rendering overhead
Julian-Louis Sep 20, 2026
6502da1
Polish train map controls
Julian-Louis Sep 20, 2026
642c1af
Remove temporary train route documentation
Julian-Louis Sep 20, 2026
b479a13
Remove excessive route comments
Julian-Louis Sep 20, 2026
baf6a82
Merge remote-tracking branch 'origin/main' into codex/pr-155-fixes
Julian-Louis Sep 20, 2026
a5f8c30
Polish upcoming signal status
Julian-Louis Sep 20, 2026
f22cb45
Fix PR formatting
Julian-Louis Sep 20, 2026
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,6 @@ next-env.d.ts

**/dist
.pnpm-store/

# generator cache
packages/map/scripts/.cache/
29 changes: 16 additions & 13 deletions packages/map/components/Map.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@ import Control from "react-leaflet-custom-control";

import NonPlayableStations from "@/components/NonPlayableStations";
import RemoteStations from "@/components/RemoteStations";
import SelectedTrainRoute from "@/components/SelectedTrainRoute";
import { TrainsList } from "@/components/TrainsList";

import { useSelectedTrain } from "../contexts/SelectedTrainContext";
Expand All @@ -42,6 +41,7 @@ import SelectedTrainPopup from "./SelectedTrainPopup";
import { MainlineSignals, OtherSignals } from "./Signals";
import SneakpeekMarkers from "./Sneakpeeks";
import SpotlightSearch from "./SpotlightSearch";
import TrainRoute from "./TrainRoute";

import style from "../styles/BottomLeftControls.module.css";
import mapStyles from "../styles/Map.module.css";
Expand Down Expand Up @@ -99,15 +99,17 @@ const LeaftletMap = ({ serverId }: MapProps) => {
defaultValue: true,
});

const [showSignalInfo, setShowSignalInfo] = useLocalStorage({
key: "showSignalInfo",
defaultValue: true,
});

const [isSatellite, setIsSatellite] = useLocalStorage({
key: "isSatellite",
defaultValue: false,
});
const {
selectedTrain,
setSelectedTrain,
followTrain,
showSignalInfo,
setShowSignalInfo,
} = useSelectedTrain();

const { toggle: toggleFullscreen, fullscreen } = useFullscreen();
const FullscreenIcon = fullscreen ? MdFullscreenExit : MdFullscreen;
Expand All @@ -118,7 +120,6 @@ const LeaftletMap = ({ serverId }: MapProps) => {
renderPopup === true ? MdSpeakerNotes : MdSpeakerNotesOff;
const SatelliteIcon = isSatellite === true ? MdSatellite : MdSatelliteAlt;

const { selectedTrain, setSelectedTrain } = useSelectedTrain();
const [stations, setStations] = useState<Station[] | null>(null);
const [stoppedTrainsSince, setStoppedTrainsSince] = useState<
Record<string, number>
Expand Down Expand Up @@ -201,12 +202,14 @@ const LeaftletMap = ({ serverId }: MapProps) => {
if (updatedTrain !== selectedTrain) {
setSelectedTrain(updatedTrain);
}
map.panTo(
[updatedTrain.TrainData.Latititute, updatedTrain.TrainData.Longitute],
{ animate: true, duration: 0.8, easeLinearity: 0.4 },
);
if (followTrain) {
map.panTo(
[updatedTrain.TrainData.Latititute, updatedTrain.TrainData.Longitute],
{ animate: true, duration: 0.8, easeLinearity: 0.4 },
);
}
}
}, [trains, selectedTrain, map, setSelectedTrain]);
}, [trains, selectedTrain, map, setSelectedTrain, followTrain]);

useEffect(() => {
if (trainId) {
Expand Down Expand Up @@ -313,7 +316,6 @@ const LeaftletMap = ({ serverId }: MapProps) => {
preferCanvas={true}
>
<MapZoomAppearance />
<SelectedTrainRoute serverId={String(serverId)} stations={stations} />
<Control position="bottomleft">
<div className={style.container}>
<Tooltip label="Our GitHub" position="right">
Expand Down Expand Up @@ -560,6 +562,7 @@ const LeaftletMap = ({ serverId }: MapProps) => {
</LayerGroup>
</LayersControl.Overlay>
</LayersControl>
<TrainRoute />
<SpotlightSearch stations={stations} trains={trains} />
</MapContainer>
</>
Expand Down
36 changes: 21 additions & 15 deletions packages/map/components/Markers/TrainMarker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,25 @@ import ReactLeafletDriftMarker from "react-leaflet-drift-marker";

import { getSteamProfileOrBot } from "@/components/steam";

import { useSelectedTrain } from "../../contexts/SelectedTrainContext";
import TrainText from "../TrainText";

type TrainMarkerProps = {
train: Train;
stoppedSince?: number;
isSelected: boolean;
selectTrain: (train: Train) => void;
};

const TrainMarker = ({ train, stoppedSince }: TrainMarkerProps) => {
const { selectedTrain, setSelectedTrain } = useSelectedTrain();

const TrainMarker = ({
train,
stoppedSince,
isSelected,
selectTrain,
}: TrainMarkerProps) => {
const [avatar, setAvatar] = useState<string | null>(null);
const [username, setUsername] = useState<string | null>(null);
const [bearing, setBearing] = useState<number | null>(null);
const [isPopupOpen, setIsPopupOpen] = useState(false);
const previousPosition = useRef<[number, number] | null>(null);

useEffect(() => {
Expand Down Expand Up @@ -84,9 +89,6 @@ const TrainMarker = ({ train, stoppedSince }: TrainMarkerProps) => {
const borderAreaClass = train.TrainData.InBorderStationArea
? " in-border-area"
: "";
const isSelected =
(selectedTrain?.id ?? selectedTrain?.TrainNoLocal) ===
(train.id ?? train.TrainNoLocal);
const avatarUrl =
train.TrainData.ControlledBySteamID && avatar ? avatar : botIcon;
const escapedAvatarUrl = avatarUrl.replace(
Expand Down Expand Up @@ -125,17 +127,21 @@ const TrainMarker = ({ train, stoppedSince }: TrainMarkerProps) => {
eventHandlers={{
mouseover: (event) => event.target.openPopup(),
mouseout: (event) => event.target.closePopup(),
mouseup: () => setSelectedTrain(train),
mouseup: () => selectTrain(train),
popupopen: () => setIsPopupOpen(true),
popupclose: () => setIsPopupOpen(false),
}}
>
<Popup className="train-map-popup" minWidth={280}>
<TrainText
train={train}
username={username}
avatar={avatar}
minified={true}
stoppedSince={stoppedSince}
/>
{isPopupOpen && (
<TrainText
train={train}
username={username}
avatar={avatar}
minified={true}
stoppedSince={stoppedSince}
/>
)}
</Popup>

<Tooltip
Expand Down
180 changes: 0 additions & 180 deletions packages/map/components/SelectedTrainRoute.tsx

This file was deleted.

Loading
Loading