From 155d97c9dfff68e0c709256bbf1a554c661d284f Mon Sep 17 00:00:00 2001 From: "Florian RICHER (MrDev023)" Date: Wed, 30 Mar 2022 22:39:49 +0200 Subject: [PATCH] Add step2 --- assets/images/client_app_keys.png | Bin 0 -> 19841 bytes lib/widgets/components/row_input.dart | 25 ++++ lib/widgets/components/tutorials/step1.dart | 3 - lib/widgets/components/tutorials/step2.dart | 108 +++++++++++++++++ lib/widgets/pages/tutorial.dart | 3 +- pubspec.lock | 126 ++++++++++++++++++++ pubspec.yaml | 5 + 7 files changed, 266 insertions(+), 4 deletions(-) create mode 100644 assets/images/client_app_keys.png create mode 100644 lib/widgets/components/row_input.dart create mode 100644 lib/widgets/components/tutorials/step2.dart diff --git a/assets/images/client_app_keys.png b/assets/images/client_app_keys.png new file mode 100644 index 0000000000000000000000000000000000000000..8f80ab3225a21d05eb943840096af9df18eaf75c GIT binary patch literal 19841 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 literal 0 HcmV?d00001 diff --git a/lib/widgets/components/row_input.dart b/lib/widgets/components/row_input.dart new file mode 100644 index 0000000..4176e0e --- /dev/null +++ b/lib/widgets/components/row_input.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +class RowInput extends StatelessWidget { + const RowInput({Key? key, required this.label, required this.controller}) + : super(key: key); + + final String label; + final TextEditingController controller; + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 400, + height: 70, + child: Expanded( + child: TextField( + controller: controller, + decoration: InputDecoration( + hintText: label, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/components/tutorials/step1.dart b/lib/widgets/components/tutorials/step1.dart index 0ed66b1..b5147fd 100644 --- a/lib/widgets/components/tutorials/step1.dart +++ b/lib/widgets/components/tutorials/step1.dart @@ -1,6 +1,5 @@ import 'package:desktopapp/widgets/components/link.dart'; import 'package:flutter/material.dart'; -import 'package:url_launcher/url_launcher.dart'; class Step1 extends StatelessWidget { const Step1({Key? key}) : super(key: key); @@ -61,8 +60,6 @@ class Step1 extends StatelessWidget { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - // TextButton( - // onPressed: () {}, child: const Text('Étape précédente')), TextButton(onPressed: () {}, child: const Text('Étape suivante')) ], ), diff --git a/lib/widgets/components/tutorials/step2.dart b/lib/widgets/components/tutorials/step2.dart new file mode 100644 index 0000000..51b68e8 --- /dev/null +++ b/lib/widgets/components/tutorials/step2.dart @@ -0,0 +1,108 @@ +import 'package:desktopapp/widgets/components/link.dart'; +import 'package:desktopapp/widgets/components/row_input.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class Step2 extends StatelessWidget { + Step2({Key? key}) : super(key: key); + + final TextEditingController _clientIdController = TextEditingController(); + final TextEditingController _clientSecretController = TextEditingController(); + + Widget buildFieldDescription(String field, String description) { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(field, style: const TextStyle(fontWeight: FontWeight.bold)), + const Text(' : '), + Text(description) + ], + ); + } + + Widget buildContent(BuildContext context) { + return Column(children: [ + const Padding( + padding: EdgeInsets.symmetric(vertical: 20), + child: Text('Étape 2: Récupération des cléfs Client', + style: TextStyle(fontSize: 20)), + ), + const Text( + 'Pour pouvoir utiliser l\'application, il faut récupérer les clefs associées à l\'application créée juste avant.'), + const Text( + 'Normalement, vous devez voir apparaître une page avec les champs comme dans l\'image ci-dessous.'), + const Text('Sinon vous pouvez le retrouver avec le lien ci-dessous:'), + const SizedBox(height: 10), + const Link( + uri: 'https://streamlabs.com/dashboard#/settings/api-settings'), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24.0), + child: Image.asset('assets/images/client_app_keys.png'), + ), + const SizedBox(height: 20), + const Text( + 'Pour récupérer les clefs, il faut remplir le formulaire ci-dessous avec les valeurs correspondantes à ceux sur le site:'), + RowInput(label: 'Client ID', controller: _clientIdController), + RowInput(label: 'Client Secret', controller: _clientSecretController), + TextButton( + onPressed: () async { + final prefs = await SharedPreferences.getInstance(); + prefs.setString('client_id', _clientIdController.text.trim()); + prefs.setString( + 'client_secret', _clientSecretController.text.trim()); + showDialog( + context: context, + builder: (_) => AlertDialog( + title: const Text('Information'), + content: const Text( + 'Les informations ont été correctement enregistrée.'), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: const Text('OK')) + ], + )); + }, + child: const Text('Appliquer les changements')), + const SizedBox(height: 20), + const Text( + 'Une fois les données enregistrées, vous pouvez passez à l\'étape suivante.'), + ]); + } + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Expanded( + child: FutureBuilder( + future: SharedPreferences.getInstance(), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.hasData) { + final prefs = snapshot.data!; + _clientIdController.text = + prefs.getString('client_id') ?? ''; + _clientSecretController.text = + prefs.getString('client_secret') ?? ''; + return buildContent(context); + } else { + return const Center(child: CircularProgressIndicator()); + } + })), + Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + TextButton( + onPressed: () {}, child: const Text('Étape précédente')), + TextButton(onPressed: () {}, child: const Text('Étape suivante')) + ], + ), + ) + ], + ); + } +} diff --git a/lib/widgets/pages/tutorial.dart b/lib/widgets/pages/tutorial.dart index e76c732..99b5eba 100644 --- a/lib/widgets/pages/tutorial.dart +++ b/lib/widgets/pages/tutorial.dart @@ -1,4 +1,5 @@ import 'package:desktopapp/widgets/components/tutorials/step1.dart'; +import 'package:desktopapp/widgets/components/tutorials/step2.dart'; import 'package:flutter/material.dart'; class TutorialPage extends StatelessWidget { @@ -6,6 +7,6 @@ class TutorialPage extends StatelessWidget { @override Widget build(BuildContext context) { - return Scaffold(body: const Step1()); + return Scaffold(body: Step2()); } } diff --git a/pubspec.lock b/pubspec.lock index 298215c..1fe2cce 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -64,6 +64,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.2.0" + ffi: + dependency: transitive + description: + name: ffi + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.2" + file: + dependency: transitive + description: + name: file + url: "https://pub.dartlang.org" + source: hosted + version: "6.1.2" + flash: + dependency: "direct main" + description: + name: flash + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3+2" flutter: dependency: "direct main" description: flutter @@ -142,6 +163,34 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.5" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "3.1.0" plugin_platform_interface: dependency: transitive description: @@ -149,6 +198,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + process: + dependency: transitive + description: + name: process + url: "https://pub.dartlang.org" + source: hosted + version: "4.2.4" provider: dependency: transitive description: @@ -156,6 +212,62 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "6.0.2" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.13" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.11" + shared_preferences_ios: + dependency: transitive + description: + name: shared_preferences_ios + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" + shared_preferences_macos: + dependency: transitive + description: + name: shared_preferences_macos + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.0" sky_engine: dependency: transitive description: flutter @@ -273,6 +385,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.1" + win32: + dependency: transitive + description: + name: win32 + url: "https://pub.dartlang.org" + source: hosted + version: "2.5.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.0+1" sdks: dart: ">=2.16.2 <3.0.0" flutter: ">=2.10.0" diff --git a/pubspec.yaml b/pubspec.yaml index 102e685..d9f55a1 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,8 @@ dependencies: cupertino_icons: ^1.0.2 flutter_bloc: ^8.0.1 url_launcher: ^6.0.20 + shared_preferences: ^2.0.13 + flash: ^2.0.3+2 dev_dependencies: flutter_test: @@ -64,6 +66,9 @@ flutter: # - images/a_dot_burr.jpeg # - images/a_dot_ham.jpeg + assets: + - assets/images/client_app_keys.png + # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.