Files
wgu-c971/WguApp/Views/AssessmentPage.xaml.cs

137 lines
5.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WguApp.Models;
using WguApp.Services;
namespace WguApp.Views;
public partial class AssessmentPage : ContentPage
{
private Assessment _assessment;
public AssessmentPage(Assessment assessment)
{
InitializeComponent();
_assessment = assessment;
Title = assessment.Name;
TitleEntry.Text = _assessment.Name;
StartDatePicker.Date = _assessment.StartDate;
EndDatePicker.Date = _assessment.EndDate;
StartNotifCheck.IsChecked = _assessment.StartNotifCheck;
EndNotifCheck.IsChecked = _assessment.EndNotifCheck;
StartNotifCheck.CheckedChanged += async (sender, e) => { await ToggleStartNotification(); };
EndNotifCheck.CheckedChanged += async (sender, e) => { await ToggleEndNotification(); };
}
private async Task ToggleStartNotification()
{
if (StartNotifCheck.IsChecked)
{
var id = await LocalNotificationService.ScheduleNotification($"{_assessment.Name} Start Reminder", $"Your assessment '{_assessment.Id} starts in 12 hours'", _assessment.StartDate.Subtract(TimeSpan.FromHours(12)));
_assessment.StartNotifId = id ?? 0;
LoggerService.LogToFile($"{_assessment.Id}:{_assessment.Name} set start notification {_assessment.StartNotifId}");
}
else
{
var res = await LocalNotificationService.CancelNotification(_assessment.StartNotifId);
LoggerService.LogToFile($"{_assessment.Id}:{_assessment.Name} canceled start notification {_assessment.StartNotifId}");
_assessment.StartNotifId = 0;
}
_assessment.StartNotifCheck = StartNotifCheck.IsChecked;
}
private async Task ToggleEndNotification()
{
if (EndNotifCheck.IsChecked)
{
var id = await LocalNotificationService.ScheduleNotification($"{_assessment.Name} End Reminder", $"Your assessment '{_assessment.Id} ends in 12 hours'", _assessment.EndDate.Subtract(TimeSpan.FromHours(12)));
_assessment.EndNotifId = id ?? 0;
LoggerService.LogToFile($"{_assessment.Id}:{_assessment.Name} set end notification {_assessment.EndNotifId}");
}
else
{
var res = await LocalNotificationService.CancelNotification(_assessment.EndNotifId);
LoggerService.LogToFile($"{_assessment.Id}:{_assessment.Name} canceled end notification {_assessment.EndNotifId}");
_assessment.EndNotifId = 0;
}
_assessment.EndNotifCheck = EndNotifCheck.IsChecked;
}
private (string msg, bool result) ValidateFields()
{
var message = string.Empty;
if (string.IsNullOrWhiteSpace(TitleEntry.Text)) message += "Title cannot be blank\n";
if (StartDatePicker.Date > EndDatePicker.Date) message += "Start Date cannot be after the End Date\n";
return string.IsNullOrWhiteSpace(message) ? (message, true) : (message, false);
}
private async Task<bool> Save()
{
var validationResult = ValidateFields();
if (!validationResult.result)
{
await DisplayAlert("Validation Error", validationResult.msg, "Ok");
return false;
}
_assessment.Name = TitleEntry.Text;
_assessment.StartDate = StartDatePicker.Date;
_assessment.EndDate = EndDatePicker.Date;
_assessment.StartNotifCheck = StartNotifCheck.IsChecked;
_assessment.EndNotifCheck = EndNotifCheck.IsChecked;
var updateResult = await DatabaseService.UpdateAssessment(_assessment);
if (updateResult)
{
await DisplayAlert("Info", $"{_assessment.Name} Saved!", "Ok");
}
else
{
await DisplayAlert("Error", "Could not save term", "Ok");
}
Title = _assessment.Name;
if (_assessment.StartNotifId != 0)
{
await LocalNotificationService.UpdateNotification(_assessment.StartNotifId, $"{_assessment.Name} Start Reminder",
$"Your course '{_assessment.Id} starts in 12 hours'", _assessment.StartDate.Subtract(TimeSpan.FromHours(12)));
}
if (_assessment.EndNotifId != 0)
{
await LocalNotificationService.UpdateNotification(_assessment.EndNotifId, $"{_assessment.Name} End Reminder",
$"Your course '{_assessment.Id} ends in 12 hours'", _assessment.EndDate.Subtract(TimeSpan.FromHours(12)));
}
return true;
}
private async void SaveButton_OnClicked(object? sender, EventArgs e)
{
await Save();
}
private async void DeleteButton_OnClicked(object? sender, EventArgs e)
{
var result = await DisplayAlert("Delete Course", $"Do you really want to delete '{_assessment.Name}'? This action cannot be undone.", "Delete", "Cancel");
if (!result) return;
await DatabaseService.DeleteAssessment(_assessment);
await Navigation.PopAsync();
}
}