store api creds

This commit is contained in:
Jan 2022-12-29 21:43:02 +01:00
parent e3c15d687b
commit 2acd655885
Signed by: Lea
GPG key ID: 1BAFFE8347019C42
5 changed files with 199 additions and 4 deletions

View file

@ -1,6 +1,9 @@
import 'dart:async';
import 'package:feet/widgets/login_prompt.dart'; import 'package:feet/widgets/login_prompt.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:dynamic_color/dynamic_color.dart'; import 'package:dynamic_color/dynamic_color.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'api/api.dart'; import 'api/api.dart';
void main() { void main() {
@ -9,9 +12,25 @@ void main() {
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
final api = FeverAPI(); final api = FeverAPI();
SharedPreferences? prefs;
MyApp({super.key}); MyApp({super.key});
Future<bool> _loadPrefs() async {
var prefs = await SharedPreferences.getInstance();
this.prefs = prefs;
var apiKey = prefs.getString('apiKey'),
apiUrl = prefs.getString('apiUrl');
if (apiUrl != null && apiKey != null) {
api.apiUrl = apiUrl;
api.apiKey = apiKey;
return true;
}
return false;
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return DynamicColorBuilder( return DynamicColorBuilder(
@ -28,7 +47,13 @@ class MyApp extends StatelessWidget {
colorScheme: darkDynamic, colorScheme: darkDynamic,
), ),
themeMode: ThemeMode.system, themeMode: ThemeMode.system,
home: MyHomePage(title: 'Feet', api: api), home: FutureBuilder<bool>(
builder: (context, snapshot) {
if (snapshot.hasData && prefs != null) return MyHomePage(title: 'Feet', api: api, prefs: prefs!);
return const SizedBox();
},
future: _loadPrefs(),
),
)), )),
); );
} }
@ -37,7 +62,8 @@ class MyApp extends StatelessWidget {
class MyHomePage extends StatefulWidget { class MyHomePage extends StatefulWidget {
final String title; final String title;
final FeverAPI api; final FeverAPI api;
const MyHomePage({ super.key, required this.title, required this.api }); final SharedPreferences prefs;
const MyHomePage({ super.key, required this.title, required this.api, required this.prefs });
@override @override
State<MyHomePage> createState() => _MyHomePageState(); State<MyHomePage> createState() => _MyHomePageState();
@ -46,11 +72,24 @@ class MyHomePage extends StatefulWidget {
class _MyHomePageState extends State<MyHomePage> { class _MyHomePageState extends State<MyHomePage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var loggedIn = widget.api.loggedIn();
// I'm aware that this is stupid, but I'm sick and tired and really don't care as long as it works
if (!loggedIn) {
Timer.periodic(const Duration(seconds: 1), (timer) {
setState(() {
loggedIn = widget.api.loggedIn();
});
if (loggedIn) timer.cancel();
});
}
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text(widget.title), title: Text(widget.title),
), ),
body: widget.api.loggedIn() body: loggedIn
? const Center(child: Text('Meep')) ? const Center(child: Text('Meep'))
: Center(child: LoginPrompt(api: widget.api)), : Center(child: LoginPrompt(api: widget.api)),
); );

View file

@ -1,5 +1,6 @@
import 'package:feet/api/api.dart'; import 'package:feet/api/api.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
class LoginPage extends StatefulWidget { class LoginPage extends StatefulWidget {
final FeverAPI api; final FeverAPI api;
@ -136,9 +137,12 @@ class _LoginPageState extends State<LoginPage> {
return; return;
} }
final prefs = await SharedPreferences.getInstance();
await prefs.setString('apiUrl', _urlController.text);
await prefs.setString('apiKey', apiKey);
widget.api.apiUrl = _urlController.text; widget.api.apiUrl = _urlController.text;
widget.api.apiKey = apiKey; widget.api.apiKey = apiKey;
// ignore: use_build_context_synchronously // ignore: use_build_context_synchronously
Navigator.of(context).pop(); Navigator.of(context).pop();
}, },

View file

