Compare commits

..

9 Commits

Author SHA1 Message Date
c03154672b Merge features/paymenttype-cash into net9-upgrade
- Add PaymentInfoPopup for cash payment type selection
- Adapt popup to .NET 9 IPopupService pattern
- Update BookWalkViewModel and PublicWalkResponseShowViewModel to use IPopupService
- Add cashonly.svg icon
- Extend IPublicWalkRequestService.AcceptResponseAsync with paymentType parameter
2025-12-02 13:51:15 +01:00
5bb8a75169 Refactor saving state handling in Dog and Profile view models; update application version to 1.283; comment out unused buttons in DogAdd and DogUpdate views for cleaner code. 2025-10-27 18:18:02 +01:00
9b6a847413 Comment out unused Button elements in ProfileView and ProfileWalkerView for cleaner code. 2025-10-25 21:37:04 +02:00
f6ca5c1ee4 Add codesign entitlements for iOS debug configuration 2025-09-12 17:55:24 +02:00
8a7ef83f23 Bump application version to 1.275 2025-08-09 15:06:12 +02:00
8a9ef2a883 finale anpassungen und schicken der richtigen daten + aufmerksam machen der nutzer auf den zustand dass es aktuell nur cash gibt 2025-08-09 14:45:07 +02:00
52dc491ba5 Update API endpoint for setting app user type 2025-08-09 11:01:08 +02:00
5c3e0b87c5
Merge pull request #4 from MaxMa04/develop
Remove secure text entry setting for iOS and add launch configuration…
2025-07-22 16:04:09 +02:00
5556cc97aa
Merge pull request #3 from MaxMa04/develop
dfg
2025-07-22 14:36:25 +02:00
21 changed files with 322 additions and 23 deletions

99
CLAUDE.md Normal file
View File

@ -0,0 +1,99 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
gehGassiApp is a .NET MAUI mobile application for iOS and Android that connects dog owners with dog walkers. The app enables users to find dog walkers, book walks, manage payments, and communicate via real-time messaging.
## Build Commands
Build solution:
```bash
dotnet build gehGassiApp/gehGassiApp.sln
```
Build specific configuration (Debug, Release, Staging, DebugStaging):
```bash
dotnet build gehGassiApp/gehGassiApp.sln -c Debug
```
Build for iOS:
```bash
dotnet build gehGassiApp/gehGassiApp/gehGassiApp.csproj -f net8.0-ios
```
Build for Android:
```bash
dotnet build gehGassiApp/gehGassiApp/gehGassiApp.csproj -f net8.0-android
```
## Database Migrations
Migrations use EF Core with the DbConfig project as startup project:
```powershell
# Add migration
add-migration MigrationName -Project gehGassiApp.Data -StartupProject gehGassiApp.DbConfig
# Remove last migration
remove-migration -Project gehGassiApp.Data -StartupProject gehGassiApp.DbConfig
# Update database
update-database -Project gehGassiApp.Data -StartupProject gehGassiApp.DbConfig
```
## Architecture
### Solution Structure
The solution follows a layered architecture with these projects:
- **gehGassiApp** - Main MAUI app with Views, ViewModels, Controls, and platform-specific code
- **gehGassiApp.Core** - Business logic layer: services, interfaces, messaging, helpers
- **gehGassiApp.Domain** - Domain models organized by feature (Dogs, Walks, Users, Payments, etc.)
- **gehGassiApp.Data** - Data access layer with EF Core, SQLite local database, Repository/UnitOfWork pattern
- **gehGassiApp.DbConfig** - Console app for running EF Core migrations
- **gehGassi.LocalNotifications** - Cross-platform local push notification library
- **gehGassi.Toolkit** - Shared utilities
- **gehGassi.Dto** - Shared DTOs (external project from backend repo at `../../gehGassi_backend/gehGassi.Dto`)
### MVVM Pattern
The app uses CommunityToolkit.Mvvm for MVVM implementation:
- Views are XAML pages in `gehGassiApp/Views/`
- ViewModels are in `gehGassiApp/ViewModels/`
- Views and ViewModels are registered in `MauiProgram.cs` via DI
### Dependency Injection
Services are registered as singletons in `MauiProgram.cs`. Key service interfaces are defined in `gehGassiApp.Core/Interfaces/`.
### Backend Communication
- REST API communication via `ICommunicationService`
- Real-time messaging via SignalR through `IAppHubService`
- Backend URL: `https://backend.gehgassi.com` (production)
### Local Data
- SQLite database using EF Core
- Database path: `gehgassidb.db` in app local storage
- Repository pattern via `IRepository<T>` and `IUnitOfWork`
## Build Configurations
| Configuration | Environment | App ID |
|--------------|-------------|--------|
| Debug | Local dev server | com.gehgassi.local |
| DebugStaging | Staging server (debug) | com.gehgassi.local |
| Staging | Staging server | com.gehgassi.local |
| Release | Production | com.gehgassi.gehgassi |
## Key Dependencies
- Microsoft.Maui.Controls 8.0.100
- CommunityToolkit.Maui / CommunityToolkit.Mvvm
- Microsoft.EntityFrameworkCore.Sqlite 8.0.12
- Microsoft.AspNetCore.SignalR.Client 8.0.12
- TinyInsights.Maui.AppInsights (Azure Application Insights)
- Plugin.InAppBilling (in-app purchases)

View File

@ -163,9 +163,10 @@ namespace gehGassiApp.Core.Interfaces
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <param name="publicWalkResponseId">Id des akzeptierten Angebotes</param>
/// <param name="appUserId">Id des Hundebesitzers</param>
/// <param name="paymentType">Zahlungsart für den Walk</param>
/// <param name="accessToken">Aktuelles Accesstoken</param>
/// <param name="token">CancellationToken</param>
/// <returns>Erstellter Walk wenn erfolgreich, false sonst</returns>
Task<Walk> AcceptResponseAsync(string publicWalkRequestId, string publicWalkResponseId, string appUserId, string accessToken, CancellationToken token);
Task<Walk> AcceptResponseAsync(string publicWalkRequestId, string publicWalkResponseId, string appUserId, WalkPaymentType? paymentType, string accessToken, CancellationToken token);
}
}

View File

@ -1540,7 +1540,7 @@ namespace gehGassiApp.Core.Services
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var serverResult = await _httpClient.PostAsync($"api/Account/SetAppUserTypeEx", stringContent, token).ConfigureAwait(false);
var serverResult = await _httpClient.PostAsync($"api/Account/SetAppUserTypeNoMango", stringContent, token).ConfigureAwait(false);
if (serverResult.IsSuccessStatusCode)
{

View File

@ -487,16 +487,18 @@ namespace gehGassiApp.Core.Services
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <param name="publicWalkResponseId">Id des akzeptierten Angebotes</param>
/// <param name="appUserId">Id des Hundebesitzers</param>
/// <param name="paymentType">Zahlungsart für den Walk</param>
/// <param name="accessToken">Aktuelles Accesstoken</param>
/// <param name="token">CancellationToken</param>
/// <returns>Erstellter Walk wenn erfolgreich, false sonst</returns>
public async Task<Walk> AcceptResponseAsync(string publicWalkRequestId, string publicWalkResponseId, string appUserId, string accessToken, CancellationToken token)
public async Task<Walk> AcceptResponseAsync(string publicWalkRequestId, string publicWalkResponseId, string appUserId, WalkPaymentType? paymentType, string accessToken, CancellationToken token)
{
var dto = new PublicWalkRequestAcceptDto()
{
PublicWalkRequestId = publicWalkRequestId,
PublicWalkResponseId = publicWalkResponseId,
DogOwnerId = appUserId,
PaymentType = paymentType.HasValue ? (WalkPaymentTypeDto)paymentType.Value : null,
UpdatedAt = DateTimeOffset.UtcNow
};

View File

@ -8,7 +8,7 @@
x:Class="gehGassiApp.Controls.ShellTitleViewNoLogoControl">
<Grid x:Name="rootGrid" BindingContext="{x:Reference this}" ColumnDefinitions="40,*,Auto" ColumnSpacing="5" VerticalOptions="Fill" HorizontalOptions="Fill" Margin="{OnPlatform Default='16,0,16,0', iOS=0}" BackgroundColor="{StaticResource Transparent}" >
<Border Grid.Column="0" Style="{StaticResource TitleViewIconBorder}" HorizontalOptions="StartAndExpand" IsVisible="{Binding ViewModel.NavigationBackPossible}">
<Border Grid.Column="0" Style="{StaticResource TitleViewIconBorder}" HorizontalOptions="StartAndExpand" IsVisible="{Binding ViewModel.NavigationBackPossible}" IsEnabled="{Binding ViewModel.IsNotSaving}">
<Image Style="{StaticResource TitleViewIconImage}">
<Image.Source>
<FontImageSource Glyph="{x:Static i:IconsMoon.Icon_Arrow_Left}" FontFamily="IconMoon" Size="{StaticResource FontLabelS}" Color="{AppThemeBinding Light={StaticResource Primary_DarkBlue}, Dark={StaticResource Primary_DarkBlue_Dark}}"></FontImageSource>

View File

@ -392,6 +392,7 @@ public static class MauiProgram
builder.Services.AddTransientPopup<AGBUpdatePopup, AGBUpdatePopupViewModel>();
builder.Services.AddTransientPopup<SubscriptionOfferPopup, SubscriptionOfferPopupViewModel>();
builder.Services.AddTransientPopup<SubscriptionSuccessPopup, SubscriptionSuccessPopupViewModel>();
builder.Services.AddTransientPopup<PaymentInfoPopup, PaymentInfoPopupViewModel>();
#endregion
#region Views

View File

@ -0,0 +1,17 @@
<svg width="101" height="120" viewBox="0 0 101 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M54.7267 6.72266L96.0054 20.8311C96.0054 20.8311 95.2269 66.9907 65.8527 107.809L22.0725 92.3311C22.0725 92.3311 53.8174 73.6204 54.7267 6.72266Z" fill="#45937E"/>
<path d="M63.5851 19.0508L100.5 42.0623C100.5 42.0623 95.1875 78.497 51.7348 120C51.7348 120 28.1695 106.713 17.8169 92.1945C17.8169 92.1945 49.8279 77.9495 63.5856 19.0508H63.5851Z" fill="#2A7863"/>
<path d="M27.1252 26.6795C35.0905 19.2469 38.816 10.2616 35.4463 6.61009C32.0766 2.95861 22.8878 6.02375 14.9225 13.4563C6.95716 20.8888 3.23168 29.8742 6.60138 33.5257C9.97108 37.1771 19.1599 34.112 27.1252 26.6795Z" fill="white"/>
<path d="M33.276 57.8985C38.3003 45.6226 37.83 33.7908 32.2254 31.4714C26.6208 29.152 18.0044 37.2233 12.9801 49.4992C7.95582 61.775 8.4262 73.6068 14.0308 75.9262C19.6353 78.2456 28.2517 70.1744 33.276 57.8985Z" fill="white"/>
<path d="M14.9809 73.2373C15.1163 73.3709 15.1724 73.4767 15.2414 73.4859C15.6766 73.5455 16.1159 73.6338 16.5511 73.6179C17.2606 73.5922 17.9068 73.3103 18.5183 72.9584C19.6977 72.2804 20.6984 71.3815 21.622 70.3912C23.2601 68.6345 24.6184 66.6688 25.8469 64.6101C28.8351 59.603 31.0398 54.2621 32.5273 48.6222C33.2348 45.9394 33.7675 43.2212 33.886 40.4382C33.9524 38.8803 33.9463 37.3229 33.5739 35.7933C33.3865 35.0233 33.1173 34.2872 32.6535 33.6375C32.5349 33.4716 32.4236 33.2846 32.1375 33.1747C32.9962 34.4229 33.2205 34.8615 33.4406 36.0758C33.5775 36.8303 33.6654 37.6003 33.6986 38.3667C33.8023 40.7746 33.4907 43.1492 33.0223 45.5033C32.0517 50.3773 30.4258 55.0325 28.3223 59.5229C26.9487 62.4553 25.3713 65.2701 23.4318 67.8676C22.3044 69.3772 21.0825 70.8006 19.6017 71.9768C18.8493 72.5747 18.0427 73.0842 17.1028 73.3308C16.5016 73.4885 15.8978 73.5501 15.3129 73.2414C15.2532 73.2101 15.1622 73.2373 14.9814 73.2373H14.9809ZM35.4486 7.66067C35.5794 9.64798 35.4808 10.4051 34.7667 12.0041C34.3846 12.8603 33.9494 13.6986 33.4733 14.5061C32.2014 16.6634 30.6572 18.6199 28.9736 20.4649C25.8632 23.8745 22.4163 26.8856 18.4922 29.3213C16.8811 30.3214 15.201 31.1858 13.3923 31.7719C12.4314 32.0832 11.4522 32.2963 10.4326 32.2208C9.77112 32.172 9.15814 32.0046 8.7071 31.4627C8.67645 31.4257 8.60238 31.4257 8.47314 31.3846C8.53751 31.5156 8.55079 31.587 8.59421 31.624C8.97578 31.9486 9.39618 32.1926 9.89371 32.2999C10.6947 32.473 11.4849 32.395 12.2736 32.2321C14.0272 31.8705 15.6439 31.1478 17.184 30.2613C23.3659 26.7042 28.4903 21.9674 32.6248 16.1462C33.646 14.709 34.5067 13.1737 35.1273 11.512C35.4159 10.7385 35.6223 9.94693 35.6647 9.11892C35.6882 8.65972 35.656 8.20719 35.4476 7.66016L35.4486 7.66067Z" fill="#9FC3B9"/>
<path d="M14.981 73.2384C15.1618 73.2384 15.2527 73.2112 15.3125 73.2425C15.8974 73.5507 16.5012 73.4891 17.1024 73.3319C18.0423 73.0859 18.8488 72.5758 19.6013 71.9779C21.0821 70.8017 22.304 69.3783 23.4313 67.8687C25.3714 65.2712 26.9483 62.4564 28.3219 59.524C30.4254 55.0336 32.0513 50.3784 33.0218 45.5044C33.4908 43.1503 33.8024 40.7757 33.6982 38.3678C33.6649 37.6014 33.5771 36.8314 33.4402 36.0769C33.2195 34.8631 32.9958 34.4245 32.1371 33.1758C32.4232 33.2857 32.5345 33.4727 32.653 33.6386C33.1174 34.2883 33.386 35.0244 33.5735 35.7944C33.9459 37.324 33.9525 38.8814 33.8856 40.4393C33.7666 43.2223 33.2343 45.9405 32.5269 48.6233C31.0394 54.2632 28.8342 59.6041 25.8465 64.6112C24.618 66.6699 23.2597 68.6356 21.6215 70.3923C20.698 71.3826 19.6973 72.2815 18.5178 72.9595C17.9064 73.3108 17.2602 73.5933 16.5507 73.619C16.116 73.6344 15.6762 73.5466 15.241 73.487C15.172 73.4778 15.1158 73.372 14.9805 73.2384H14.981Z" fill="#003A8B"/>
<path d="M35.4486 7.66016C35.6565 8.20719 35.6892 8.65972 35.6657 9.11892C35.6233 9.94693 35.4169 10.7385 35.1283 11.512C34.5077 13.1737 33.6469 14.709 32.6258 16.1462C28.4908 21.9674 23.3668 26.7042 17.185 30.2613C15.6444 31.1478 14.0282 31.8705 12.2746 32.2321C11.4859 32.395 10.6951 32.473 9.89469 32.2999C9.39716 32.1926 8.97625 31.9481 8.59518 31.624C8.55228 31.5875 8.53848 31.5156 8.47412 31.3846C8.60285 31.4257 8.67742 31.4257 8.70807 31.4627C9.15912 32.0046 9.77209 32.172 10.4336 32.2208C11.4532 32.2958 12.4324 32.0832 13.3932 31.7719C15.202 31.1858 16.8821 30.3214 18.4932 29.3213C22.4172 26.8856 25.8637 23.8751 28.9745 20.4649C30.6582 18.6194 32.2024 16.6634 33.4743 14.5061C33.9504 13.6986 34.3851 12.8603 34.7677 12.0041C35.4813 10.4051 35.5804 9.64747 35.4496 7.66067L35.4486 7.66016Z" fill="#003A8B"/>
<path d="M53.8174 110.462C53.9303 110.349 54.0401 110.232 54.1566 110.122C55.289 109.059 56.443 108.018 57.5519 106.931C60.6148 103.93 63.5228 100.784 66.2628 97.4807C70.4213 92.4675 74.3643 87.2915 77.9103 81.819C82.6788 74.46 86.8603 66.7778 90.3537 58.7238C91.9127 55.1293 93.3711 51.4937 94.5148 47.7389C94.5592 47.5925 94.6016 47.4307 94.6956 47.3198C94.7687 47.2329 94.9388 47.1533 95.0328 47.1816C95.1232 47.2088 95.2207 47.3768 95.2253 47.4867C95.2325 47.6511 95.1722 47.8226 95.1206 47.9844C93.9064 51.8024 92.5395 55.5628 90.9488 59.2405C86.6059 69.2809 81.1325 78.6745 74.9328 87.6577C72.2311 91.5727 69.3491 95.3455 66.2112 98.9143C63.7522 101.711 61.1981 104.419 58.4004 106.884C57.0682 108.057 55.7498 109.245 54.2858 110.255C54.1509 110.348 54.0115 110.435 53.8746 110.525L53.8174 110.462V110.462Z" fill="white"/>
<path d="M76.6273 68.504C76.5128 72.6636 74.9544 76.1245 71.5927 78.6322C66.6833 82.294 60.104 81.0771 56.748 75.9422C52.9915 70.195 54.6302 62.1209 60.3502 58.4426C63.3809 56.4939 66.6307 56.0444 70 57.477C72.7579 58.6496 74.6218 60.7438 75.7206 63.5247C76.3514 65.1222 76.617 66.7463 76.6273 68.504ZM55.402 68.6463C55.3984 71.456 55.9981 73.6297 57.1796 75.5179C59.9697 79.9759 65.4492 81.504 69.9969 78.9979C73.4367 77.1025 75.4299 74.0951 76.1032 70.2335C76.7049 66.7838 75.9586 63.6187 73.7999 60.8527C72.0432 58.6019 69.7231 57.2957 66.8656 57.0846C63.8718 56.8632 61.2968 57.8977 59.1682 59.9841C56.6392 62.4635 55.4587 65.5418 55.402 68.6468V68.6463Z" fill="white"/>
<path d="M65.1084 24.6406C65.1518 25.6643 65.0256 26.6618 64.7988 27.6439C63.9269 31.4167 62.8215 35.1165 61.5107 38.7609C59.3413 44.7911 56.8154 50.6601 53.9032 56.3647C51.2245 61.6116 48.2347 66.6741 44.8935 71.5184C41.3755 76.6189 37.5204 81.4508 33.1193 85.8204C31.4714 87.4564 29.7694 89.0354 27.8998 90.4197C27.7568 90.526 27.6005 90.6148 27.4145 90.735C27.3149 90.4258 27.4947 90.3344 27.6337 90.226C28.1036 89.8587 28.5966 89.5182 29.0425 89.1237C32.8864 85.7228 36.3951 82.0004 39.6235 78.0058C44.3725 72.1291 48.5065 65.84 52.1332 59.2087C55.6446 52.7881 58.6282 46.1292 60.9621 39.1872C62.1891 35.5382 63.2409 31.8333 64.1241 28.0821C64.3749 27.0173 64.7059 25.9715 65.0021 24.9175C65.0287 24.823 65.0726 24.7331 65.1084 24.6406Z" fill="white"/>
<path d="M59.9257 12.274C60.1729 12.3392 60.3547 12.3839 60.5346 12.4352C66.247 14.0661 71.9032 15.8793 77.5538 17.7114C81.6663 19.0449 85.7891 20.3454 89.9083 21.6583C90.2812 21.777 90.6607 21.8741 91.0336 21.9932C91.1766 22.0389 91.3401 22.0883 91.4371 22.1905C91.527 22.285 91.6078 22.4761 91.5705 22.5819C91.5316 22.6928 91.358 22.7853 91.2252 22.8243C91.125 22.8541 90.9938 22.7971 90.8814 22.7622C88.8672 22.1324 86.8531 21.5042 84.8415 20.8668C82.7646 20.2088 80.6932 19.5323 78.6147 18.8795C74.8312 17.6909 71.0399 16.529 67.2609 15.3255C65.3638 14.7215 63.4876 14.0496 61.6016 13.4091C61.1342 13.2504 60.6648 13.0973 60.1974 12.9376C60.0692 12.8934 59.9292 12.8554 59.8266 12.7737C59.7469 12.71 59.6554 12.5611 59.6805 12.4897C59.7152 12.3916 59.8547 12.3305 59.9252 12.2734L59.9257 12.274Z" fill="white"/>
<path d="M67.5032 25.7372C67.8005 25.5913 67.9905 25.7777 68.1851 25.8877C69.4765 26.6155 70.7749 27.3326 72.0499 28.0892C76.0659 30.472 80.0722 32.8718 84.0831 35.2628C86.7475 36.851 89.416 38.4325 92.0799 40.0218C93.3385 40.7727 94.59 41.535 95.8451 42.2916C96.1531 42.4775 96.266 42.6707 96.1684 42.8479C96.0632 43.0395 95.8287 43.0282 95.4916 42.8268C90.9091 40.0957 86.3251 37.3688 81.7441 34.6351C78.5245 32.7136 75.3043 30.793 72.0944 28.8545C70.6942 28.0085 69.3191 27.1209 67.9353 26.2472C67.7566 26.1342 67.5308 26.0515 67.5027 25.7372H67.5032Z" fill="white"/>
<path d="M57.2292 11.5625C57.2604 11.6668 57.3038 11.7695 57.3212 11.8763C57.6619 13.9813 57.6869 16.098 57.5469 18.2209C57.5209 18.6134 57.5301 19.0079 57.5168 19.4013C57.4376 21.7271 57.2461 24.0432 56.9421 26.3505C56.7276 27.9772 56.5228 29.6055 56.3097 31.2327C55.967 33.8446 55.5032 36.4355 54.977 39.0161C54.3273 42.2002 53.607 45.3684 52.7305 48.4965C52.0756 50.8336 51.3467 53.1502 50.6305 55.4693C50.4354 56.1006 50.1887 56.7195 49.7213 57.3061C49.6554 57.0056 49.7805 56.8135 49.8413 56.6168C50.5917 54.2006 51.384 51.7967 52.0945 49.3692C53.3588 45.0509 54.3579 40.6669 55.0961 36.2264C55.4659 34.0008 55.8168 31.77 56.0962 29.532C56.3123 27.8031 56.4134 26.0598 56.5483 24.321C56.7904 21.1986 56.8798 18.071 56.8798 14.9387C56.8798 13.8976 56.9947 12.8564 57.0606 11.8157C57.0657 11.7346 57.0964 11.655 57.1153 11.5748C57.1531 11.5707 57.1909 11.5666 57.2292 11.5625Z" fill="white"/>
<path d="M48.2614 113.332C48.1408 113.29 48.0151 113.257 47.8997 113.203C46.3984 112.503 45.0095 111.607 43.6181 110.716C42.3697 109.917 41.1233 109.115 39.8861 108.298C38.0497 107.085 36.3068 105.745 34.6268 104.323C32.441 102.473 30.3135 100.559 28.2288 98.5926C27.337 97.7513 26.3853 96.9746 25.5844 96.0378C25.4751 95.9099 25.3693 95.7789 25.2988 95.5898C25.3714 95.6268 25.4485 95.6571 25.5154 95.7029C25.5854 95.7506 25.6467 95.8117 25.7095 95.8688C27.5275 97.5181 29.3409 99.1731 31.166 100.814C31.7611 101.349 32.3874 101.849 33.0009 102.363C34.2151 103.381 35.3996 104.438 36.6521 105.406C38.2699 106.655 39.9162 107.872 41.5999 109.031C43.2268 110.15 44.9125 111.184 46.5818 112.241C47.0124 112.514 47.4808 112.725 47.9278 112.972C48.0642 113.047 48.1868 113.148 48.3155 113.237L48.2598 113.331L48.2614 113.332Z" fill="white"/>
<path d="M90.815 35.842C90.108 35.5815 90.0626 35.5189 90.1448 34.8619C90.3297 33.3888 90.5335 31.9177 90.7057 30.4425C90.8145 29.5107 90.8778 28.5733 90.9647 27.639C90.9774 27.5039 90.9897 27.3652 91.0321 27.2378C91.0888 27.0657 91.2083 26.9368 91.407 26.9502C91.6338 26.9651 91.7406 27.1243 91.7411 27.3308C91.7426 27.7576 91.7452 28.1865 91.7043 28.6103C91.5552 30.1559 91.3948 31.7009 91.2247 33.2444C91.1424 33.9908 91.0326 34.734 90.9289 35.4773C90.9131 35.5892 90.862 35.6966 90.8155 35.842H90.815Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -453,6 +453,7 @@ namespace gehGassiApp.ViewModels.Dogs
return;
}
IsSaving = true;
IsNewPhoto = true;
var extension = ".png";
@ -500,6 +501,7 @@ namespace gehGassiApp.ViewModels.Dogs
PhotoPath = newFile;
Dog.Photo = PhotoPath;
IsSaving = false;
}

View File

@ -454,6 +454,7 @@ namespace gehGassiApp.ViewModels.Dogs
return;
}
IsSaving = true;
IsNewPhoto = true;
var extension = ".png";
@ -501,6 +502,7 @@ namespace gehGassiApp.ViewModels.Dogs
PhotoPath = newFile;
Dog.Photo = PhotoPath;
IsSaving = false;
}

View File

@ -0,0 +1,41 @@
using CommunityToolkit.Maui;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace gehGassiApp.ViewModels.Popups;
/// <summary>
/// ViewModel für das Zahlungshinweis-Popup
/// </summary>
public partial class PaymentInfoPopupViewModel : ObservableObject, IQueryAttributable
{
#region Fields
private readonly IPopupService _popupService;
#endregion
#region Constructor
public PaymentInfoPopupViewModel(IPopupService popupService)
{
_popupService = popupService;
}
#endregion
#region IQueryAttributable Implementation
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
// Falls Parameter benötigt werden, hier implementieren
}
#endregion
#region Commands
/// <summary>
/// User hat den Hinweis zur Kenntnis genommen
/// </summary>
[RelayCommand]
private async Task Acknowledge()
{
// Popup schließen mit true als Ergebnis
await _popupService.ClosePopupAsync(Shell.Current, true);
}
#endregion
}

View File

@ -772,6 +772,7 @@ namespace gehGassiApp.ViewModels
return;
}
IsSaving = true;
IsNewPhoto = true;
var extension = ".png";
@ -819,6 +820,7 @@ namespace gehGassiApp.ViewModels
PhotoPath = newFile;
AppUser.Photo = PhotoPath;
IsSaving = false;
}

View File

@ -961,6 +961,7 @@ namespace gehGassiApp.ViewModels
return;
}
IsSaving = true;
IsNewPhoto = true;
var extension = ".png";
@ -1008,6 +1009,7 @@ namespace gehGassiApp.ViewModels
PhotoPath = newFile;
AppUser.Photo = PhotoPath;
IsSaving = false;
}

View File

@ -1,7 +1,9 @@
using System.Collections.ObjectModel;
using System.Text.Json;
using System.Web;
using CommunityToolkit.Maui;
using CommunityToolkit.Maui.Core.Extensions;
using CommunityToolkit.Maui.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
@ -18,6 +20,7 @@ using gehGassiApp.Domain.Walkers;
using gehGassiApp.Resources;
using gehGassiApp.Services;
using gehGassiApp.Views.Dogs;
using gehGassiApp.Views.Popups;
using gehGassiApp.Views.More;
using gehGassiApp.Views.Payments;
using gehGassiApp.Views.Walks;
@ -38,6 +41,7 @@ namespace gehGassiApp.ViewModels.Walks
private readonly IWalkingTimeService _walkingTimeService;
private readonly IDialogService _dialogService;
private readonly IDispatcher _dispatcher;
private readonly IPopupService _popupService;
private string _walkerId;
private bool _countryHandlerEnabled;
@ -55,8 +59,9 @@ namespace gehGassiApp.ViewModels.Walks
/// <param name="walkingTimeService">Instanz eines IWalkingTimeService</param>
/// <param name="dialogService">Instanz eines IDialogService</param>
/// <param name="dispatcher">Instanz eines IDispatcher</param>
public BookWalkViewModel(IDogWalkerService dogWalkerService, IDogService dogService, ICountryService countryService, ILocationService locationService, IWalkService walkService,
IWalkingTimeService walkingTimeService, IDialogService dialogService, IDispatcher dispatcher)
/// <param name="popupService">Instanz eines IPopupService</param>
public BookWalkViewModel(IDogWalkerService dogWalkerService, IDogService dogService, ICountryService countryService, ILocationService locationService, IWalkService walkService,
IWalkingTimeService walkingTimeService, IDialogService dialogService, IDispatcher dispatcher, IPopupService popupService)
{
_dogWalkerService = dogWalkerService;
_dogService = dogService;
@ -66,6 +71,7 @@ namespace gehGassiApp.ViewModels.Walks
_walkingTimeService = walkingTimeService;
_dialogService = dialogService;
_dispatcher = dispatcher;
_popupService = popupService;
_bookNow = false;
_addressChangedCounter = 0;
@ -615,6 +621,9 @@ namespace gehGassiApp.ViewModels.Walks
var helpStartDate = new DateTimeOffset(StartDate.Year, StartDate.Month, StartDate.Day, StartTime.Hours, StartTime.Minutes, StartTime.Seconds, DateTimeOffset.Now.Offset);
var helpEndDate = new DateTimeOffset(EndDate.Year, EndDate.Month, EndDate.Day, EndTime.Hours, EndTime.Minutes, EndTime.Seconds, DateTimeOffset.Now.Offset);
// PaymentType auswählen
var paymentResult = await _popupService.ShowPopupAsync<PaymentInfoPopup, object>(Shell.Current);
var walkCreateDto = new WalkCreateDto()
{
Type = WalkTypeDto.Scheduled,
@ -628,7 +637,8 @@ namespace gehGassiApp.ViewModels.Walks
PickupAddress = PickupAddress.ToDto(),
ReturnAddress = ReturnAddress.ToDto(),
Price = Price,
Info = Info
Info = Info,
PaymentType = paymentResult.Result is true ? WalkPaymentTypeDto.Cash : null
};
#region Pickupaddress
@ -723,6 +733,9 @@ namespace gehGassiApp.ViewModels.Walks
var helpStartDate = new DateTimeOffset(StartDate.Year, StartDate.Month, StartDate.Day, StartTime.Hours, StartTime.Minutes, StartTime.Seconds, DateTimeOffset.Now.Offset);
var helpEndDate = new DateTimeOffset(EndDate.Year, EndDate.Month, EndDate.Day, EndTime.Hours, EndTime.Minutes, EndTime.Seconds, DateTimeOffset.Now.Offset);
// PaymentType auswählen
var paymentResult = await _popupService.ShowPopupAsync<PaymentInfoPopup, object>(Shell.Current);
var walkCreateDto = new WalkCreateDto()
{
Type = WalkTypeDto.Direct,
@ -736,7 +749,8 @@ namespace gehGassiApp.ViewModels.Walks
PickupAddress = PickupAddress.ToDto(),
ReturnAddress = ReturnAddress.ToDto(),
Price = Price,
Info = Info
Info = Info,
PaymentType = paymentResult.Result is true ? WalkPaymentTypeDto.Cash : null
};
#region Pickupaddress

View File

@ -1,5 +1,7 @@
using System.Web;
using CommunityToolkit.Maui;
using CommunityToolkit.Maui.Core;
using CommunityToolkit.Maui.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
@ -17,6 +19,7 @@ using gehGassiApp.Views.Payments;
using gehGassiApp.Views.Ratings;
using gehGassiApp.Views.Report;
using gehGassiApp.Views.Walks;
using gehGassiApp.Views.Popups;
namespace gehGassiApp.ViewModels.Walks
{
@ -32,6 +35,7 @@ namespace gehGassiApp.ViewModels.Walks
private readonly IConversationService _conversationService;
private readonly IUserService _userService;
private readonly IFavouriteService _favouriteService;
private readonly IPopupService _popupService;
private string _responseId;
private string _requestId;
@ -49,8 +53,9 @@ namespace gehGassiApp.ViewModels.Walks
/// <param name="conversationService">Instanz eines IConversationService</param>
/// <param name="userService">Instanz eines IUserService</param>
/// <param name="favouriteService">Instanz eines IFavouriteService</param>
public PublicWalkResponseShowViewModel(IPublicWalkRequestService publicWalkRequestService, IPublicWalkResponseService publicWalkResponseService, IDialogService dialogService, ILookupService lookupService,
ILocalPushNotificationService localPushNotificationService, IDispatcher dispatcher, IWalkService walkService, IConversationService conversationService, IUserService userService, IFavouriteService favouriteService)
/// <param name="popupService">Instanz eines IPopupService</param>
public PublicWalkResponseShowViewModel(IPublicWalkRequestService publicWalkRequestService, IPublicWalkResponseService publicWalkResponseService, IDialogService dialogService, ILookupService lookupService,
ILocalPushNotificationService localPushNotificationService, IDispatcher dispatcher, IWalkService walkService, IConversationService conversationService, IUserService userService, IFavouriteService favouriteService, IPopupService popupService)
{
_publicWalkRequestService = publicWalkRequestService;
_publicWalkResponseService = publicWalkResponseService;
@ -62,6 +67,7 @@ namespace gehGassiApp.ViewModels.Walks
_conversationService = conversationService;
_userService = userService;
_favouriteService = favouriteService;
_popupService = popupService;
Title = Text.View_Title_PublicWalkResponse;
SelectedMenu = MenuSelected.Walks;
IsLoading = true;
@ -120,9 +126,21 @@ namespace gehGassiApp.ViewModels.Walks
return;
}
// PaymentInfoPopup anzeigen um PaymentType zu bestimmen
var popupResult = await _popupService.ShowPopupAsync<PaymentInfoPopup, object>(Shell.Current);
// Wenn das Popup geschlossen wurde ohne "Alles klar" zu klicken, abbrechen
if (popupResult?.Result is not true)
{
return;
}
// Popup Result = true bedeutet Cash Payment
var paymentType = WalkPaymentType.Cash;
IsSaving = true;
using var cts = new CancellationTokenSource(Core.Common.Constants.CreateTimeout);
var createdWalk = await _publicWalkRequestService.AcceptResponseAsync(_requestId, PublicWalkResponse.Id, App.CurrentAppUser.Id, App.CurrentUser.AccessToken, cts.Token);
var createdWalk = await _publicWalkRequestService.AcceptResponseAsync(_requestId, PublicWalkResponse.Id, App.CurrentAppUser.Id, paymentType, App.CurrentUser.AccessToken, cts.Token);
if (createdWalk != null)
{
WeakReferenceMessenger.Default.Send(new RefreshViewModelMessage(Core.Messaging.Messages.Refresh_PublicWalkRequestDetails));

View File

@ -85,7 +85,7 @@
</Button>
<Button
<!--<Button
Grid.Column="1"
Padding="0"
Background="{StaticResource Primary_DarkBlue}"
@ -157,7 +157,7 @@
Size="18"
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
</Button>-->
</Grid>
<Label

View File

@ -83,7 +83,7 @@
</Button.ImageSource>
</Button>
<Button
<!--<Button
Grid.Column="1"
Padding="0"
Background="{StaticResource Primary_DarkBlue}"
@ -155,7 +155,7 @@
Size="18"
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
</Button>-->
</Grid>
<Label

View File

@ -0,0 +1,84 @@
<?xml version="1.0" encoding="utf-8" ?>
<toolkit:Popup
x:Class="gehGassiApp.Views.Popups.PaymentInfoPopup"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:res="clr-namespace:gehGassiApp.Resources"
xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
xmlns:viewModels="clr-namespace:gehGassiApp.ViewModels.Popups"
x:DataType="viewModels:PaymentInfoPopupViewModel"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_White},
Dark={StaticResource Primary_White_Dark}}"
CanBeDismissedByTappingOutsideOfPopup="False"
VerticalOptions="Center">
<!-- Popup Content -->
<Border
Padding="0"
BackgroundColor="{AppThemeBinding Light={StaticResource Accent_SugarPaper},
Dark={StaticResource Accent_SugarPaper_Dark}}"
StrokeShape="RoundRectangle 16"
StrokeThickness="0"
WidthRequest="350">
<!-- Drop Shadow Effect -->
<Border.Shadow>
<Shadow
Brush="{AppThemeBinding Light={StaticResource Shadow_Blue},
Dark={StaticResource Shadow_Blue_Dark}}"
Opacity="0.3"
Radius="8"
Offset="0,4" />
</Border.Shadow>
<Grid RowDefinitions="Auto,Auto">
<!-- Content Bereich -->
<VerticalStackLayout
Grid.Row="0"
Padding="20,30,20,20"
Spacing="20">
<!-- Cash Only PNG Image -->
<Image
Source="cashonly.png"
HeightRequest="120"
WidthRequest="101"
HorizontalOptions="Center" />
<!-- Title -->
<Label
HorizontalTextAlignment="Center"
Style="{StaticResource H2}"
Text="Cash only?!"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
<!-- Main Text -->
<Label
HorizontalTextAlignment="Center"
LineHeight="1.4"
Style="{StaticResource BodyM}"
Text="Wir hören euch zu und testen eure Wünsche. Mehr Buchungen bei Barzahlung? Let's do it!"
TextColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}" />
</VerticalStackLayout>
<!-- Action Button -->
<Button
Grid.Row="1"
Margin="20"
BackgroundColor="{AppThemeBinding Light={StaticResource Primary_DarkBlue},
Dark={StaticResource Primary_DarkBlue_Dark}}"
Command="{Binding AcknowledgeCommand}"
CornerRadius="12"
FontAttributes="Bold"
FontSize="{StaticResource FontLabelM}"
Text="OK"
TextColor="{AppThemeBinding Light={StaticResource Primary_White},
Dark={StaticResource Primary_White_Dark}}" />
</Grid>
</Border>
</toolkit:Popup>

