From 2a1511ab9a15e1daad83eda673d0707ea5da0050 Mon Sep 17 00:00:00 2001 From: zoe Date: Fri, 12 Aug 2022 19:00:09 +0200 Subject: [PATCH] refactor settings --- lib/business_logic/auth/oauth.dart | 21 ++- lib/business_logic/settings.dart | 160 +++++++++------------- lib/business_logic/timeline/timeline.dart | 11 +- lib/global.dart | 3 + lib/main.dart | 6 +- lib/pages/login.dart | 4 +- lib/pages/settings/account.dart | 22 ++- lib/pages/settings/app.dart | 16 +-- 8 files changed, 100 insertions(+), 143 deletions(-) diff --git a/lib/business_logic/auth/oauth.dart b/lib/business_logic/auth/oauth.dart index 49c0d1d..589a156 100644 --- a/lib/business_logic/auth/oauth.dart +++ b/lib/business_logic/auth/oauth.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:url_launcher/url_launcher.dart'; import '../../global.dart' as global; -import '../../business_logic/settings.dart' as settings; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart' as shelf_io; @@ -29,7 +28,7 @@ class App { redirectUri: json["redirect_uri"].toString(), clientId: json["client_id"].toString(), clientSecret: json["client_secret"].toString()); - settings.saveApp(app); + global.settings!.saveApp(app); return app; } } @@ -38,7 +37,7 @@ Response readAuthcode(Request request) { Map params = request.url.queryParameters; if (params.containsKey("code") && params["code"] != null) { String code = params["code"].toString(); - settings.saveAuthCode(code); + global.settings!.saveAuthCode(code); } return Response(308, headers: {"Content-Type": "text/html; charset=UTF-8"}, @@ -54,7 +53,7 @@ Future handleFullOauth() async { return response.statusCode; } - await settings.saveAuthCode(""); + await global.settings!.saveAuthCode(""); var handler = const Pipeline().addHandler(readAuthcode); var server = await shelf_io.serve(handler, 'localhost', 1312); await pollCode(); @@ -70,13 +69,13 @@ Future pollCode() async { String code = ""; while (code == "") { await Future.delayed(const Duration(seconds: 3)); - code = await settings.loadAuthCode(); + code = global.settings!.authCode; } return code; } Future doOauthFlow() async { - String url = await settings.loadInstanceUrl(); + String url = global.settings!.instanceUrl; try { http.Response response = await registerApp(url); openBrowserForAuthCode(url, App.fromJson(jsonDecode(response.body))); @@ -121,10 +120,10 @@ void openBrowserForAuthCode(String baseurl, App app) { } Future refreshToken() async { - final authCode = await settings.loadAuthCode(); - final appId = await settings.loadClientId(); - final clientSecret = await settings.loadClientSecret(); - final baseurl = await settings.loadInstanceUrl(); + final authCode = global.settings!.authCode; + final appId = global.settings!.clientId; + final clientSecret = global.settings!.clientSecret; + final baseurl = global.settings!.instanceUrl; Uri url = Uri.https(baseurl, "/oauth/token"); final response = await http.post( @@ -142,7 +141,7 @@ Future refreshToken() async { if (response.statusCode == 200) { final dec = jsonDecode(response.body); final accessToken = dec["access_token"]!; - await settings.saveToken(accessToken); + await global.settings!.saveToken(accessToken); } return response.statusCode; } diff --git a/lib/business_logic/settings.dart b/lib/business_logic/settings.dart index 899b553..8f2332d 100644 --- a/lib/business_logic/settings.dart +++ b/lib/business_logic/settings.dart @@ -1,112 +1,74 @@ import 'package:flutter/painting.dart'; -import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import '../global.dart' as global; import '../business_logic/auth/oauth.dart' as oauth; -enum Settings { - instanceUrl, - username, -} +class Settings { + late String instanceUrl; + static const String instanceUrlKey = "instance-url"; + late String authCode; + static const String authCodeKey = "authcode"; + late Locale locale; + static const localeKey = "active-locale"; + late String clientSecret; + static const clientSecretKey = "client-secret"; + late String clientId; + static const clientIdKey = "client-id"; + late String token; + static const tokenKey = "access-token"; + late int batchSize; + static const batchSizeKey = "post-batch-size"; + late SharedPreferences prefs; -Future saveInstanceUrl(String url) async { - final prefs = await SharedPreferences.getInstance(); - return await prefs.setString("instance-url", url); -} + Settings._create(); -Future loadInstanceUrl() async { - final prefs = await SharedPreferences.getInstance(); - String? possibleReturn = prefs.getString("instance-url"); - if (possibleReturn == null) { - return "example.com"; - } else { - return possibleReturn; - } -} + static Future create() async { + Settings settings = Settings._create(); -Future saveUsername(String username) async { - final prefs = await SharedPreferences.getInstance(); - return await prefs.setString("username", username); -} - -Future saveAuthCode(String code) async { - final prefs = await SharedPreferences.getInstance(); - return await prefs.setString("authcode", code); -} - -Future loadAuthCode() async { - final prefs = await SharedPreferences.getInstance(); - String? code = prefs.getString("authcode"); - if (code == null) { - return ""; - } - return code; -} - -Future saveLocale(String locale) async { - final prefs = await SharedPreferences.getInstance(); - return await prefs.setString("active-locale", locale); -} - -Future loadLocale() async { - final prefs = await SharedPreferences.getInstance(); - String? locale = prefs.getString("active-locale"); - if (locale == null) { - if (global.availableLocales.contains(Locale(Intl.systemLocale))) { - return Locale(Intl.systemLocale); + settings.prefs = await SharedPreferences.getInstance(); + settings.instanceUrl = + settings.prefs.getString(instanceUrlKey) ?? "example.com"; + settings.authCode = settings.prefs.getString(authCodeKey) ?? ""; + settings.locale = Locale(settings.prefs.getString(localeKey) ?? "en"); + settings.clientSecret = settings.prefs.getString(clientSecretKey) ?? ""; + settings.clientId = settings.prefs.getString(clientIdKey) ?? ""; + settings.token = settings.prefs.getString(tokenKey) ?? ""; + settings.batchSize = settings.prefs.getInt(batchSizeKey) ?? 20; + if (settings.batchSize < 5) { + settings.batchSize = 5; } - return const Locale("en"); + + return settings; } - return Locale(locale); -} -Future saveApp(oauth.App app) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString("client-secret", app.clientSecret); - prefs.setString("client-id", app.clientId); -} + Future saveInstanceUrl(String url) async { + instanceUrl = url; + return await prefs.setString(instanceUrlKey, url); + } -Future loadClientSecret() async { - final prefs = await SharedPreferences.getInstance(); - final secret = prefs.getString("client-secret"); - if (secret == null) { - return ""; - } else { - return secret; + Future saveAuthCode(String code) async { + authCode = code; + return await prefs.setString(authCodeKey, code); + } + + Future saveLocale(String locale) async { + this.locale = Locale(locale); + return await prefs.setString(localeKey, locale); + } + + Future saveApp(oauth.App app) async { + clientId = app.clientId; + clientSecret = clientSecret; + prefs.setString(clientSecretKey, app.clientSecret); + prefs.setString(clientIdKey, app.clientId); + } + + Future saveToken(String token) async { + this.token = token; + return await prefs.setString(tokenKey, token); + } + + Future saveBatchSize(int size) async { + batchSize = size; + return await prefs.setInt(batchSizeKey, size); } } - -Future loadClientId() async { - final prefs = await SharedPreferences.getInstance(); - final id = prefs.getString("client-id"); - if (id == null) { - return ""; - } else { - return id; - } -} - -Future saveToken(String token) async { - final prefs = await SharedPreferences.getInstance(); - return await prefs.setString("access-token", token); -} - -Future loadToken() async { - final prefs = await SharedPreferences.getInstance(); - final id = prefs.getString("access-token"); - if (id == null) { - return ""; - } else { - return id; - } -} - -Future saveBatchSize(int size) async { - final prefs = await SharedPreferences.getInstance(); - return await prefs.setInt("post-batch-size", size); -} - -Future loadBatchSize() async { - final prefs = await SharedPreferences.getInstance(); - return prefs.getInt("post-batch-size") ?? 20; -} diff --git a/lib/business_logic/timeline/timeline.dart b/lib/business_logic/timeline/timeline.dart index dcc5511..17a556f 100644 --- a/lib/business_logic/timeline/timeline.dart +++ b/lib/business_logic/timeline/timeline.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:loris/business_logic/account/account.dart'; import 'package:loris/business_logic/timeline/media.dart'; -import '../settings.dart' as settings; import '../../global.dart' as global; class TimelinePartModel { @@ -62,8 +61,8 @@ class PostModel implements Comparable { } Future getThread() async { - final token = await settings.loadToken(); - final baseUrl = await settings.loadInstanceUrl(); + final token = global.settings!.token; + final baseUrl = global.settings!.instanceUrl; Map headers = {"Authorization": "Bearer $token"}; headers.addAll(global.defaultHeaders); String currentId = reblogId ?? id; @@ -99,15 +98,15 @@ class ThreadModel { } Future> getTimelineFromServer(String? index) async { - final limit = await settings.loadBatchSize(); - final token = await settings.loadToken(); + final limit = global.settings!.batchSize; + final token = global.settings!.token; Map query = {"limit": limit.toString()}; if (index != null) { query.addAll({"max_id": index}); } - final baseUrl = await settings.loadInstanceUrl(); + final baseUrl = global.settings!.instanceUrl; final url = Uri( scheme: "https", host: baseUrl, diff --git a/lib/global.dart b/lib/global.dart index 9a4497e..15b1d2f 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -1,4 +1,5 @@ import 'package:flutter/painting.dart'; +import 'package:loris/business_logic/settings.dart'; const String name = "loris"; const String version = "v0.1 'is this thing on'"; @@ -14,3 +15,5 @@ const Map defaultHeaders = { const List bad = ["gab.com", "spinster.xyz", "truthsocial.com"]; const List availableLocales = [Locale("en"), Locale("de")]; + +Settings? settings; diff --git a/lib/main.dart b/lib/main.dart index c5b578f..349a307 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -15,11 +15,11 @@ Locale activeLocale = const Locale("en"); void main() async { Intl.defaultLocale = "en"; - await settings.saveLocale("en"); - activeLocale = await settings.loadLocale(); + global.settings = await settings.Settings.create(); + activeLocale = global.settings!.locale; // check if all information is available - if (await settings.loadAuthCode() == "") { + if (global.settings!.authCode == "") { _initRoute = "/login"; } else { await oauth.refreshToken(); diff --git a/lib/pages/login.dart b/lib/pages/login.dart index 0693034..161c93f 100644 --- a/lib/pages/login.dart +++ b/lib/pages/login.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; import '../business_logic/auth/oauth.dart' as oauth; -import '../business_logic/settings.dart' as settings; +import '../global.dart' as global; class Login extends StatefulWidget { const Login({Key? key}) : super(key: key); @@ -45,7 +45,7 @@ class _LoginFormState extends State { Text("greeting".i18n(), style: Theme.of(context).textTheme.headline1), TextFormField( onSaved: (value) async { - await settings.saveInstanceUrl(value!); + await global.settings!.saveInstanceUrl(value!); }, decoration: InputDecoration( labelText: "instance-url".i18n(), diff --git a/lib/pages/settings/account.dart b/lib/pages/settings/account.dart index 65e2256..682344e 100644 --- a/lib/pages/settings/account.dart +++ b/lib/pages/settings/account.dart @@ -2,7 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:localization/localization.dart'; -import '../../business_logic/settings.dart' as settings; +import '../../global.dart' as global; class AccountSettings extends StatelessWidget { const AccountSettings({Key? key}) : super(key: key); @@ -20,19 +20,15 @@ class LogoutButton extends StatelessWidget { @override Widget build(BuildContext context) { + String url; + if (global.settings!.instanceUrl.isEmpty) { + url = "no-instance".i18n(); + } else { + url = global.settings!.instanceUrl; + } return Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - FutureBuilder( - future: settings.loadInstanceUrl(), - builder: (context, snapshot) { - if (snapshot.hasData) { - return Text(snapshot.data ?? "no-instance".i18n()); - } else { - return const CircularProgressIndicator(); - } - }, - ), + Text(url), TextButton.icon( onPressed: () { logout(); @@ -45,6 +41,6 @@ class LogoutButton extends StatelessWidget { } void logout() async { - await settings.saveAuthCode(""); + await global.settings!.saveAuthCode(""); exit(0); } diff --git a/lib/pages/settings/app.dart b/lib/pages/settings/app.dart index 394efba..8fa1d3a 100644 --- a/lib/pages/settings/app.dart +++ b/lib/pages/settings/app.dart @@ -1,5 +1,8 @@ +// ignore_for_file: unused_import + import 'package:localization/localization.dart'; import '../../business_logic/settings.dart' as settings; +import '../../global.dart' as global; import 'package:flutter/material.dart'; class AppSettings extends StatelessWidget { @@ -9,14 +12,9 @@ class AppSettings extends StatelessWidget { Widget build(BuildContext context) { return Column( children: [ - FutureBuilder( - future: settings.loadBatchSize(), - builder: ((context, snapshot) { - if (snapshot.hasData) { - return PostBatchSlider(initialSize: snapshot.data ?? 5); - } - return const CircularProgressIndicator.adaptive(); - })), + PostBatchSlider( + initialSize: global.settings!.batchSize, + ) ], ); } @@ -54,7 +52,7 @@ class _PostBatchSliderState extends State { min: 5, max: 100, onChanged: ((value) { - settings.saveBatchSize(value.toInt()); + global.settings!.saveBatchSize(value.toInt()); setState(() { size = value.toInt(); });