| [Inject] | [Inject] | ||||
| private OnlineStatusProvider OnlineStatusProvider { get; init; } | private OnlineStatusProvider OnlineStatusProvider { get; init; } | ||||
| [Inject] | |||||
| private PermissionsProvider PermissionsProvider { get; init; } | |||||
| private NominatimService NominatimService { get; set; } | private NominatimService NominatimService { get; set; } | ||||
| } | } | ||||
| protected async Task<LatLng> GetDeviceGeoLocation() { | protected async Task<LatLng> GetDeviceGeoLocation() { | ||||
| LatLng geoPosition; | |||||
| BlazorGeolocationPosition position = await this.BlazorGeolocationService.GetPositionAsync(); | |||||
| if (position.ErrorCode != null) { | |||||
| Toaster.ShowError(I18n.GetString("Error.GeoLocation.Title", position.ErrorCode), I18n.GetString("Error.GeoLocation.Msg", position.ErrorMessage)); | |||||
| geoPosition = new(0, 0); | |||||
| LatLng geoPosition = new(46.80121, 8.22669); // Centered on Swiss | |||||
| if (PermissionsProvider.IsGeoLocationAllowed) { | |||||
| BlazorGeolocationPosition position = await this.BlazorGeolocationService.GetPositionAsync(); | |||||
| if (position.ErrorCode != null) { | |||||
| Toaster.ShowError(I18n.GetString("Error.GeoLocation.Title", position.ErrorCode), I18n.GetString("Error.GeoLocation.Msg", position.ErrorMessage)); | |||||
| } else { | |||||
| geoPosition = new((double)position.Latitude, (double)position.Longitude); | |||||
| } | |||||
| } else { | } else { | ||||
| geoPosition = new((double)position.Latitude, (double)position.Longitude); | |||||
| Toaster.ShowWarning(I18n.GetString("Warning.Permission.GeoLocation.Title"), I18n.GetString("Warning.Permission.GeoLocation.Msg")); | |||||
| } | } | ||||
| return geoPosition; | return geoPosition; | ||||
| } | } | ||||
| if (this.devicePositionMarker != null) { | if (this.devicePositionMarker != null) { | ||||
| await devicePositionMarker.Remove(); | await devicePositionMarker.Remove(); | ||||
| } | } | ||||
| this.devicePositionMarker = await this.MarkerFactory.CreateAndAddToMap(geoPosition, this.mapRef); | |||||
| await this.mapRef.SetZoom(16); | |||||
| if (PermissionsProvider.IsGeoLocationAllowed) { | |||||
| this.devicePositionMarker = await this.MarkerFactory.CreateAndAddToMap(geoPosition, this.mapRef); | |||||
| await this.mapRef.SetZoom(16); | |||||
| } else { | |||||
| await this.mapRef.SetZoom(6); | |||||
| } | |||||
| await this.mapRef.SetView(geoPosition); | await this.mapRef.SetView(geoPosition); | ||||
| return geoPosition; | return geoPosition; | ||||
| } | } |
| builder.Services.AddSingleton<PageHistoryManager>(); | builder.Services.AddSingleton<PageHistoryManager>(); | ||||
| builder.Services.AddSingleton<ReportDataProvider>(); | builder.Services.AddSingleton<ReportDataProvider>(); | ||||
| builder.Services.AddSingleton<OnlineStatusProvider>(); | builder.Services.AddSingleton<OnlineStatusProvider>(); | ||||
| builder.Services.AddSingleton<PermissionsProvider>(); | |||||
| builder.Services.AddSingleton<ScrollLockRemover>(); | builder.Services.AddSingleton<ScrollLockRemover>(); | ||||
| builder.Services.AddSingleton<InputCursorHandler>(); | builder.Services.AddSingleton<InputCursorHandler>(); | ||||
| builder.Services.AddScoped<ReportRepositoryService>(); | builder.Services.AddScoped<ReportRepositoryService>(); |
| <data name="Warning.Nominatim.Title" xml:space="preserve"> | <data name="Warning.Nominatim.Title" xml:space="preserve"> | ||||
| <value>Fehler im Nominatim-Dienst!</value> | <value>Fehler im Nominatim-Dienst!</value> | ||||
| </data> | </data> | ||||
| <data name="Warning.Permission.GeoLocation.Msg" xml:space="preserve"> | |||||
| <value>Die Berechtigung für die GeoLocation ist verweigert. Ändern Sie die Browsereinstellungen, um sie zuzulassen.</value> | |||||
| </data> | |||||
| <data name="Warning.Permission.GeoLocation.Title" xml:space="preserve"> | |||||
| <value>Berechtigung für GeoLocation verweigert.</value> | |||||
| </data> | |||||
| <data name="Welcome" xml:space="preserve"> | <data name="Welcome" xml:space="preserve"> | ||||
| <value>Willkommen bei Caritas!</value> | <value>Willkommen bei Caritas!</value> | ||||
| </data> | </data> |
| <data name="Warning.Nominatim.Title" xml:space="preserve"> | <data name="Warning.Nominatim.Title" xml:space="preserve"> | ||||
| <value>Erreur du service Nominatim!</value> | <value>Erreur du service Nominatim!</value> | ||||
| </data> | </data> | ||||
| <data name="Warning.Permission.GeoLocation.Msg" xml:space="preserve"> | |||||
| <value>L'accès à la géolocalisation est refusé. Modifiez les paramètres du navigateur pour l'autoriser.</value> | |||||
| </data> | |||||
| <data name="Warning.Permission.GeoLocation.Title" xml:space="preserve"> | |||||
| <value>Autorisation refusée pour la GeoLocation</value> | |||||
| </data> | |||||
| <data name="Welcome" xml:space="preserve"> | <data name="Welcome" xml:space="preserve"> | ||||
| <value>Bienvenue chez Caritas!</value> | <value>Bienvenue chez Caritas!</value> | ||||
| </data> | </data> |
| <data name="Warning.Nominatim.Title" xml:space="preserve"> | <data name="Warning.Nominatim.Title" xml:space="preserve"> | ||||
| <value>Errore del servizio Nominatim!</value> | <value>Errore del servizio Nominatim!</value> | ||||
| </data> | </data> | ||||
| <data name="Warning.Permission.GeoLocation.Msg" xml:space="preserve"> | |||||
| <value>Il permesso per la GeoLocation è negato. Cambia le impostazioni del browser per consentirlo.</value> | |||||
| </data> | |||||
| <data name="Warning.Permission.GeoLocation.Title" xml:space="preserve"> | |||||
| <value>Permesso di GeoLocation negato</value> | |||||
| </data> | |||||
| <data name="Welcome" xml:space="preserve"> | <data name="Welcome" xml:space="preserve"> | ||||
| <value>Benvenuti alla Caritas!</value> | <value>Benvenuti alla Caritas!</value> | ||||
| </data> | </data> |
| <data name="Warning.Nominatim.Title" xml:space="preserve"> | <data name="Warning.Nominatim.Title" xml:space="preserve"> | ||||
| <value>Nominatim service error!</value> | <value>Nominatim service error!</value> | ||||
| </data> | </data> | ||||
| <data name="Warning.Permission.GeoLocation.Msg" xml:space="preserve"> | |||||
| <value>The permission to the GeoLocation is denied. Change the browser settings to allow it.</value> | |||||
| </data> | |||||
| <data name="Warning.Permission.GeoLocation.Title" xml:space="preserve"> | |||||
| <value>GeoLocation Permission Denied</value> | |||||
| </data> | |||||
| <data name="Welcome" xml:space="preserve"> | <data name="Welcome" xml:space="preserve"> | ||||
| <value>Welcome to Caritas!</value> | <value>Welcome to Caritas!</value> | ||||
| </data> | </data> |
| using Microsoft.JSInterop; | |||||
| using System; | |||||
| using System.Collections.Generic; | |||||
| using System.Threading.Tasks; | |||||
| namespace cwebplusApp.Shared.Services { | |||||
| public class PermissionsProvider { | |||||
| public IJSRuntime JSRuntime { get; set; } | |||||
| public bool IsGeoLocationAllowed { get; set; } | |||||
| public PermissionsProvider(IJSRuntime _jSRuntime) { | |||||
| this.JSRuntime = _jSRuntime; | |||||
| initialize(); | |||||
| } | |||||
| [JSInvokable] | |||||
| public void GeoLocationPermissionChanged(string geoLocationStatus) { | |||||
| IsGeoLocationAllowed = (geoLocationStatus.Equals("granted") || geoLocationStatus.Equals("prompt")) ? true : false; | |||||
| } | |||||
| private async void initialize() { | |||||
| await GeoLocationAllowed(); | |||||
| } | |||||
| private async Task<bool> GeoLocationAllowed() { | |||||
| string result = ""; | |||||
| var dotNetObjRef = DotNetObjectReference.Create(this); | |||||
| result = await JSRuntime.InvokeAsync<string>("IsGeoLocationAllowed", dotNetObjRef); | |||||
| this.IsGeoLocationAllowed = result.Equals("granted") || result.Equals("prompt"); | |||||
| return IsGeoLocationAllowed; | |||||
| } | |||||
| } | |||||
| } |
| window.addEventListener("offline", onlineStatusHandler); | window.addEventListener("offline", onlineStatusHandler); | ||||
| } | } | ||||
| function IsGeoLocationAllowed(dotNetObjRef) { | |||||
| navigator.permissions.query({ name: 'geolocation' }).then(function (result) { | |||||
| console.log("GeoLocation permission: " + result.state); | |||||
| result.onchange = function () { | |||||
| console.log("GeoLocation permission: " + result.state); | |||||
| dotNetObjRef.invokeMethodAsync("GeoLocationPermissionChanged", result.state); | |||||
| } | |||||
| dotNetObjRef.invokeMethodAsync("GeoLocationPermissionChanged", result.state); | |||||
| return result.state; | |||||
| }); | |||||
| return ""; | |||||
| } | |||||
| function RemoveScrollLock(dotNetObjRef) { | function RemoveScrollLock(dotNetObjRef) { | ||||
| document.querySelector("body.mdc-dialog-scroll-lock")?.classList.remove("mdc-dialog-scroll-lock"); | document.querySelector("body.mdc-dialog-scroll-lock")?.classList.remove("mdc-dialog-scroll-lock"); | ||||
| } | } |