Skip to content

Commit f7f68c6

Browse files
keyurgit45Rijuth Menon
and
Rijuth Menon
authored
fix: Unable to update an offline alarm to a shared alarm (#459)
* fix: issue 284 Display 'No Alarm Scheduled' Message When No Alarm is Set * refactor code * fix: issue 284 timer was not getting refreshed when stream is being updated. * fix: update an offline alarm to shared alarm * fix: update an offline alarm to shared alarm * Delete pubspec.lock --------- Co-authored-by: Rijuth Menon <[email protected]>
1 parent ecf352f commit f7f68c6

File tree

4 files changed

+153
-97
lines changed

4 files changed

+153
-97
lines changed

lib/app/modules/addOrUpdateAlarm/controllers/add_or_update_alarm_controller.dart

Lines changed: 100 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ class AddOrUpdateAlarmController extends GetxController {
4444
final shakeTimes = 0.obs;
4545
final isPedometerEnabled = false.obs;
4646
final numberOfSteps = 0.obs;
47-
var ownerId = '';
47+
var ownerId = ''.obs; // id -> owner of the alarm
48+
var ownerName = ''.obs; // name -> owner of the alarm
49+
var userId = ''.obs; // id -> loggedin user
50+
var userName = ''.obs; // name -> loggedin user
4851
final mutexLock = false.obs;
49-
var lastEditedUserId = '';
50-
var ownerName = '';
52+
var lastEditedUserId = ''.obs;
5153
final sharedUserIds = <String>[].obs;
52-
AlarmModel? alarmRecord = Get.arguments;
54+
var alarmRecord = Rxn<AlarmModel>(null);
5355
final RxMap offsetDetails = {}.obs;
5456
final offsetDuration = 0.obs;
5557
final isOffsetBefore = true.obs;
@@ -97,7 +99,7 @@ class AddOrUpdateAlarmController extends GetxController {
9799
Future<List<UserModel?>> fetchUserDetailsForSharedUsers() async {
98100
List<UserModel?> userDetails = [];
99101

100-
for (String userId in alarmRecord?.sharedUserIds ?? []) {
102+
for (String userId in alarmRecord.value?.sharedUserIds ?? []) {
101103
userDetails.add(await FirestoreDb.fetchUserDetails(userId));
102104
}
103105

@@ -398,9 +400,10 @@ class AddOrUpdateAlarmController extends GetxController {
398400

399401
createAlarm(AlarmModel alarmData) async {
400402
if (isSharedAlarmEnabled.value == true) {
401-
alarmRecord = await FirestoreDb.addAlarm(userModel.value, alarmData);
403+
alarmRecord.value =
404+
await FirestoreDb.addAlarm(userModel.value, alarmData);
402405
} else {
403-
alarmRecord = await IsarDb.addAlarm(alarmData);
406+
alarmRecord.value = await IsarDb.addAlarm(alarmData);
404407
}
405408

406409
Future.delayed(const Duration(seconds: 1), () {
@@ -626,25 +629,23 @@ class AddOrUpdateAlarmController extends GetxController {
626629
if (isSharedAlarmEnabled.value == true) {
627630
// Making sure the alarm wasn't suddenly updated to be an
628631
// online (shared) alarm
629-
if (await IsarDb.doesAlarmExist(alarmRecord!.alarmID) == false) {
630-
alarmData.firestoreId = alarmRecord!.firestoreId;
631-
await FirestoreDb.updateAlarm(alarmRecord!.ownerId, alarmData);
632+
if (await IsarDb.doesAlarmExist(alarmRecord.value!.alarmID) == false) {
633+
alarmData.firestoreId = alarmRecord.value!.firestoreId;
634+
await FirestoreDb.updateAlarm(alarmRecord.value!.ownerId, alarmData);
632635
} else {
633636
// Deleting alarm on IsarDB to ensure no duplicate entry
634-
await IsarDb.deleteAlarm(alarmRecord!.isarId);
637+
await IsarDb.deleteAlarm(alarmRecord.value!.isarId);
635638
createAlarm(alarmData);
636639
}
637640
} else {
638641
// Making sure the alarm wasn't suddenly updated to be an offline alarm
639-
if (await IsarDb.doesAlarmExist(alarmRecord!.alarmID) == true) {
640-
alarmData.isarId = alarmRecord!.isarId;
642+
if (await IsarDb.doesAlarmExist(alarmRecord.value!.alarmID) == true) {
643+
alarmData.isarId = alarmRecord.value!.isarId;
641644
await IsarDb.updateAlarm(alarmData);
642645
} else {
643646
// Deleting alarm on firestore to ensure no duplicate entry
644647
await FirestoreDb.deleteAlarm(
645-
userModel.value,
646-
alarmRecord!.firestoreId!,
647-
);
648+
userModel.value, alarmRecord.value!.firestoreId!);
648649
createAlarm(alarmData);
649650
}
650651
}
@@ -660,39 +661,40 @@ class AddOrUpdateAlarmController extends GetxController {
660661
void onInit() async {
661662
super.onInit();
662663

664+
alarmRecord.value = Get.arguments;
663665
userModel.value = homeController.userModel.value;
664666
if (userModel.value != null) {
665-
ownerId = userModel.value!.id;
666-
ownerName = userModel.value!.fullName;
667-
lastEditedUserId = userModel.value!.id;
667+
userId.value = userModel.value!.id;
668+
userName.value = userModel.value!.fullName;
669+
lastEditedUserId.value = userModel.value!.id;
668670
}
669671

670672
// listens to the userModel declared in homeController and updates on signup event
671673
homeController.userModel.stream.listen((UserModel? user) {
672674
userModel.value = user;
673675
if (user != null) {
674-
ownerId = user.id;
675-
ownerName = user.fullName;
676-
lastEditedUserId = user.id;
676+
userId.value = user.id;
677+
userName.value = user.fullName;
678+
lastEditedUserId.value = user.id;
677679
}
678680
});
679681

680682
if (Get.arguments != null) {
681-
snoozeDuration.value = alarmRecord!.snoozeDuration;
682-
gradient.value = alarmRecord!.gradient;
683-
volMin.value = alarmRecord!.volMin;
684-
volMax.value = alarmRecord!.volMax;
685-
isOneTime.value = alarmRecord!.isOneTime;
686-
deleteAfterGoesOff.value = alarmRecord!.deleteAfterGoesOff;
687-
label.value = alarmRecord!.label;
688-
customRingtoneName.value = alarmRecord!.ringtoneName;
689-
note.value = alarmRecord!.note;
690-
showMotivationalQuote.value = alarmRecord!.showMotivationalQuote;
691-
692-
sharedUserIds.value = alarmRecord!.sharedUserIds!;
683+
snoozeDuration.value = alarmRecord.value!.snoozeDuration;
684+
gradient.value = alarmRecord.value!.gradient;
685+
volMin.value = alarmRecord.value!.volMin;
686+
volMax.value = alarmRecord.value!.volMax;
687+
isOneTime.value = alarmRecord.value!.isOneTime;
688+
deleteAfterGoesOff.value = alarmRecord.value!.deleteAfterGoesOff;
689+
label.value = alarmRecord.value!.label;
690+
customRingtoneName.value = alarmRecord.value!.ringtoneName;
691+
note.value = alarmRecord.value!.note;
692+
showMotivationalQuote.value = alarmRecord.value!.showMotivationalQuote;
693+
694+
sharedUserIds.value = alarmRecord.value!.sharedUserIds!;
693695
// Reinitializing all values here
694696
selectedTime.value = Utils.timeOfDayToDateTime(
695-
Utils.stringToTimeOfDay(alarmRecord!.alarmTime),
697+
Utils.stringToTimeOfDay(alarmRecord.value!.alarmTime),
696698
);
697699
hours.value = selectedTime.value.hour;
698700
minutes.value = selectedTime.value.minute;
@@ -716,16 +718,16 @@ class AddOrUpdateAlarmController extends GetxController {
716718
repeatDays,
717719
);
718720

719-
repeatDays.value = alarmRecord!.days;
721+
repeatDays.value = alarmRecord.value!.days;
720722
// Shows the selected days in UI
721723
daysRepeating.value = Utils.getRepeatDays(repeatDays);
722724

723725
// Setting the old values for all the auto dismissal
724-
isActivityenabled.value = alarmRecord!.isActivityEnabled;
725-
activityInterval.value = alarmRecord!.activityInterval ~/ 60000;
726+
isActivityenabled.value = alarmRecord.value!.isActivityEnabled;
727+
activityInterval.value = alarmRecord.value!.activityInterval ~/ 60000;
726728

727-
isLocationEnabled.value = alarmRecord!.isLocationEnabled;
728-
selectedPoint.value = Utils.stringToLatLng(alarmRecord!.location);
729+
isLocationEnabled.value = alarmRecord.value!.isLocationEnabled;
730+
selectedPoint.value = Utils.stringToLatLng(alarmRecord.value!.location);
729731
// Shows the marker in UI
730732
markersList.add(
731733
Marker(
@@ -738,53 +740,63 @@ class AddOrUpdateAlarmController extends GetxController {
738740
),
739741
);
740742

741-
isWeatherEnabled.value = alarmRecord!.isWeatherEnabled;
743+
isWeatherEnabled.value = alarmRecord.value!.isWeatherEnabled;
742744
weatherTypes.value = Utils.getFormattedWeatherTypes(selectedWeather);
743745

744-
isMathsEnabled.value = alarmRecord!.isMathsEnabled;
745-
numMathsQuestions.value = alarmRecord!.numMathsQuestions;
746-
mathsDifficulty.value = Difficulty.values[alarmRecord!.mathsDifficulty];
747-
mathsSliderValue.value = alarmRecord!.mathsDifficulty.toDouble();
746+
isMathsEnabled.value = alarmRecord.value!.isMathsEnabled;
747+
numMathsQuestions.value = alarmRecord.value!.numMathsQuestions;
748+
mathsDifficulty.value =
749+
Difficulty.values[alarmRecord.value!.mathsDifficulty];
750+
mathsSliderValue.value = alarmRecord.value!.mathsDifficulty.toDouble();
751+
752+
isShakeEnabled.value = alarmRecord.value!.isShakeEnabled;
753+
shakeTimes.value = alarmRecord.value!.shakeTimes;
748754

749-
isShakeEnabled.value = alarmRecord!.isShakeEnabled;
750-
shakeTimes.value = alarmRecord!.shakeTimes;
755+
isPedometerEnabled.value = alarmRecord.value!.isPedometerEnabled;
756+
numberOfSteps.value = alarmRecord.value!.numberOfSteps;
751757

752-
isPedometerEnabled.value = alarmRecord!.isPedometerEnabled;
753-
numberOfSteps.value = alarmRecord!.numberOfSteps;
758+
isQrEnabled.value = alarmRecord.value!.isQrEnabled;
759+
qrValue.value = alarmRecord.value!.qrValue;
760+
detectedQrValue.value = alarmRecord.value!.qrValue;
754761

755-
isQrEnabled.value = alarmRecord!.isQrEnabled;
756-
qrValue.value = alarmRecord!.qrValue;
757-
detectedQrValue.value = alarmRecord!.qrValue;
762+
alarmID = alarmRecord.value!.alarmID;
758763

759-
alarmID = alarmRecord!.alarmID;
760-
ownerId = alarmRecord!.ownerId;
761-
ownerName = alarmRecord!.ownerName;
762-
mutexLock.value = alarmRecord!.mutexLock;
764+
// if alarmRecord is null or alarmRecord.ownerId is null,
765+
// then assign the current logged-in user as the owner.
766+
if (alarmRecord.value == null || alarmRecord.value!.ownerId.isEmpty) {
767+
ownerId.value = userId.value;
768+
ownerName.value = userName.value;
769+
} else {
770+
ownerId.value = alarmRecord.value!.ownerId;
771+
ownerName.value = alarmRecord.value!.ownerName;
772+
}
763773

764-
isSharedAlarmEnabled.value = alarmRecord!.isSharedAlarmEnabled;
774+
mutexLock.value = alarmRecord.value!.mutexLock;
775+
isSharedAlarmEnabled.value = alarmRecord.value!.isSharedAlarmEnabled;
765776

766777
if (isSharedAlarmEnabled.value) {
767778
selectedTime.value = Utils.timeOfDayToDateTime(
768-
Utils.stringToTimeOfDay(alarmRecord!.mainAlarmTime!),
779+
Utils.stringToTimeOfDay(alarmRecord.value!.mainAlarmTime!),
769780
);
770781

771782
mainAlarmTime.value = Utils.timeOfDayToDateTime(
772-
Utils.stringToTimeOfDay(alarmRecord!.mainAlarmTime!),
783+
Utils.stringToTimeOfDay(alarmRecord.value!.mainAlarmTime!),
773784
);
774-
offsetDetails.value = alarmRecord!.offsetDetails!;
775-
offsetDuration.value =
776-
alarmRecord!.offsetDetails![userModel.value!.id]['offsetDuration'];
777-
isOffsetBefore.value =
778-
alarmRecord!.offsetDetails![userModel.value!.id]['isOffsetBefore'];
785+
offsetDetails.value = alarmRecord.value!.offsetDetails!;
786+
offsetDuration.value = alarmRecord
787+
.value!.offsetDetails![userModel.value!.id]['offsetDuration'];
788+
isOffsetBefore.value = alarmRecord
789+
.value!.offsetDetails![userModel.value!.id]['isOffsetBefore'];
779790
}
780791

781792
// Set lock only if its not locked
782793
if (isSharedAlarmEnabled.value == true &&
783-
alarmRecord!.mutexLock == false) {
784-
alarmRecord!.mutexLock = true;
785-
alarmRecord!.lastEditedUserId = userModel.value!.id;
786-
await FirestoreDb.updateAlarm(alarmRecord!.ownerId, alarmRecord!);
787-
alarmRecord!.mutexLock = false;
794+
alarmRecord.value!.mutexLock == false) {
795+
alarmRecord.value!.mutexLock = true;
796+
alarmRecord.value!.lastEditedUserId = userModel.value!.id;
797+
await FirestoreDb.updateAlarm(
798+
alarmRecord.value!.ownerId, alarmRecord.value!);
799+
alarmRecord.value!.mutexLock = false;
788800
mutexLock.value = false;
789801
}
790802
} else {
@@ -956,16 +968,29 @@ class AddOrUpdateAlarmController extends GetxController {
956968
// We also make sure the doc was not already locked
957969
// If it was suddenly enabled, it will be created newly anyway
958970
if (isSharedAlarmEnabled.value == true &&
959-
alarmRecord!.isSharedAlarmEnabled == true &&
960-
alarmRecord!.mutexLock == false) {
971+
alarmRecord.value!.isSharedAlarmEnabled == true &&
972+
alarmRecord.value!.mutexLock == false) {
961973
AlarmModel updatedModel = updatedAlarmModel();
962-
updatedModel.firestoreId = alarmRecord!.firestoreId;
974+
updatedModel.firestoreId = alarmRecord.value!.firestoreId;
963975
await FirestoreDb.updateAlarm(updatedModel.ownerId, updatedModel);
964976
}
965977
}
966978
}
967979

968980
AlarmModel updatedAlarmModel() {
981+
String _ownerId = '';
982+
String _ownerName = '';
983+
984+
// if alarmRecord is null or alarmRecord.ownerId is null,
985+
// then assign the current logged-in user as the owner.
986+
987+
if (alarmRecord.value == null || alarmRecord.value!.ownerId.isEmpty) {
988+
_ownerId = userId.value;
989+
_ownerName = userName.value;
990+
} else {
991+
_ownerId = alarmRecord.value!.ownerId;
992+
_ownerName = alarmRecord.value!.ownerName;
993+
}
969994
return AlarmModel(
970995
snoozeDuration: snoozeDuration.value,
971996
volMax: volMax.value,
@@ -978,11 +1003,11 @@ class AddOrUpdateAlarmController extends GetxController {
9781003
Utils.timeOfDayToString(TimeOfDay.fromDateTime(selectedTime.value)),
9791004
offsetDetails: offsetDetails,
9801005
sharedUserIds: sharedUserIds,
981-
lastEditedUserId: lastEditedUserId,
1006+
lastEditedUserId: lastEditedUserId.value,
9821007
mutexLock: mutexLock.value,
9831008
alarmID: alarmID,
984-
ownerId: alarmRecord!.ownerId,
985-
ownerName: ownerName,
1009+
ownerId: _ownerId,
1010+
ownerName: _ownerName,
9861011
activityInterval: activityInterval.value * 60000,
9871012
days: repeatDays.toList(),
9881013
alarmTime:

lib/app/modules/addOrUpdateAlarm/views/add_or_update_alarm_view.dart

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
5555
child: Scaffold(
5656
floatingActionButtonLocation:
5757
FloatingActionButtonLocation.centerDocked,
58-
floatingActionButton: (controller.alarmRecord != null &&
58+
floatingActionButton: (controller.alarmRecord.value != null &&
5959
controller.mutexLock.value == true)
6060
? const SizedBox()
6161
: Padding(
@@ -69,7 +69,7 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
6969
MaterialStateProperty.all(kprimaryColor),
7070
),
7171
child: Text(
72-
(controller.alarmRecord == null)
72+
(controller.alarmRecord.value == null)
7373
? 'Save'.tr
7474
: 'Update'.tr,
7575
style:
@@ -112,11 +112,11 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
112112
showMotivationalQuote:
113113
controller.showMotivationalQuote.value,
114114
isOneTime: controller.isOneTime.value,
115-
lastEditedUserId: controller.lastEditedUserId,
115+
lastEditedUserId: controller.lastEditedUserId.value,
116116
mutexLock: controller.mutexLock.value,
117117
alarmID: controller.alarmID,
118-
ownerId: controller.ownerId,
119-
ownerName: controller.ownerName,
118+
ownerId: controller.ownerId.value,
119+
ownerName: controller.ownerName.value,
120120
activityInterval:
121121
controller.activityInterval.value * 60000,
122122
days: controller.repeatDays.toList(),
@@ -176,9 +176,8 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
176176
),
177177
);
178178
}
179-
180179
try {
181-
if (controller.alarmRecord == null) {
180+
if (controller.alarmRecord.value == null) {
182181
await controller.createAlarm(alarmRecord);
183182
} else {
184183
AlarmModel updatedAlarmModel =
@@ -195,7 +194,7 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
195194
),
196195
),
197196
appBar: AppBar(
198-
backgroundColor: (controller.alarmRecord != null &&
197+
backgroundColor: (controller.alarmRecord.value != null &&
199198
controller.mutexLock.value == true)
200199
? themeController.isLightMode.value
201200
? kLightPrimaryBackgroundColor
@@ -206,7 +205,7 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
206205
elevation: 0.0,
207206
centerTitle: true,
208207
iconTheme: Theme.of(context).iconTheme,
209-
title: (controller.alarmRecord != null &&
208+
title: (controller.alarmRecord.value != null &&
210209
controller.mutexLock.value == true)
211210
? const Text('')
212211
: Obx(
@@ -221,7 +220,7 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
221220
),
222221
),
223222
),
224-
body: (controller.alarmRecord != null &&
223+
body: (controller.alarmRecord.value != null &&
225224
controller.mutexLock.value == true)
226225
? Center(
227226
child: Column(
@@ -1040,7 +1039,7 @@ class AddOrUpdateAlarmView extends GetView<AddOrUpdateAlarmController> {
10401039
Obx(
10411040
() => Container(
10421041
child: (controller.isSharedAlarmEnabled.value &&
1043-
controller.alarmRecord != null)
1042+
controller.alarmRecord.value != null)
10441043
? Divider(
10451044
color: themeController.isLightMode.value
10461045
? kLightPrimaryDisabledTextColor

lib/app/modules/addOrUpdateAlarm/views/shared_users_tile.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class SharedUsers extends StatelessWidget {
2424
return Obx(
2525
() => Container(
2626
child: (controller.isSharedAlarmEnabled.value &&
27-
controller.alarmRecord != null)
28-
? (controller.alarmRecord!.ownerId !=
27+
controller.alarmRecord.value != null)
28+
? (controller.alarmRecord.value!.ownerId !=
2929
controller.userModel.value!.id)
3030
? ListTile(
3131
title: Text(
@@ -37,7 +37,7 @@ class SharedUsers extends StatelessWidget {
3737
),
3838
),
3939
trailing: Text(
40-
controller.alarmRecord!.ownerName,
40+
controller.alarmRecord.value!.ownerName,
4141
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
4242
color: themeController.isLightMode.value
4343
? kLightPrimaryDisabledTextColor

0 commit comments

Comments
 (0)