2024-11-10 23:28:25 +01:00
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Globalization;
|
2026-01-01 15:02:40 +01:00
|
|
|
using System.Linq;
|
2024-11-10 23:28:25 +01:00
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
|
using CommunityToolkit.Mvvm.Messaging;
|
|
|
|
|
using Wino.Core.Domain.Interfaces;
|
|
|
|
|
using Wino.Core.Domain.Translations;
|
|
|
|
|
using Wino.Core.ViewModels;
|
|
|
|
|
using Wino.Messaging.Client.Calendar;
|
|
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
namespace Wino.Calendar.ViewModels;
|
|
|
|
|
|
|
|
|
|
public partial class CalendarSettingsPageViewModel : CalendarBaseViewModel
|
2024-11-10 23:28:25 +01:00
|
|
|
{
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial double CellHourHeight { get; set; }
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial int SelectedFirstDayOfWeekIndex { get; set; }
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial bool Is24HourHeaders { get; set; }
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial TimeSpan WorkingHourStart { get; set; }
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial TimeSpan WorkingHourEnd { get; set; }
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial List<string> DayNames { get; set; } = [];
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial int WorkingDayStartIndex { get; set; }
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
[ObservableProperty]
|
2025-12-31 13:28:53 +01:00
|
|
|
public partial int WorkingDayEndIndex { get; set; }
|
2026-01-01 15:02:40 +01:00
|
|
|
|
|
|
|
|
[ObservableProperty]
|
|
|
|
|
public partial List<string> ReminderOptions { get; set; } = [];
|
|
|
|
|
|
|
|
|
|
[ObservableProperty]
|
|
|
|
|
public partial int SelectedDefaultReminderIndex { get; set; }
|
|
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
public IPreferencesService PreferencesService { get; }
|
2026-01-01 15:02:40 +01:00
|
|
|
private readonly ICalendarService _calendarService;
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
private readonly bool _isLoaded = false;
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2026-01-01 15:02:40 +01:00
|
|
|
public CalendarSettingsPageViewModel(IPreferencesService preferencesService, ICalendarService calendarService)
|
2025-05-18 14:06:25 +02:00
|
|
|
{
|
|
|
|
|
PreferencesService = preferencesService;
|
2026-01-01 15:02:40 +01:00
|
|
|
_calendarService = calendarService;
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
var currentLanguageLanguageCode = WinoTranslationDictionary.GetLanguageFileNameRelativePath(preferencesService.CurrentLanguage);
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
var cultureInfo = new CultureInfo(currentLanguageLanguageCode);
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
// Populate the day names list
|
|
|
|
|
for (var i = 0; i < 7; i++)
|
|
|
|
|
{
|
2025-12-31 13:28:53 +01:00
|
|
|
DayNames.Add(cultureInfo.DateTimeFormat.DayNames[i]);
|
2025-05-18 14:06:25 +02:00
|
|
|
}
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
var cultureFirstDayName = cultureInfo.DateTimeFormat.GetDayName(preferencesService.FirstDayOfWeek);
|
2025-12-31 13:28:53 +01:00
|
|
|
SelectedFirstDayOfWeekIndex = DayNames.IndexOf(cultureFirstDayName);
|
|
|
|
|
Is24HourHeaders = preferencesService.Prefer24HourTimeFormat;
|
|
|
|
|
WorkingHourStart = preferencesService.WorkingHourStart;
|
|
|
|
|
WorkingHourEnd = preferencesService.WorkingHourEnd;
|
|
|
|
|
CellHourHeight = preferencesService.HourHeight;
|
|
|
|
|
WorkingDayStartIndex = DayNames.IndexOf(cultureInfo.DateTimeFormat.GetDayName(preferencesService.WorkingDayStart));
|
|
|
|
|
WorkingDayEndIndex = DayNames.IndexOf(cultureInfo.DateTimeFormat.GetDayName(preferencesService.WorkingDayEnd));
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2026-01-01 15:02:40 +01:00
|
|
|
// Initialize reminder options
|
|
|
|
|
var predefinedMinutes = _calendarService.GetPredefinedReminderMinutes();
|
|
|
|
|
ReminderOptions.Add("None");
|
|
|
|
|
foreach (var minutes in predefinedMinutes)
|
|
|
|
|
{
|
|
|
|
|
var displayText = minutes switch
|
|
|
|
|
{
|
|
|
|
|
>= 60 => $"{minutes / 60} Hour{(minutes / 60 > 1 ? "s" : "")}",
|
|
|
|
|
_ => $"{minutes} Minute{(minutes > 1 ? "s" : "")}"
|
|
|
|
|
};
|
|
|
|
|
ReminderOptions.Add(displayText);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set selected index based on current default reminder setting
|
|
|
|
|
if (preferencesService.DefaultReminderDurationInSeconds == 0)
|
|
|
|
|
{
|
|
|
|
|
SelectedDefaultReminderIndex = 0; // None
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var minutes = (int)(preferencesService.DefaultReminderDurationInSeconds / 60);
|
|
|
|
|
var index = Array.IndexOf(predefinedMinutes, minutes);
|
|
|
|
|
SelectedDefaultReminderIndex = index >= 0 ? index + 1 : 0;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
_isLoaded = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
partial void OnCellHourHeightChanged(double oldValue, double newValue) => SaveSettings();
|
|
|
|
|
partial void OnIs24HourHeadersChanged(bool value) => SaveSettings();
|
|
|
|
|
partial void OnSelectedFirstDayOfWeekIndexChanged(int value) => SaveSettings();
|
|
|
|
|
partial void OnWorkingHourStartChanged(TimeSpan value) => SaveSettings();
|
|
|
|
|
partial void OnWorkingHourEndChanged(TimeSpan value) => SaveSettings();
|
|
|
|
|
partial void OnWorkingDayStartIndexChanged(int value) => SaveSettings();
|
|
|
|
|
partial void OnWorkingDayEndIndexChanged(int value) => SaveSettings();
|
2026-01-01 15:02:40 +01:00
|
|
|
partial void OnSelectedDefaultReminderIndexChanged(int value) => SaveSettings();
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
public void SaveSettings()
|
|
|
|
|
{
|
|
|
|
|
if (!_isLoaded) return;
|
2024-11-10 23:28:25 +01:00
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
PreferencesService.FirstDayOfWeek = SelectedFirstDayOfWeekIndex switch
|
2024-11-10 23:28:25 +01:00
|
|
|
{
|
2025-05-18 14:06:25 +02:00
|
|
|
0 => DayOfWeek.Sunday,
|
|
|
|
|
1 => DayOfWeek.Monday,
|
|
|
|
|
2 => DayOfWeek.Tuesday,
|
|
|
|
|
3 => DayOfWeek.Wednesday,
|
|
|
|
|
4 => DayOfWeek.Thursday,
|
|
|
|
|
5 => DayOfWeek.Friday,
|
|
|
|
|
6 => DayOfWeek.Saturday,
|
|
|
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
PreferencesService.WorkingDayStart = WorkingDayStartIndex switch
|
|
|
|
|
{
|
|
|
|
|
0 => DayOfWeek.Sunday,
|
|
|
|
|
1 => DayOfWeek.Monday,
|
|
|
|
|
2 => DayOfWeek.Tuesday,
|
|
|
|
|
3 => DayOfWeek.Wednesday,
|
|
|
|
|
4 => DayOfWeek.Thursday,
|
|
|
|
|
5 => DayOfWeek.Friday,
|
|
|
|
|
6 => DayOfWeek.Saturday,
|
|
|
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
PreferencesService.WorkingDayEnd = WorkingDayEndIndex switch
|
|
|
|
|
{
|
|
|
|
|
0 => DayOfWeek.Sunday,
|
|
|
|
|
1 => DayOfWeek.Monday,
|
|
|
|
|
2 => DayOfWeek.Tuesday,
|
|
|
|
|
3 => DayOfWeek.Wednesday,
|
|
|
|
|
4 => DayOfWeek.Thursday,
|
|
|
|
|
5 => DayOfWeek.Friday,
|
|
|
|
|
6 => DayOfWeek.Saturday,
|
|
|
|
|
_ => throw new ArgumentOutOfRangeException()
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
PreferencesService.Prefer24HourTimeFormat = Is24HourHeaders;
|
|
|
|
|
PreferencesService.WorkingHourStart = WorkingHourStart;
|
|
|
|
|
PreferencesService.WorkingHourEnd = WorkingHourEnd;
|
|
|
|
|
PreferencesService.HourHeight = CellHourHeight;
|
|
|
|
|
|
2026-01-01 15:02:40 +01:00
|
|
|
// Save default reminder setting
|
|
|
|
|
if (SelectedDefaultReminderIndex == 0)
|
|
|
|
|
{
|
|
|
|
|
PreferencesService.DefaultReminderDurationInSeconds = 0; // None
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var predefinedMinutes = _calendarService.GetPredefinedReminderMinutes();
|
|
|
|
|
var minutes = predefinedMinutes[SelectedDefaultReminderIndex - 1];
|
|
|
|
|
PreferencesService.DefaultReminderDurationInSeconds = minutes * 60;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-18 14:06:25 +02:00
|
|
|
Messenger.Send(new CalendarSettingsUpdatedMessage());
|
2024-11-10 23:28:25 +01:00
|
|
|
}
|
|
|
|
|
}
|