View File

@ -0,0 +1,13 @@
using CommunityToolkit.Maui.Views;
using gehGassiApp.ViewModels.Popups;
namespace gehGassiApp.Views.Popups;
public partial class PaymentInfoPopup : Popup
{
public PaymentInfoPopup(PaymentInfoPopupViewModel viewModel)
{
InitializeComponent();
BindingContext = viewModel;
}
}

View File

@ -98,7 +98,7 @@
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
<Button
<!--<Button
Grid.Column="1"
Padding="0"
Background="{StaticResource Primary_DarkBlue}"
@ -170,7 +170,7 @@
Size="18"
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
</Button>-->
</Grid>

View File

@ -104,7 +104,7 @@
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
<Button
<!--<Button
Grid.Column="1"
Padding="0"
Background="{StaticResource Primary_DarkBlue}"
@ -176,9 +176,9 @@
Size="18"
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
</Button>-->
<Button
<!--<Button
Grid.Column="1"
Margin="0,15,0,0"
Padding="0"
@ -226,7 +226,7 @@
Size="18"
Color="{StaticResource Primary_White}" />
</Button.ImageSource>
</Button>
</Button>-->
</Grid>

View File

@ -22,8 +22,8 @@
<ApplicationIdGuid>284D2BDB-7FFC-485A-968F-8440A92578FE</ApplicationIdGuid>
<!-- Versions -->
<ApplicationDisplayVersion>1.281</ApplicationDisplayVersion>
<ApplicationVersion>281</ApplicationVersion>
<ApplicationDisplayVersion>1.283</ApplicationDisplayVersion>
<ApplicationVersion>283</ApplicationVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">29.0</SupportedOSPlatformVersion>
@ -77,6 +77,7 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net9.0-ios|AnyCPU'">
<ApplicationId>com.gehgassi.local</ApplicationId>
<CodesignEntitlements>Platforms\iOS\Entitlements.development.plist</CodesignEntitlements>
<MtouchDebug>True</MtouchDebug>
<MtouchLink>None</MtouchLink>
<MtouchUseLlvm>False</MtouchUseLlvm>