ollama-app/lib/services/preferences.dart

141 lines
4.0 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import '../main.dart';
class Preferences extends ChangeNotifier {
static final Preferences _instance = Preferences._();
static Preferences get instance => _instance;
Preferences._() {
if (!prefsReady.isCompleted) {
prefsReady.future.then((_) => notifyListeners());
}
}
String? get host => prefs?.getString("host") ?? (useHost ? fixedHost : null);
set host(String? value) {
if (value == null || value.isEmpty) {
prefs?.remove("host");
} else {
prefs?.setString("host", value);
}
notifyListeners();
}
Map<String, String> get hostHeaders =>
(jsonDecode(prefs?.getString("hostHeaders") ?? "{}") as Map).cast();
set hostHeaders(Map value) {
if (value.isEmpty) {
prefs?.remove("hostHeaders");
} else {
prefs?.setString("hostHeaders", jsonEncode(value));
}
notifyListeners();
}
double get timeoutMultiplier => prefs?.getDouble("timeoutMultiplier") ?? 1.0;
set timeoutMultiplier(double value) {
prefs?.setDouble("timeoutMultiplier", value);
notifyListeners();
}
bool get useSystem => prefs?.getBool("useSystem") ?? true;
set useSystem(bool value) {
prefs?.setBool("useSystem", value);
notifyListeners();
}
String? get system => useSystem
? prefs?.getString("system") ?? "You are a helpful assistant."
: null;
set system(String? value) {
if (value == null || value.isEmpty) {
prefs?.remove("system");
} else {
prefs?.setString("system", value);
}
notifyListeners();
}
bool get thinking => prefs?.getBool("thinking") ?? true;
set thinking(bool value) {
prefs?.setBool("thinking", value);
notifyListeners();
}
bool get generateTitles => prefs?.getBool("generateTitles") ?? true;
set generateTitles(bool value) {
prefs?.setBool("generateTitles", value);
notifyListeners();
}
bool get askBeforeDeletion => prefs!.getBool("askBeforeDeletion") ?? false;
set askBeforeDeletion(bool value) {
prefs!.setBool("askBeforeDeletion", value);
notifyListeners();
}
int get keepAlive => int.parse(prefs!.getString("keepAlive") ?? "300");
set keepAlive(int value) {
prefs!.setString("keepAlive", value.toString());
notifyListeners();
}
String? get model => prefs?.getString("model");
set model(String? value) {
if (value == null || value.isEmpty) {
prefs?.remove("model");
} else {
prefs?.setString("model", value);
}
notifyListeners();
}
bool get welcomeFinished => prefs?.getBool("welcomeFinished") ?? false;
set welcomeFinished(bool value) {
prefs?.setBool("welcomeFinished", value);
notifyListeners();
}
bool get enableHaptic => prefs?.getBool("enableHaptic") ?? true;
set enableHaptic(bool value) {
prefs?.setBool("enableHaptic", value);
notifyListeners();
}
ThemeMode get themeMode =>
ThemeMode.values.byName(prefs?.getString("themeMode") ?? "system");
set themeMode(ThemeMode value) {
prefs?.setString("themeMode", value.name);
notifyListeners();
}
bool get themeSystem => prefs?.getBool("themeSystem") ?? false;
set themeSystem(bool value) {
prefs?.setBool("themeSystem", value);
notifyListeners();
}
}
class TimeoutMultiplier {
static Duration calculate(Duration base) =>
base * Preferences.instance.timeoutMultiplier;
/// Short time interval. Equals 3 seconds with default multiplier.
///
/// This multiplier should not be used for AI tasks, as it is too short.
/// Instead, use it for quick checks or UI updates.
static Duration get short => calculate(const Duration(seconds: 3));
/// Medium time interval. Equals 10 seconds with default multiplier.
static Duration get medium => calculate(const Duration(seconds: 10));
/// Long time interval. Equals 30 seconds with default multiplier.
static Duration get long => calculate(const Duration(seconds: 30));
/// Very long time interval. Equals 60 seconds with default multiplier.
static Duration get veryLong => calculate(const Duration(seconds: 60));
}