80 lines
1.7 KiB
C#
80 lines
1.7 KiB
C#
using Microsoft.CommandPalette.Extensions.Toolkit;
|
|
|
|
namespace Olive.Helpers;
|
|
|
|
internal sealed class SettingsManager : JsonSettingsManager
|
|
{
|
|
private const string Namespace = "Olive";
|
|
|
|
public SettingsManager()
|
|
{
|
|
FilePath = SettingsJsonPath();
|
|
Settings.Add(_klipyApiKey);
|
|
Settings.Add(_resultCount);
|
|
|
|
// Load settings from file upon initialization
|
|
LoadSettings();
|
|
|
|
Settings.SettingsChanged += (_, _) => SaveSettings();
|
|
}
|
|
|
|
public string SettingsPath => FilePath;
|
|
|
|
private readonly TextSetting _klipyApiKey = new(
|
|
Namespaced(nameof(KlipyApiKey)),
|
|
"Klipy API key",
|
|
"Private key used to call the Klipy API. It stays stored locally in Olive settings.",
|
|
string.Empty)
|
|
{
|
|
Placeholder = "Required",
|
|
IsRequired = true,
|
|
ErrorMessage = "Klipy API key is required."
|
|
};
|
|
|
|
private readonly IntegerSetting _resultCount = new(
|
|
Namespaced(nameof(ResultCount)),
|
|
"Result count",
|
|
"Number of GIF results to load for each search.",
|
|
50,
|
|
20,
|
|
100)
|
|
{
|
|
Placeholder = "Min 20, max 100",
|
|
IsRequired = true,
|
|
ErrorMessage = "Enter a number between 20 and 100."
|
|
};
|
|
|
|
public string KlipyApiKey
|
|
{
|
|
get
|
|
{
|
|
LoadSettings();
|
|
return _klipyApiKey.Value ?? string.Empty;
|
|
}
|
|
}
|
|
|
|
public bool HasKlipyApiKey => !string.IsNullOrWhiteSpace(KlipyApiKey);
|
|
|
|
public int ResultCount
|
|
{
|
|
get
|
|
{
|
|
LoadSettings();
|
|
return Math.Clamp(_resultCount.Value, 30, 100);
|
|
}
|
|
}
|
|
|
|
private static string SettingsJsonPath()
|
|
{
|
|
var directory = Utilities.BaseSettingsPath("Olive");
|
|
Directory.CreateDirectory(directory);
|
|
|
|
return Path.Combine(directory, "settings.json");
|
|
}
|
|
|
|
private static string Namespaced(string propertyName)
|
|
{
|
|
return $"{Namespace}.{propertyName}";
|
|
}
|
|
}
|