@ -6,7 +6,9 @@ import FlutterMacOS
import Foundation import Foundation
import dynamic_color import dynamic_color
import shared_preferences_macos
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin")) DynamicColorPlugin.register(with: registry.registrar(forPlugin: "DynamicColorPlugin"))
SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin"))
} }

View file

@ -73,6 +73,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978
url: "https://pub.dev"
source: hosted
version: "2.0.1"
file:
dependency: transitive
description:
name: file
sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
url: "https://pub.dev"
source: hosted
version: "6.1.4"
flutter: flutter:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@ -91,6 +107,11 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.0" version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@ -155,6 +176,118 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.8.2" version: "1.8.2"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379
url: "https://pub.dev"
source: hosted
version: "2.1.7"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: f0abc8ebd7253741f05488b4813d936b4d07c6bae3e86148a09e342ee4b08e76
url: "https://pub.dev"
source: hosted
version: "2.0.5"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: bcabbe399d4042b8ee687e17548d5d3f527255253b4a639f5f8d2094a9c2b45c
url: "https://pub.dev"
source: hosted
version: "2.1.3"
platform:
dependency: transitive
description:
name: platform
sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: dbf0f707c78beedc9200146ad3cb0ab4d5da13c246336987be6940f026500d3a
url: "https://pub.dev"
source: hosted
version: "2.1.3"
process:
dependency: transitive
description:
name: process
sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
url: "https://pub.dev"
source: hosted
version: "4.2.4"
shared_preferences:
dependency: "direct main"
description:
name: shared_preferences
sha256: "76917b7d4b9526b2ba416808a7eb9fb2863c1a09cf63ec85f1453da240fa818a"
url: "https://pub.dev"
source: hosted
version: "2.0.15"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "8e251f3c986002b65fed6396bce81f379fb63c27317d49743cf289fd0fd1ab97"
url: "https://pub.dev"
source: hosted
version: "2.0.14"
shared_preferences_ios:
dependency: transitive
description:
name: shared_preferences_ios
sha256: "585a14cefec7da8c9c2fb8cd283a3bb726b4155c0952afe6a0caaa7b2272de34"
url: "https://pub.dev"
source: hosted
version: "2.1.1"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: fbc3cd6826896b66a5f576b025e4f344f780c84ea7f8203097a353370607a2c8
url: "https://pub.dev"
source: hosted
version: "2.1.2"
shared_preferences_macos:
dependency: transitive
description:
name: shared_preferences_macos
sha256: fbb94bf296576f49be37a1496d5951796211a8db0aa22cc0d68c46440dad808c
url: "https://pub.dev"
source: hosted
version: "2.0.4"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: da9431745ede5ece47bc26d5d73a9d3c6936ef6945c101a5aca46f62e52c1cf3
url: "https://pub.dev"
source: hosted
version: "2.1.0"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: a4b5bc37fe1b368bbc81f953197d55e12f49d0296e7e412dfe2d2d77d6929958
url: "https://pub.dev"
source: hosted
version: "2.0.4"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "07c274c2115d4d5e4280622abb09f0980e2c5b1fcdc98ae9f59a3bad5bfc1f26"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
sky_engine: sky_engine:
dependency: transitive dependency: transitive
description: flutter description: flutter
@ -224,6 +357,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
win32:
dependency: transitive
description:
name: win32
sha256: c9ebe7ee4ab0c2194e65d3a07d8c54c5d00bb001b76081c4a04cdb8448b59e46
url: "https://pub.dev"
source: hosted
version: "3.1.3"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: "11541eedefbcaec9de35aa82650b695297ce668662bbd6e3911a7fabdbde589f"
url: "https://pub.dev"
source: hosted
version: "0.2.0+2"
sdks: sdks:
dart: ">=2.19.0-444.2.beta <4.0.0" dart: ">=2.19.0-444.2.beta <4.0.0"
flutter: ">=3.3.0" flutter: ">=3.3.0"

View file

@ -38,6 +38,7 @@ dependencies:
http: ^0.13.5 http: ^0.13.5
crypto: ^3.0.2 crypto: ^3.0.2
dynamic_color: ^1.5.4 dynamic_color: ^1.5.4
shared_preferences: ^2.0.15
dev_dependencies: dev_dependencies:
flutter_test: flutter_test: