6177214e-ce7c-49e3-99de-ff9721b26f63 — Commit 2ab9d6aa

AuthorNKL<nikolaj.king@gmail.com>
Date2025-12-09 13:04:38 +0100
fixed profile when error happening on api and fixed refresh on sign up to club

Changed files

comwell_key_app/ios/Podfile                        | 12 ++++++----
 .../ios/Runner.xcodeproj/project.pbxproj           |  2 +-
 .../services/models/user_permissions.g.dart        |  8 +++----
 .../booking_details/bloc/booking_details_bloc.dart |  7 +++++-
 .../bloc/booking_details_event.dart                |  4 ++++
 .../components/check_in_button_timer.dart          | 28 ++++++++++++++++++----
 .../overview/components/bill_download_modal.dart   | 16 +++++++++----
 .../profile/components/comwell_club_container.dart | 11 +++++++--
 .../lib/profile/cubit/profile_cubit.dart           | 14 ++++++++---
 .../lib/profile/cubit/profile_state.dart           |  2 +-
 .../lib/services/models/user_permissions.dart      | 16 ++++++-------
 comwell_key_app/lib/utils/seos_repository.dart     |  2 +-
 12 files changed, 87 insertions(+), 35 deletions(-)

Diff

diff --git a/comwell_key_app/ios/Podfile b/comwell_key_app/ios/Podfile
index 7e5ec7ed..a9141302 100644
--- a/comwell_key_app/ios/Podfile
+++ b/comwell_key_app/ios/Podfile
@@ -6,13 +6,15 @@ ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
+ 'Debug-Develop' => :debug,
+ 'Debug-Stage' => :debug,
+ 'Debug-Test' => :debug,
'Profile' => :release,
'Release' => :release,
- 'Develop' => :debug,
- 'Test-Debug' => :debug,
- 'Test-Release' => :release,
- 'Stage' => :release,
- 'Prod' => :release,
+ 'Release-Develop' => :release,
+ 'Release-Stage' => :release,
+ 'Release-Prod' => :release,
+ 'Release-Test' => :release,
}
def flutter_root
diff --git a/comwell_key_app/ios/Runner.xcodeproj/project.pbxproj b/comwell_key_app/ios/Runner.xcodeproj/project.pbxproj
index b9904cbe..a63fd582 100644
--- a/comwell_key_app/ios/Runner.xcodeproj/project.pbxproj
+++ b/comwell_key_app/ios/Runner.xcodeproj/project.pbxproj
@@ -711,7 +711,7 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = Runner/RunnerRelease.entitlements;
- CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_IDENTITY = "iPhone Distribution: Comwell AS (8RNV6AX4ZL)";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
CODE_SIGN_STYLE = Manual;
DEVELOPMENT_TEAM = "";
diff --git a/comwell_key_app/lib/.generated/services/models/user_permissions.g.dart b/comwell_key_app/lib/.generated/services/models/user_permissions.g.dart
index e8c28615..b54d001c 100644
--- a/comwell_key_app/lib/.generated/services/models/user_permissions.g.dart
+++ b/comwell_key_app/lib/.generated/services/models/user_permissions.g.dart
@@ -7,10 +7,10 @@ part of '../../../services/models/user_permissions.dart';
// **************************************************************************
UserPermissions _$UserPermissionsFromJson(Map json) => UserPermissions(
- guestOptIn1: json['GuestOptIn1'] as bool,
- guestOptIn2: json['GuestOptIn2'] as bool,
- guestOptIn3: json['GuestOptIn3'] as bool,
- guestOptIn4: json['GuestOptIn4'] as bool,
+ guestOptIn1: json['GuestOptIn1'] as bool? ?? false,
+ guestOptIn2: json['GuestOptIn2'] as bool? ?? false,
+ guestOptIn3: json['GuestOptIn3'] as bool? ?? false,
+ guestOptIn4: json['GuestOptIn4'] as bool? ?? false,
);
Map<String, dynamic> _$UserPermissionsToJson(UserPermissions instance) =>
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
index c22f38e7..a6237aa2 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_bloc.dart
@@ -84,7 +84,7 @@ class BookingDetailsBloc
on<GetUpSalesEvent>((event, emit) async {
try {
- await getUpSales(emit);
+ await getUpSales(emit, fetchRemote: true);
emit(state.main());
} catch (e) {
if (kDebugMode) print("err=$e");
@@ -120,6 +120,11 @@ class BookingDetailsBloc
on<GetUserEvent>((event, emit) async {
await getUser(emit, fetchRemote: event.fetchRemote);
});
+
+ on<BypassTimerEvent>((event, emit) {
+ _timer?.cancel();
+ emit(state.updateRemainingTime(const Duration(seconds: -1)));
+ });
}
Future<void> getUpSales(Emitter<BookingDetailsState> emit,
diff --git a/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart b/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
index 90a676d4..f557baa4 100644
--- a/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
+++ b/comwell_key_app/lib/booking_details/bloc/booking_details_event.dart
@@ -82,3 +82,7 @@ final class OrderHouseKeepingEvent extends BookingDetailsEvent {
@override
List<Object> get props => [selectedServices];
}
+
+final class BypassTimerEvent extends BookingDetailsEvent {
+ const BypassTimerEvent();
+}
diff --git a/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart b/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart
index 9b0ada09..a41c961f 100644
--- a/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart
+++ b/comwell_key_app/lib/booking_details/components/check_in_button_timer.dart
@@ -4,6 +4,7 @@ import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:comwell_key_app/utils/time_utils.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
@@ -30,13 +31,18 @@ class _CheckInButtonTimerState extends State<CheckInButtonTimer> {
child: child,
);
},
- child: const CheckInButton(key: ValueKey('check_in_button'))); // TODO: state.remainingTime.isNegative
- //? const CheckInButton(key: ValueKey('check_in_button'))
- //: getTimerWidget());
+ child: state.remainingTime.isNegative
+ ? const CheckInButton(key: ValueKey('check_in_button'))
+ : getTimerWidget());
},
);
}
+ bool get _isDevOrStage {
+ final flavor = appFlavor?.toLowerCase();
+ return flavor == 'develop' || flavor == 'stage';
+ }
+
Widget getTimerWidget() {
return BlocBuilder<BookingDetailsBloc, BookingDetailsState>(
key: const ValueKey('timer_view'),
@@ -60,11 +66,11 @@ class _CheckInButtonTimerState extends State<CheckInButtonTimer> {
: "check_in_button_timer_seconds"
.tr(args: [seconds.toString()]);
- return Container(
+ final timerContent = Container(
margin: const EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: Colors.grey[900]?.withValues(alpha: 0.8),
- borderRadius: BorderRadius.circular(30),
+ borderRadius: BorderRadius.circular(8),
),
padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 8),
child: Row(
@@ -118,6 +124,18 @@ class _CheckInButtonTimerState extends State<CheckInButtonTimer> {
],
),
);
+
+ if (_isDevOrStage) {
+ return GestureDetector(
+ onTap: () {
+ // Bypass timer in dev/stage - show check-in button
+ cubit.add(const BypassTimerEvent());
+ },
+ child: timerContent,
+ );
+ }
+
+ return timerContent;
},
);
}
diff --git a/comwell_key_app/lib/overview/components/bill_download_modal.dart b/comwell_key_app/lib/overview/components/bill_download_modal.dart
index ff779e22..40005e60 100644
--- a/comwell_key_app/lib/overview/components/bill_download_modal.dart
+++ b/comwell_key_app/lib/overview/components/bill_download_modal.dart
@@ -4,16 +4,19 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
class BillDownloadModal extends StatelessWidget {
- final TextEditingController emailController = TextEditingController();
+ final TextEditingController emailController;
final String initialEmail;
final VoidCallback onDownload;
BillDownloadModal(
- {super.key, required this.onDownload, required this.initialEmail});
+ {super.key, required this.onDownload, required this.initialEmail})
+ : emailController = TextEditingController(text: initialEmail);
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
+ final bottomInset = MediaQuery.of(context).viewInsets.bottom;
+
return ClipRRect(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16),
@@ -22,8 +25,13 @@ class BillDownloadModal extends StatelessWidget {
child: Container(
color: Colors.white,
child: SafeArea(
- child: Padding(
- padding: const EdgeInsets.all(16.0),
+ child: SingleChildScrollView(
+ padding: EdgeInsets.only(
+ left: 16,
+ right: 16,
+ top: 16,
+ bottom: 16 + bottomInset,
+ ),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
diff --git a/comwell_key_app/lib/profile/components/comwell_club_container.dart b/comwell_key_app/lib/profile/components/comwell_club_container.dart
index d2bd505f..cc04bc00 100644
--- a/comwell_key_app/lib/profile/components/comwell_club_container.dart
+++ b/comwell_key_app/lib/profile/components/comwell_club_container.dart
@@ -1,8 +1,10 @@
import 'package:comwell_key_app/profile/components/comwell_club_signup_bottom_sheet.dart';
+import 'package:comwell_key_app/profile/cubit/profile_cubit.dart';
import 'package:comwell_key_app/profile_settings/model/user.dart';
import 'package:comwell_key_app/themes/light_theme.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
class ComwellClubContainer extends StatelessWidget {
final User user;
@@ -11,6 +13,8 @@ class ComwellClubContainer extends StatelessWidget {
@override
Widget build(BuildContext context) {
+ final cubit = context.read<ProfileCubit>();
+
return Container(
margin: const EdgeInsets.symmetric(horizontal: 16),
padding: const EdgeInsets.symmetric(vertical: 16),
@@ -28,10 +32,13 @@ class ComwellClubContainer extends StatelessWidget {
context: context,
isScrollControlled: true,
backgroundColor: Colors.white,
- builder: (context) => ComwellClubSignupBottomSheet(user: user),
+ builder: (_) => BlocProvider.value(
+ value: cubit,
+ child: ComwellClubSignupBottomSheet(user: user),
+ ),
);
if (context.mounted) {
- onSignupClick;
+ onSignupClick();
}
},
child: Column(
diff --git a/comwell_key_app/lib/profile/cubit/profile_cubit.dart b/comwell_key_app/lib/profile/cubit/profile_cubit.dart
index 87a70e81..d517bbde 100644
--- a/comwell_key_app/lib/profile/cubit/profile_cubit.dart
+++ b/comwell_key_app/lib/profile/cubit/profile_cubit.dart
@@ -60,7 +60,7 @@ class ProfileCubit extends Cubit<ProfileState> {
sendPageViewEvent();
if (!isClosed) emit(ProfileState(user: user, isLoading: false));
} catch (e) {
- if (!isClosed) emit(state.setError(Error()));
+ if (!isClosed) emit(ProfileState(isLoading: false, error: Error()));
}
}
@@ -71,7 +71,7 @@ class ProfileCubit extends Cubit<ProfileState> {
if (!isClosed) emit(ProfileState(user: user, isLoading: false));
} catch (e) {
- if (!isClosed) emit(state.setError(Error()));
+ if (!isClosed) emit(ProfileState(isLoading: false, error: Error()));
}
}
@@ -95,6 +95,14 @@ class ProfileCubit extends Cubit<ProfileState> {
}
Future<dynamic> onComwellClubSignupClick(User user) async {
- return await profileRepository.signupForComwellClub(user);
+ try {
+ emit(const ProfileState(isLoading: true, user: null, error: null));
+ User updatedUser = await profileRepository.signupForComwellClub(user);
+ emit(ProfileState(user: updatedUser, isLoading: false, error: null));
+ return updatedUser;
+ } catch (e) {
+ emit(ProfileState(isLoading: false, error: Error()));
+ rethrow;
+ }
}
}
diff --git a/comwell_key_app/lib/profile/cubit/profile_state.dart b/comwell_key_app/lib/profile/cubit/profile_state.dart
index d8b93cf1..173bdbac 100644
--- a/comwell_key_app/lib/profile/cubit/profile_state.dart
+++ b/comwell_key_app/lib/profile/cubit/profile_state.dart
@@ -10,7 +10,7 @@ class ProfileState extends Equatable {
const ProfileState({this.error, required this.isLoading, this.user, this.isToSAccepted = false, this.isNewsletterAccepted = false});
@override
- List<Object> get props => [isLoading, isToSAccepted, isNewsletterAccepted];
+ List<Object?> get props => [isLoading, isToSAccepted, isNewsletterAccepted, error, user];
const ProfileState.initial()
: isLoading = false,
diff --git a/comwell_key_app/lib/services/models/user_permissions.dart b/comwell_key_app/lib/services/models/user_permissions.dart
index 2eb8a2c7..cfabe26a 100644
--- a/comwell_key_app/lib/services/models/user_permissions.dart
+++ b/comwell_key_app/lib/services/models/user_permissions.dart
@@ -4,23 +4,23 @@ part '../../.generated/services/models/user_permissions.g.dart';
@JsonSerializable()
class UserPermissions {
- @JsonKey(name: 'GuestOptIn1')
+ @JsonKey(name: 'GuestOptIn1', defaultValue: false)
final bool guestOptIn1;
- @JsonKey(name: 'GuestOptIn2')
+ @JsonKey(name: 'GuestOptIn2', defaultValue: false)
final bool guestOptIn2;
- @JsonKey(name: 'GuestOptIn3')
+ @JsonKey(name: 'GuestOptIn3', defaultValue: false)
final bool guestOptIn3;
- @JsonKey(name: 'GuestOptIn4')
+ @JsonKey(name: 'GuestOptIn4', defaultValue: false)
final bool guestOptIn4;
UserPermissions({
- required this.guestOptIn1,
- required this.guestOptIn2,
- required this.guestOptIn3,
- required this.guestOptIn4,
+ this.guestOptIn1 = false,
+ this.guestOptIn2 = false,
+ this.guestOptIn3 = false,
+ this.guestOptIn4 = false,
});
factory UserPermissions.fromJson(Map<String, dynamic> json) =>
diff --git a/comwell_key_app/lib/utils/seos_repository.dart b/comwell_key_app/lib/utils/seos_repository.dart
index 4ab55cce..c53c0dec 100644
--- a/comwell_key_app/lib/utils/seos_repository.dart
+++ b/comwell_key_app/lib/utils/seos_repository.dart
@@ -1,7 +1,7 @@
import 'package:comwell_key_app/services/api.dart';
import 'package:comwell_key_app/utils/locator.dart';
import 'package:comwell_key_app/utils/secure_storage.dart';
-import 'package:flutter/gestures.dart';
+
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';