Skip to content

Commit cfdc67e

Browse files
committed
feat: add map tile layer provider to user settings
1 parent ebff151 commit cfdc67e

File tree

12 files changed

+344
-27
lines changed

12 files changed

+344
-27
lines changed

proto/api/v1/user_service.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ message UserSetting {
405405
// This references a CSS file in the web/public/themes/ directory.
406406
// If not set, the default theme will be used.
407407
string theme = 4 [(google.api.field_behavior) = OPTIONAL];
408+
// The user's map tile layer provider.
409+
string map_tile_layer_provider = 5 [(google.api.field_behavior) = OPTIONAL];
408410
}
409411

410412
// User authentication sessions configuration.

proto/gen/api/v1/user_service.pb.go

Lines changed: 16 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/gen/openapi.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3459,6 +3459,9 @@ components:
34593459
theme:
34603460
type: string
34613461
description: "The preferred theme of the user.\r\n This references a CSS file in the web/public/themes/ directory.\r\n If not set, the default theme will be used."
3462+
mapTileLayerProvider:
3463+
type: string
3464+
description: The user's map tile layer provider.
34623465
description: General user settings configuration.
34633466
UserSetting_SessionsSetting:
34643467
type: object

proto/gen/store/user_setting.pb.go

Lines changed: 15 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/store/user_setting.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ message GeneralUserSetting {
4141
// The user's theme preference.
4242
// This references a CSS file in the web/public/themes/ directory.
4343
string theme = 3;
44+
// The user's map tile layer provider.
45+
string map_tile_layer_provider = 4;
4446
}
4547

4648
message SessionsUserSetting {

server/router/api/v1/user_service.go

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -305,9 +305,10 @@ func (s *APIV1Service) DeleteUser(ctx context.Context, request *v1pb.DeleteUserR
305305

306306
func getDefaultUserGeneralSetting() *v1pb.UserSetting_GeneralSetting {
307307
return &v1pb.UserSetting_GeneralSetting{
308-
Locale: "en",
309-
MemoVisibility: "PRIVATE",
310-
Theme: "",
308+
Locale: "en",
309+
MemoVisibility: "PRIVATE",
310+
Theme: "",
311+
MapTileLayerProvider: "",
311312
}
312313
}
313314

@@ -390,9 +391,10 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda
390391
}
391392

392393
updatedGeneral := &v1pb.UserSetting_GeneralSetting{
393-
MemoVisibility: generalSetting.GetMemoVisibility(),
394-
Locale: generalSetting.GetLocale(),
395-
Theme: generalSetting.GetTheme(),
394+
MemoVisibility: generalSetting.GetMemoVisibility(),
395+
Locale: generalSetting.GetLocale(),
396+
Theme: generalSetting.GetTheme(),
397+
MapTileLayerProvider: generalSetting.GetMapTileLayerProvider(),
396398
}
397399

398400
// Apply updates for fields specified in the update mask
@@ -405,6 +407,8 @@ func (s *APIV1Service) UpdateUserSetting(ctx context.Context, request *v1pb.Upda
405407
updatedGeneral.Theme = incomingGeneral.Theme
406408
case "locale":
407409
updatedGeneral.Locale = incomingGeneral.Locale
410+
case "mapTileLayerProvider":
411+
updatedGeneral.MapTileLayerProvider = incomingGeneral.MapTileLayerProvider
408412
default:
409413
// Ignore unsupported fields
410414
}
@@ -1166,9 +1170,10 @@ func convertUserSettingFromStore(storeSetting *storepb.UserSetting, userID int32
11661170
if general := storeSetting.GetGeneral(); general != nil {
11671171
setting.Value = &v1pb.UserSetting_GeneralSetting_{
11681172
GeneralSetting: &v1pb.UserSetting_GeneralSetting{
1169-
Locale: general.Locale,
1170-
MemoVisibility: general.MemoVisibility,
1171-
Theme: general.Theme,
1173+
Locale: general.Locale,
1174+
MemoVisibility: general.MemoVisibility,
1175+
Theme: general.Theme,
1176+
MapTileLayerProvider: general.MapTileLayerProvider,
11721177
},
11731178
}
11741179
} else {
@@ -1254,9 +1259,10 @@ func convertUserSettingToStore(apiSetting *v1pb.UserSetting, userID int32, key s
12541259
if general := apiSetting.GetGeneralSetting(); general != nil {
12551260
storeSetting.Value = &storepb.UserSetting_General{
12561261
General: &storepb.GeneralUserSetting{
1257-
Locale: general.Locale,
1258-
MemoVisibility: general.MemoVisibility,
1259-
Theme: general.Theme,
1262+
Locale: general.Locale,
1263+
MemoVisibility: general.MemoVisibility,
1264+
Theme: general.Theme,
1265+
MapTileLayerProvider: general.MapTileLayerProvider,
12601266
},
12611267
}
12621268
} else {

web/src/components/LeafletMap.tsx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { MapPinIcon } from "lucide-react";
33
import { useEffect, useState } from "react";
44
import ReactDOMServer from "react-dom/server";
55
import { MapContainer, Marker, TileLayer, useMapEvents } from "react-leaflet";
6+
import { userStore } from "@/store";
67

78
const markerIcon = new DivIcon({
89
className: "relative border-none",
@@ -48,11 +49,22 @@ interface MapProps {
4849

4950
const DEFAULT_CENTER_LAT_LNG = new LatLng(48.8584, 2.2945);
5051

52+
// Create a mapping for common map tile providers. If the user-supplied mapTileLayerProvider is not in the map, use it directly as the tile layer URL.
53+
54+
const generalSetting = userStore.state.userGeneralSetting;
55+
5156
const LeafletMap = (props: MapProps) => {
5257
const position = props.latlng || DEFAULT_CENTER_LAT_LNG;
58+
// Default to OpenStreetMap if not set, otherwise use the set value as the URL
59+
let tileLayerUrl = "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png";
60+
const tileLayerProvider = generalSetting?.mapTileLayerProvider;
61+
if (tileLayerProvider && tileLayerProvider.trim() !== "") {
62+
tileLayerUrl = tileLayerProvider;
63+
}
64+
5365
return (
5466
<MapContainer className="w-full h-72" center={position} zoom={13} scrollWheelZoom={false}>
55-
<TileLayer url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" />
67+
<TileLayer url={tileLayerUrl} />
5668
<LocationMarker position={position} readonly={props.readonly} onChange={props.onChange ? props.onChange : () => {}} />
5769
</MapContainer>
5870
);

0 commit comments

Comments
 (0)