diff --git a/lib/global.dart b/lib/global.dart index fb1af72..8739668 100644 --- a/lib/global.dart +++ b/lib/global.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:logger/logger.dart'; +// late StateProvider appVersion; + // Colors const Color orangeC = Color(0xffd07316); const Color yellowC = Color(0xffFFD68E); diff --git a/lib/main.dart b/lib/main.dart index 89aab6b..d36acd0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -23,7 +23,7 @@ class MyApp extends StatelessWidget { primaryColor: orangeC, fontFamily: 'Georgia', ), - home: const Bogui(title: 'bogui'), + home: const Bogui(title: 'BoĞui'), ); } } @@ -41,4 +41,4 @@ double truncateDouble(double val, int decimals) { valString = valString.substring(0, dotIndex + decimals + 1); return double.parse(valString); -} \ No newline at end of file +} diff --git a/lib/riverpods/home.dart b/lib/riverpods/home.dart new file mode 100644 index 0000000..aa3b226 --- /dev/null +++ b/lib/riverpods/home.dart @@ -0,0 +1,16 @@ +// import 'package:flutter/material.dart'; +import 'package:bogui/global.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:package_info_plus/package_info_plus.dart'; + +Future getAppVersion(WidgetRef ref) async { + final appVersion = StateProvider((ref) => "..."); + String version; + String buildNumber; + PackageInfo packageInfo = await PackageInfo.fromPlatform(); + version = packageInfo.version; + buildNumber = packageInfo.buildNumber; + ref.read(appVersion.notifier).state = 'v$version+$buildNumber'; + log.d(ref.read(appVersion)); + return ref.read(appVersion); +} diff --git a/lib/screens/home.dart b/lib/screens/home.dart index 15d0d43..0daaab2 100644 --- a/lib/screens/home.dart +++ b/lib/screens/home.dart @@ -1,12 +1,11 @@ import 'package:bogui/global.dart'; +import 'package:bogui/riverpods/home.dart'; import 'package:bogui/riverpods/openai.dart'; import 'package:bogui/widgets/parameters_sliders.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:url_launcher/url_launcher.dart'; -// import 'package:flutter/gestures.dart'; -// import 'dart:math'; class Bogui extends ConsumerStatefulWidget { const Bogui({super.key, required this.title}); @@ -37,6 +36,7 @@ class _BoguiState extends ConsumerState { Widget build(BuildContext context) { final scrollController = ScrollController(); screenWidth = MediaQuery.of(context).size.width; + screenHight = MediaQuery.of(context).size.height; return Scaffold( appBar: AppBar( leading: Row( @@ -78,155 +78,191 @@ class _BoguiState extends ConsumerState { bottomOpacity: 0.5, backgroundColor: orangeC, title: Center( - child: Text( - widget.title, - style: const TextStyle(fontSize: 16), + child: Opacity( + opacity: 0.7, + child: Text( + widget.title, + style: const TextStyle(fontSize: 19, fontWeight: FontWeight.w600), + ), )), ), - body: Center( - child: SizedBox( - width: screenWidth, - child: Listener( - onPointerSignal: (_) { - // if (_ is PointerScrollEvent) { - // scrollController.jumpTo( - // max( - // min( - // scrollController.position.maxScrollExtent, - // scrollController.offset + _.scrollDelta.dx, - // ), - // scrollController.position.minScrollExtent, - // ), - // ); - // } - }, - child: SingleChildScrollView( - controller: scrollController, - child: - Row(mainAxisAlignment: MainAxisAlignment.center, children: [ - Spacer(flex: screenWidth > 800 ? 3 : 2), - Column(children: [ - const SizedBox(height: 40), - Container( - constraints: - const BoxConstraints(minWidth: 500, maxWidth: 700), - width: screenWidth - 600, - child: CallbackShortcuts( - bindings: { - LogicalKeySet(LogicalKeyboardKey.control, - LogicalKeyboardKey.enter): - (() => _handleValidation()), - }, - child: TextField( - autocorrect: false, - scrollPhysics: const NeverScrollableScrollPhysics(), - focusNode: promptFocus, - controller: ref.read(gpt.prompt), - autofocus: true, - textInputAction: TextInputAction.search, - // minLines: 3, - maxLines: null, - keyboardType: TextInputType.multiline, - cursorColor: orangeC, - style: const TextStyle( - color: Color.fromARGB(255, 223, 223, 223), - fontSize: 14, - letterSpacing: 0.1, - wordSpacing: 0.1, - ), - decoration: InputDecoration( - filled: true, - helperText: - "Laissez-le autocompléter votre texte plutôt que de lui poser une question...", - helperStyle: const TextStyle(fontSize: 10), - hintText: "Qu'ils aillent tous se faire recompiler", - hintStyle: const TextStyle( - color: Color.fromARGB(255, 145, 145, 145), - fontWeight: FontWeight.w100, - fontSize: 14), - // fillColor: Colors.white, - prefixIconConstraints: const BoxConstraints( - minHeight: 32, + body: Stack(children: [ + Center( + child: SizedBox( + width: screenWidth, + child: Listener( + onPointerSignal: (_) { + // if (_ is PointerScrollEvent) { + // scrollController.jumpTo( + // max( + // min( + // scrollController.position.maxScrollExtent, + // scrollController.offset + _.scrollDelta.dx, + // ), + // scrollController.position.minScrollExtent, + // ), + // ); + // } + }, + child: SingleChildScrollView( + controller: scrollController, + child: + Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + Spacer(flex: screenWidth > 800 ? 3 : 2), + Column(children: [ + const SizedBox(height: 40), + Container( + constraints: + const BoxConstraints(minWidth: 500, maxWidth: 700), + width: screenWidth - 600, + child: CallbackShortcuts( + bindings: { + LogicalKeySet(LogicalKeyboardKey.control, + LogicalKeyboardKey.enter): + (() => _handleValidation()), + }, + child: TextField( + autocorrect: false, + scrollPhysics: const NeverScrollableScrollPhysics(), + focusNode: promptFocus, + controller: ref.read(gpt.prompt), + autofocus: true, + textInputAction: TextInputAction.search, + // minLines: 3, + maxLines: null, + keyboardType: TextInputType.multiline, + cursorColor: orangeC, + style: const TextStyle( + color: Color.fromARGB(255, 223, 223, 223), + fontSize: 14, + letterSpacing: 0.1, + wordSpacing: 0.1, ), - prefixIcon: const Padding( - padding: EdgeInsets.symmetric(horizontal: 17), - child: Icon( - Icons.agriculture_outlined, - color: orangeC, - size: 30, - )), - border: OutlineInputBorder( + decoration: InputDecoration( + filled: true, + helperText: + "Laissez-le autocompléter votre texte plutôt que de lui poser une question...", + helperStyle: const TextStyle(fontSize: 10), + hintText: "Qu'ils aillent tous se faire recompiler", + hintStyle: const TextStyle( + color: Color.fromARGB(255, 145, 145, 145), + fontWeight: FontWeight.w100, + fontSize: 14), + // fillColor: Colors.white, + prefixIconConstraints: const BoxConstraints( + minHeight: 32, + ), + prefixIcon: const Padding( + padding: EdgeInsets.symmetric(horizontal: 17), + child: Icon( + Icons.agriculture_outlined, + color: orangeC, + size: 30, + )), + border: OutlineInputBorder( + borderSide: BorderSide( + color: Colors.grey[500]!, width: 2), + borderRadius: BorderRadius.circular(8)), + focusedBorder: OutlineInputBorder( borderSide: BorderSide( - color: Colors.grey[500]!, width: 2), - borderRadius: BorderRadius.circular(8)), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide( - color: Colors.grey[500]!, width: 2.5), - borderRadius: BorderRadius.circular(8), + color: Colors.grey[500]!, width: 2.5), + borderRadius: BorderRadius.circular(8), + ), + contentPadding: const EdgeInsets.all(20), ), - contentPadding: const EdgeInsets.all(20), + onSubmitted: (value) => promptFocus.requestFocus(), ), - onSubmitted: (value) => promptFocus.requestFocus(), ), ), - ), - const SizedBox(height: 40), - Opacity( - opacity: 0.8, - child: SizedBox( - width: 200, - height: 45, - child: ElevatedButton( - style: ElevatedButton.styleFrom( - foregroundColor: Colors.white, elevation: 4, - backgroundColor: orangeC, // foreground - ), - onPressed: - ref.watch(gpt.prompt).text.length > 100000000000 - ? null - : () { - _handleValidation(); - }, - child: ref.watch(gpt.isLoading) - ? SizedBox( - height: 18, - width: 18, - child: CircularProgressIndicator( - color: Colors.grey[800], - strokeWidth: 4, - ), - ) - : const Text( - 'Valider', - style: TextStyle( - fontSize: 19, fontWeight: FontWeight.w500), + const SizedBox(height: 40), + Opacity( + opacity: 0.8, + child: SizedBox( + width: 200, + height: 45, + child: ElevatedButton( + style: ElevatedButton.styleFrom( + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all( + Radius.circular(7), ), + ), + foregroundColor: Colors.white, elevation: 0, + backgroundColor: + orangeC.withOpacity(0.9), // foreground + ), + onPressed: + ref.watch(gpt.prompt).text.length > 100000000000 + ? null + : () { + _handleValidation(); + }, + child: ref.watch(gpt.isLoading) + ? const SizedBox( + height: 18, + width: 18, + child: CircularProgressIndicator( + color: yellowC, + strokeWidth: 4, + ), + ) + : Text( + 'Boguer', + style: TextStyle( + color: const Color.fromARGB( + 255, 255, 255, 255) + .withOpacity(0.92), + fontSize: 19, + fontWeight: FontWeight.w500), + ), + ), ), ), - ), - const SizedBox(height: 5), - const Text( - 'ctrl + entrer', - style: TextStyle(fontSize: 11, fontWeight: FontWeight.w100), - ), - const SizedBox(height: 40), + const SizedBox(height: 5), + const Text( + 'ctrl + entrer', + style: + TextStyle(fontSize: 11, fontWeight: FontWeight.w100), + ), + const SizedBox(height: 40), + ]), + const Spacer(), + if (screenWidth > 800) + Column( + children: [ + CustomSlider( + parameter: gpt.temperature, + nameParameter: 'Température', + ), + ], + ), + const Spacer(), ]), - const Spacer(), - if (screenWidth > 800) - Column( - children: [ - CustomSlider( - parameter: gpt.temperature, - nameParameter: 'Température', - ), - ], - ), - const Spacer(), - ]), + ), ), ), ), - ), + Positioned( + left: 15, + top: screenHight - 80, + child: FutureBuilder( + future: getAppVersion(ref), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + return Text( + snapshot.data, + style: const TextStyle( + fontSize: 9, + color: Color.fromARGB(255, 216, 216, 216), + fontWeight: FontWeight.w100), + ); + } else { + return const Text('...'); + } + }, + ), + ), + ]), ); } } diff --git a/pubspec.lock b/pubspec.lock index 04517fe..6eee0f2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 + url: "https://pub.dev" + source: hosted + version: "2.0.1" flutter: dependency: "direct main" description: flutter @@ -177,6 +185,22 @@ packages: url: "https://github.com/morriskurz/openai_gpt3_dart_api.git" source: git version: "0.1.3" + package_info_plus: + dependency: "direct main" + description: + name: package_info_plus + sha256: "8df5ab0a481d7dc20c0e63809e90a588e496d276ba53358afc4c4443d0a00697" + url: "https://pub.dev" + source: hosted + version: "3.0.3" + package_info_plus_platform_interface: + dependency: transitive + description: + name: package_info_plus_platform_interface + sha256: "9bc8ba46813a4cc42c66ab781470711781940780fd8beddd0c3da62506d3a6c6" + url: "https://pub.dev" + source: hosted + version: "2.0.1" path: dependency: transitive description: @@ -342,6 +366,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + win32: + dependency: transitive + description: + name: win32 + sha256: "5cdbe09a75b5f4517adf213c68aaf53ffa162fadf54ba16f663f94f3d2664a56" + url: "https://pub.dev" + source: hosted + version: "4.1.1" sdks: dart: ">=2.18.6 <3.0.0" flutter: ">=3.3.0" diff --git a/pubspec.yaml b/pubspec.yaml index 6983400..13958d7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -5,7 +5,7 @@ description: Qu'ils aillent tous se faire enculer. # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.1+2 +version: 0.0.2+3 environment: sdk: '>=2.18.6 <3.0.0' @@ -22,6 +22,7 @@ dependencies: flutter_riverpod: ^2.1.3 logger: ^1.1.0 url_launcher: + package_info_plus: ^3.0.2 dev_dependencies: flutter_test: