From 9f36569d2acf4bbcad509daab2acd74d178b425a Mon Sep 17 00:00:00 2001 From: Armand <4831c0@proton.me> Date: Sun, 1 Mar 2026 15:13:51 +0100 Subject: [PATCH] firka_wear: refactor lib folder structure to match firka --- firka_wear/lib/app/initialization.dart | 98 +++++++++ firka_wear/lib/app/initialization_screen.dart | 94 +++++++++ .../lib/{helpers => core}/debug_helper.dart | 34 +-- .../lib/{helpers => core}/extensions.dart | 4 +- .../lib/{helpers => core}/icon_helper.dart | 0 .../lib/{helpers => core}/json_helper.dart | 0 .../ui => core}/stateless_async_widget.dart | 2 +- .../models/app_settings_model.dart | 0 .../models/generic_cache_model.dart | 0 .../models/homework_cache_model.dart | 4 +- .../models/timetable_cache_model.dart | 4 +- .../db => data}/models/token_model.dart | 0 firka_wear/lib/{helpers/db => data}/util.dart | 2 +- firka_wear/lib/main.dart | 196 +----------------- .../sync => services}/wear_sync_store.dart | 0 .../ui => ui/components}/firka_card.dart | 2 +- .../{helpers/ui => ui/components}/grade.dart | 4 +- .../ui => ui/components}/grade_helpers.dart | 4 +- .../lib/ui/{widget => shared}/class_icon.dart | 3 +- .../ui/{widget => shared}/counter_digit.dart | 43 ++-- .../{widget => shared}/delayed_spinner.dart | 84 ++++---- .../lib/ui/{widget => shared}/firka_icon.dart | 75 +++---- .../{widget => shared}/grade_small_card.dart | 10 +- firka_wear/lib/ui/{model => theme}/style.dart | 3 + .../lib/ui/wear/screens/home/home_screen.dart | 22 +- .../ui/wear/screens/login/login_screen.dart | 19 +- .../widgets/circular_progress_indicator.dart | 6 +- 27 files changed, 359 insertions(+), 354 deletions(-) create mode 100644 firka_wear/lib/app/initialization.dart create mode 100644 firka_wear/lib/app/initialization_screen.dart rename firka_wear/lib/{helpers => core}/debug_helper.dart (95%) rename firka_wear/lib/{helpers => core}/extensions.dart (98%) rename firka_wear/lib/{helpers => core}/icon_helper.dart (100%) rename firka_wear/lib/{helpers => core}/json_helper.dart (100%) rename firka_wear/lib/{helpers/ui => core}/stateless_async_widget.dart (92%) rename firka_wear/lib/{helpers/db => data}/models/app_settings_model.dart (100%) rename firka_wear/lib/{helpers/db => data}/models/generic_cache_model.dart (100%) rename firka_wear/lib/{helpers/db => data}/models/homework_cache_model.dart (87%) rename firka_wear/lib/{helpers/db => data}/models/timetable_cache_model.dart (87%) rename firka_wear/lib/{helpers/db => data}/models/token_model.dart (100%) rename firka_wear/lib/{helpers/db => data}/util.dart (91%) rename firka_wear/lib/{helpers/sync => services}/wear_sync_store.dart (100%) rename firka_wear/lib/{helpers/ui => ui/components}/firka_card.dart (96%) rename firka_wear/lib/{helpers/ui => ui/components}/grade.dart (98%) rename firka_wear/lib/{helpers/ui => ui/components}/grade_helpers.dart (93%) rename firka_wear/lib/ui/{widget => shared}/class_icon.dart (93%) rename firka_wear/lib/ui/{widget => shared}/counter_digit.dart (87%) rename firka_wear/lib/ui/{widget => shared}/delayed_spinner.dart (94%) rename firka_wear/lib/ui/{widget => shared}/firka_icon.dart (90%) rename firka_wear/lib/ui/{widget => shared}/grade_small_card.dart (88%) rename firka_wear/lib/ui/{model => theme}/style.dart (98%) diff --git a/firka_wear/lib/app/initialization.dart b/firka_wear/lib/app/initialization.dart new file mode 100644 index 0000000..508697f --- /dev/null +++ b/firka_wear/lib/app/initialization.dart @@ -0,0 +1,98 @@ +import 'dart:ui' as ui; + +import 'package:flutter/services.dart'; +import 'package:isar_community/isar.dart'; +import 'package:path_provider/path_provider.dart'; + +import 'package:firka_wear/data/models/generic_cache_model.dart'; +import 'package:firka_wear/data/models/homework_cache_model.dart'; +import 'package:firka_wear/data/models/timetable_cache_model.dart'; +import 'package:firka_wear/data/models/token_model.dart'; +import 'package:firka_wear/l10n/app_localizations.dart'; +import 'package:firka_wear/l10n/app_localizations_de.dart'; +import 'package:firka_wear/l10n/app_localizations_en.dart'; +import 'package:firka_wear/l10n/app_localizations_hu.dart'; +import 'package:flutter/material.dart'; + +import 'package:firka_wear/services/wear_sync_store.dart'; + +Isar? isarInit; +final GlobalKey navigatorKey = GlobalKey(); + +class DeviceInfo { + String model; + String versionRelease; + String versionSdkInt; + + DeviceInfo(this.model, this.versionRelease, this.versionSdkInt); + + @override + String toString() { + return "DeviceInfo(model = \"$model\", versionRelease = \"$versionRelease\"" + ", versionSdkInt = \"$versionSdkInt\""; + } +} + +class WearAppInitialization { + final Isar isar; + final WearSyncStore syncStore; + final int tokenCount; + final AppLocalizations l10n; + final DeviceInfo devInfo; + + WearAppInitialization({ + required this.isar, + required this.syncStore, + required this.tokenCount, + required this.l10n, + required this.devInfo, + }); +} + +Future initDB() async { + if (isarInit != null) return isarInit!; + final dir = await getApplicationDocumentsDirectory(); + + isarInit = await Isar.open( + [ + TokenModelSchema, + GenericCacheModelSchema, + TimetableCacheModelSchema, + HomeworkCacheModelSchema, + ], + inspector: true, + directory: dir.path, + ); + + return isarInit!; +} + +AppLocalizations getLang() { + switch (ui.PlatformDispatcher.instance.locale.languageCode) { + case 'hu': + return AppLocalizationsHu(); + case 'de': + return AppLocalizationsDe(); + default: + return AppLocalizationsEn(); + } +} + +Future initializeApp() async { + final isar = await initDB(); + final syncStore = WearSyncStore(); + await syncStore.load(); + + const channel = MethodChannel("firka.app/main"); + final rawInfo = ((await channel.invokeMethod("get_info")) as String).split( + ";", + ); + + return WearAppInitialization( + isar: isar, + syncStore: syncStore, + tokenCount: await isar.tokenModels.count(), + l10n: getLang(), + devInfo: DeviceInfo(rawInfo[0], rawInfo[1], rawInfo[2]), + ); +} diff --git a/firka_wear/lib/app/initialization_screen.dart b/firka_wear/lib/app/initialization_screen.dart new file mode 100644 index 0000000..1dada31 --- /dev/null +++ b/firka_wear/lib/app/initialization_screen.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:wear_plus/wear_plus.dart'; + +import 'package:firka_wear/app/initialization.dart'; +import 'package:firka_wear/l10n/app_localizations.dart'; +import 'package:firka_wear/ui/theme/style.dart'; +import 'package:firka_wear/ui/wear/screens/home/home_screen.dart'; +import 'package:firka_wear/ui/wear/screens/login/login_screen.dart'; + +class WearInitializationScreen extends StatelessWidget { + WearInitializationScreen({super.key}); + + final Future _initialization = initializeApp(); + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _initialization, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.hasError) { + return MaterialApp( + key: ValueKey('firkaErrorPage'), + home: Scaffold( + body: Center( + child: WatchShape( + builder: (context, shape, child) { + return Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Error initializing app: ${snapshot.error}', + style: TextStyle(color: Colors.red), + ), + child!, + ], + ); + }, + child: SizedBox(), + ), + ), + ), + ); + } + + Widget screen; + assert(snapshot.data != null); + var data = snapshot.data!; + + if (snapshot.data!.tokenCount == 0) { + screen = WearLoginScreen(data, key: ValueKey('wearLoginScreen')); + } else { + screen = WearHomeScreen(data, key: ValueKey('wearHomeScreen')); + } + + return MaterialApp( + key: ValueKey('firkaWearApp'), + title: 'Firka', + navigatorKey: navigatorKey, + theme: ThemeData( + primarySwatch: Colors.lightGreen, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + localizationsDelegates: [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: AppLocalizations.supportedLocales, + home: screen, + routes: { + '/login': (context) => + WearLoginScreen(data, key: ValueKey('wearLoginScreen')), + '/home': (context) => + WearHomeScreen(data, key: ValueKey('wearHomeScreen')), + }, + ); + } + + return MaterialApp( + home: Scaffold( + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [Container(color: wearStyle.colors.secondary)], + ), + ), + ), + ); + }, + ); + } +} diff --git a/firka_wear/lib/helpers/debug_helper.dart b/firka_wear/lib/core/debug_helper.dart similarity index 95% rename from firka_wear/lib/helpers/debug_helper.dart rename to firka_wear/lib/core/debug_helper.dart index d0c04a0..027d8e8 100644 --- a/firka_wear/lib/helpers/debug_helper.dart +++ b/firka_wear/lib/core/debug_helper.dart @@ -1,17 +1,17 @@ -DateTime? debugFakeTime; -DateTime? debugSetAt; -var debugTimeAdvance = false; - -DateTime timeNow() { - if (debugFakeTime != null) { - if (debugTimeAdvance && debugSetAt != null) { - var diff = DateTime.now().difference(debugSetAt!); - - return debugFakeTime!.add(diff); - } else { - return debugFakeTime!; - } - } else { - return DateTime.now(); - } -} +DateTime? debugFakeTime; +DateTime? debugSetAt; +var debugTimeAdvance = false; + +DateTime timeNow() { + if (debugFakeTime != null) { + if (debugTimeAdvance && debugSetAt != null) { + var diff = DateTime.now().difference(debugSetAt!); + + return debugFakeTime!.add(diff); + } else { + return debugFakeTime!; + } + } else { + return DateTime.now(); + } +} diff --git a/firka_wear/lib/helpers/extensions.dart b/firka_wear/lib/core/extensions.dart similarity index 98% rename from firka_wear/lib/helpers/extensions.dart rename to firka_wear/lib/core/extensions.dart index b336d18..ec9cd2b 100644 --- a/firka_wear/lib/helpers/extensions.dart +++ b/firka_wear/lib/core/extensions.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; -import '../l10n/app_localizations.dart'; +import 'package:firka_wear/core/debug_helper.dart'; +import 'package:firka_wear/l10n/app_localizations.dart'; import 'package:kreta_api/kreta_api.dart'; -import 'debug_helper.dart'; extension IterableExtensionMap on Iterable> { Map toMap() { diff --git a/firka_wear/lib/helpers/icon_helper.dart b/firka_wear/lib/core/icon_helper.dart similarity index 100% rename from firka_wear/lib/helpers/icon_helper.dart rename to firka_wear/lib/core/icon_helper.dart diff --git a/firka_wear/lib/helpers/json_helper.dart b/firka_wear/lib/core/json_helper.dart similarity index 100% rename from firka_wear/lib/helpers/json_helper.dart rename to firka_wear/lib/core/json_helper.dart diff --git a/firka_wear/lib/helpers/ui/stateless_async_widget.dart b/firka_wear/lib/core/stateless_async_widget.dart similarity index 92% rename from firka_wear/lib/helpers/ui/stateless_async_widget.dart rename to firka_wear/lib/core/stateless_async_widget.dart index 98f88ee..8a0b317 100644 --- a/firka_wear/lib/helpers/ui/stateless_async_widget.dart +++ b/firka_wear/lib/core/stateless_async_widget.dart @@ -1,4 +1,4 @@ -import 'package:firka_wear/ui/widget/delayed_spinner.dart'; +import 'package:firka_wear/ui/shared/delayed_spinner.dart'; import 'package:flutter/material.dart'; abstract class StatelessAsyncWidget extends StatelessWidget { diff --git a/firka_wear/lib/helpers/db/models/app_settings_model.dart b/firka_wear/lib/data/models/app_settings_model.dart similarity index 100% rename from firka_wear/lib/helpers/db/models/app_settings_model.dart rename to firka_wear/lib/data/models/app_settings_model.dart diff --git a/firka_wear/lib/helpers/db/models/generic_cache_model.dart b/firka_wear/lib/data/models/generic_cache_model.dart similarity index 100% rename from firka_wear/lib/helpers/db/models/generic_cache_model.dart rename to firka_wear/lib/data/models/generic_cache_model.dart diff --git a/firka_wear/lib/helpers/db/models/homework_cache_model.dart b/firka_wear/lib/data/models/homework_cache_model.dart similarity index 87% rename from firka_wear/lib/helpers/db/models/homework_cache_model.dart rename to firka_wear/lib/data/models/homework_cache_model.dart index 1fed7bd..a38682d 100644 --- a/firka_wear/lib/helpers/db/models/homework_cache_model.dart +++ b/firka_wear/lib/data/models/homework_cache_model.dart @@ -1,7 +1,7 @@ import 'package:isar_community/isar.dart'; -import '../../debug_helper.dart'; -import '../util.dart'; +import 'package:firka_wear/core/debug_helper.dart'; +import 'package:firka_wear/data/util.dart'; part 'homework_cache_model.g.dart'; diff --git a/firka_wear/lib/helpers/db/models/timetable_cache_model.dart b/firka_wear/lib/data/models/timetable_cache_model.dart similarity index 87% rename from firka_wear/lib/helpers/db/models/timetable_cache_model.dart rename to firka_wear/lib/data/models/timetable_cache_model.dart index 6deacbb..b6c879a 100644 --- a/firka_wear/lib/helpers/db/models/timetable_cache_model.dart +++ b/firka_wear/lib/data/models/timetable_cache_model.dart @@ -1,7 +1,7 @@ import 'package:isar_community/isar.dart'; -import '../../debug_helper.dart'; -import '../util.dart'; +import 'package:firka_wear/core/debug_helper.dart'; +import 'package:firka_wear/data/util.dart'; part 'timetable_cache_model.g.dart'; diff --git a/firka_wear/lib/helpers/db/models/token_model.dart b/firka_wear/lib/data/models/token_model.dart similarity index 100% rename from firka_wear/lib/helpers/db/models/token_model.dart rename to firka_wear/lib/data/models/token_model.dart diff --git a/firka_wear/lib/helpers/db/util.dart b/firka_wear/lib/data/util.dart similarity index 91% rename from firka_wear/lib/helpers/db/util.dart rename to firka_wear/lib/data/util.dart index 9981a09..cbed51f 100644 --- a/firka_wear/lib/helpers/db/util.dart +++ b/firka_wear/lib/data/util.dart @@ -3,7 +3,7 @@ import 'dart:math'; import 'package:intl/intl.dart'; import 'package:isar_community/isar.dart'; -import '../debug_helper.dart'; +import 'package:firka_wear/core/debug_helper.dart'; class DatedCacheEntry { Id? cacheKey; diff --git a/firka_wear/lib/main.dart b/firka_wear/lib/main.dart index a5a15e9..0672053 100644 --- a/firka_wear/lib/main.dart +++ b/firka_wear/lib/main.dart @@ -1,114 +1,13 @@ -import 'dart:async'; import 'dart:io'; -import 'dart:ui' as ui; import 'package:dio/dio.dart'; -import 'package:firka_wear/helpers/db/models/generic_cache_model.dart'; -import 'package:firka_wear/helpers/db/models/homework_cache_model.dart'; -import 'package:firka_wear/helpers/db/models/timetable_cache_model.dart'; -import 'package:firka_wear/helpers/db/models/token_model.dart'; -import 'package:firka_wear/helpers/sync/wear_sync_store.dart'; -import 'package:firka_wear/ui/model/style.dart'; -import 'package:firka_wear/ui/wear/screens/login/login_screen.dart'; +import 'package:firka_wear/app/initialization_screen.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; -import 'package:isar_community/isar.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:permission_handler/permission_handler.dart'; -import 'package:wear_plus/wear_plus.dart'; - -import 'l10n/app_localizations.dart'; -import 'l10n/app_localizations_de.dart'; -import 'l10n/app_localizations_en.dart'; -import 'l10n/app_localizations_hu.dart'; -import 'ui/wear/screens/home/home_screen.dart'; - -Isar? isarInit; -final GlobalKey navigatorKey = GlobalKey(); final dio = Dio(); -class DeviceInfo { - String model; - - String versionRelease; - String versionSdkInt; - - DeviceInfo(this.model, this.versionRelease, this.versionSdkInt); - - @override - String toString() { - return "DeviceInfo(model = \"$model\", versionRelease = \"$versionRelease\"" - ", versionSdkInt = \"$versionSdkInt\""; - } -} - -class WearAppInitialization { - final Isar isar; - final WearSyncStore syncStore; - final int tokenCount; - final AppLocalizations l10n; - final DeviceInfo devInfo; - - WearAppInitialization({ - required this.isar, - required this.syncStore, - required this.tokenCount, - required this.l10n, - required this.devInfo, - }); -} - -Future initDB() async { - if (isarInit != null) return isarInit!; - final dir = await getApplicationDocumentsDirectory(); - - isarInit = await Isar.open( - [ - TokenModelSchema, - GenericCacheModelSchema, - TimetableCacheModelSchema, - HomeworkCacheModelSchema, - ], - inspector: true, - directory: dir.path, - ); - - return isarInit!; -} - -AppLocalizations getLang() { - switch (ui.window.locale.languageCode) { - case 'hu': - return AppLocalizationsHu(); - case 'de': - return AppLocalizationsDe(); - default: - return AppLocalizationsEn(); - } -} - -Future initializeApp() async { - final isar = await initDB(); - final syncStore = WearSyncStore(); - await syncStore.load(); - - const channel = MethodChannel("firka.app/main"); - final rawInfo = ((await channel.invokeMethod("get_info")) as String).split( - ";", - ); - - return WearAppInitialization( - isar: isar, - syncStore: syncStore, - tokenCount: await isar.tokenModels.count(), - l10n: getLang(), - devInfo: DeviceInfo(rawInfo[0], rawInfo[1], rawInfo[2]), - ); -} - void main() async { dio.options.connectTimeout = Duration(seconds: 5); dio.options.receiveTimeout = Duration(seconds: 3); @@ -126,98 +25,5 @@ void main() async { await ScreenUtil.ensureScreenSize(); - // Run App Initialization runApp(WearInitializationScreen()); } - -class WearInitializationScreen extends StatelessWidget { - WearInitializationScreen({super.key}); - - // Place to store the initialization future - final Future _initialization = initializeApp(); - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _initialization, - builder: (context, snapshot) { - // Check if initialization is complete - if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.hasError) { - // Handle initialization error - - return MaterialApp( - key: ValueKey('firkaErrorPage'), - home: Scaffold( - body: Center( - child: WatchShape( - builder: (context, shape, child) { - return Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Error initializing app: ${snapshot.error}', - style: TextStyle(color: Colors.red), - ), - child!, - ], - ); - }, - child: SizedBox(), - ), - ), - ), - ); - } - - // Initialization successful, determine which screen to show - Widget screen; - - assert(snapshot.data != null); - var data = snapshot.data!; - - if (snapshot.data!.tokenCount == 0) { - screen = WearLoginScreen(data, key: ValueKey('wearLoginScreen')); - } else { - screen = WearHomeScreen(data, key: ValueKey('wearHomeScreen')); - } - - return MaterialApp( - key: ValueKey('firkaWearApp'), - title: 'Firka', - navigatorKey: navigatorKey, - // Use the global navigator key - theme: ThemeData( - primarySwatch: Colors.lightGreen, - visualDensity: VisualDensity.adaptivePlatformDensity, - ), - localizationsDelegates: [ - AppLocalizations.delegate, - GlobalMaterialLocalizations.delegate, - GlobalWidgetsLocalizations.delegate, - ], - supportedLocales: AppLocalizations.supportedLocales, - home: screen, - routes: { - '/login': (context) => - WearLoginScreen(data, key: ValueKey('wearLoginScreen')), - '/home': (context) => - WearHomeScreen(data, key: ValueKey('wearHomeScreen')), - }, - ); - } - - return MaterialApp( - home: Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [Container(color: wearStyle.colors.secondary)], - ), - ), - ), - ); - }, - ); - } -} diff --git a/firka_wear/lib/helpers/sync/wear_sync_store.dart b/firka_wear/lib/services/wear_sync_store.dart similarity index 100% rename from firka_wear/lib/helpers/sync/wear_sync_store.dart rename to firka_wear/lib/services/wear_sync_store.dart diff --git a/firka_wear/lib/helpers/ui/firka_card.dart b/firka_wear/lib/ui/components/firka_card.dart similarity index 96% rename from firka_wear/lib/helpers/ui/firka_card.dart rename to firka_wear/lib/ui/components/firka_card.dart index e27c867..ae11e1e 100644 --- a/firka_wear/lib/helpers/ui/firka_card.dart +++ b/firka_wear/lib/ui/components/firka_card.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; -import '../../ui/model/style.dart'; +import 'package:firka_wear/ui/theme/style.dart'; class FirkaCard extends StatelessWidget { final List left; diff --git a/firka_wear/lib/helpers/ui/grade.dart b/firka_wear/lib/ui/components/grade.dart similarity index 98% rename from firka_wear/lib/helpers/ui/grade.dart rename to firka_wear/lib/ui/components/grade.dart index 0cacedc..45e8698 100644 --- a/firka_wear/lib/helpers/ui/grade.dart +++ b/firka_wear/lib/ui/components/grade.dart @@ -1,7 +1,7 @@ -import 'package:kreta_api/kreta_api.dart'; import 'package:flutter/material.dart'; +import 'package:kreta_api/kreta_api.dart'; -import '../../ui/model/style.dart'; +import 'package:firka_wear/ui/theme/style.dart'; import 'grade_helpers.dart'; class GradeWidget extends StatelessWidget { diff --git a/firka_wear/lib/helpers/ui/grade_helpers.dart b/firka_wear/lib/ui/components/grade_helpers.dart similarity index 93% rename from firka_wear/lib/helpers/ui/grade_helpers.dart rename to firka_wear/lib/ui/components/grade_helpers.dart index 1c80c27..4e00135 100644 --- a/firka_wear/lib/helpers/ui/grade_helpers.dart +++ b/firka_wear/lib/ui/components/grade_helpers.dart @@ -1,8 +1,10 @@ import 'dart:ui'; -import '../../ui/model/style.dart'; +import 'package:flutter/material.dart'; import 'package:kreta_api/kreta_api.dart'; +import 'package:firka_wear/ui/theme/style.dart'; + int roundGrade(double grade) { if (grade < 2) { return 1; diff --git a/firka_wear/lib/ui/widget/class_icon.dart b/firka_wear/lib/ui/shared/class_icon.dart similarity index 93% rename from firka_wear/lib/ui/widget/class_icon.dart rename to firka_wear/lib/ui/shared/class_icon.dart index dedfbae..bf7c04e 100644 --- a/firka_wear/lib/ui/widget/class_icon.dart +++ b/firka_wear/lib/ui/shared/class_icon.dart @@ -1,6 +1,7 @@ -import 'package:firka_wear/helpers/icon_helper.dart'; import 'package:flutter/material.dart'; +import 'package:firka_wear/core/icon_helper.dart'; + import 'firka_icon.dart'; class ClassIconWidget extends StatelessWidget { diff --git a/firka_wear/lib/ui/widget/counter_digit.dart b/firka_wear/lib/ui/shared/counter_digit.dart similarity index 87% rename from firka_wear/lib/ui/widget/counter_digit.dart rename to firka_wear/lib/ui/shared/counter_digit.dart index 3e5bd0b..fd1d7e7 100644 --- a/firka_wear/lib/ui/widget/counter_digit.dart +++ b/firka_wear/lib/ui/shared/counter_digit.dart @@ -1,21 +1,22 @@ -import 'package:firka_wear/ui/model/style.dart'; -import 'package:flutter/material.dart'; - -class CounterDigitWidget extends StatelessWidget { - final String c; - final TextStyle? style; - - const CounterDigitWidget(this.c, this.style, {super.key}); - - @override - Widget build(BuildContext context) { - return Card( - shadowColor: Colors.transparent, - color: appStyle.colors.buttonSecondaryFill, - child: Padding( - padding: EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4), - child: Text(c, style: style), - ), - ); - } -} +import 'package:flutter/material.dart'; + +import 'package:firka_wear/ui/theme/style.dart'; + +class CounterDigitWidget extends StatelessWidget { + final String c; + final TextStyle? style; + + const CounterDigitWidget(this.c, this.style, {super.key}); + + @override + Widget build(BuildContext context) { + return Card( + shadowColor: Colors.transparent, + color: appStyle.colors.buttonSecondaryFill, + child: Padding( + padding: EdgeInsets.only(left: 8, right: 8, top: 4, bottom: 4), + child: Text(c, style: style), + ), + ); + } +} diff --git a/firka_wear/lib/ui/widget/delayed_spinner.dart b/firka_wear/lib/ui/shared/delayed_spinner.dart similarity index 94% rename from firka_wear/lib/ui/widget/delayed_spinner.dart rename to firka_wear/lib/ui/shared/delayed_spinner.dart index 53e4b65..e359014 100644 --- a/firka_wear/lib/ui/widget/delayed_spinner.dart +++ b/firka_wear/lib/ui/shared/delayed_spinner.dart @@ -1,42 +1,42 @@ -import 'dart:async'; - -import 'package:flutter/material.dart'; - -class DelayedSpinnerWidget extends StatefulWidget { - const DelayedSpinnerWidget({super.key}); - - @override - State createState() => _DelayedSpinner(); -} - -class _DelayedSpinner extends State { - Timer? timer; - bool showSpinner = false; - - @override - void initState() { - super.initState(); - - timer = Timer(Duration(milliseconds: 50), () { - setState(() { - showSpinner = true; - }); - }); - } - - @override - Widget build(BuildContext context) { - if (showSpinner) { - return CircularProgressIndicator(); - } else { - return SizedBox(); - } - } - - @override - void dispose() { - super.dispose(); - - timer?.cancel(); - } -} +import 'dart:async'; + +import 'package:flutter/material.dart'; + +class DelayedSpinnerWidget extends StatefulWidget { + const DelayedSpinnerWidget({super.key}); + + @override + State createState() => _DelayedSpinner(); +} + +class _DelayedSpinner extends State { + Timer? timer; + bool showSpinner = false; + + @override + void initState() { + super.initState(); + + timer = Timer(Duration(milliseconds: 50), () { + setState(() { + showSpinner = true; + }); + }); + } + + @override + Widget build(BuildContext context) { + if (showSpinner) { + return CircularProgressIndicator(); + } else { + return SizedBox(); + } + } + + @override + void dispose() { + super.dispose(); + + timer?.cancel(); + } +} diff --git a/firka_wear/lib/ui/widget/firka_icon.dart b/firka_wear/lib/ui/shared/firka_icon.dart similarity index 90% rename from firka_wear/lib/ui/widget/firka_icon.dart rename to firka_wear/lib/ui/shared/firka_icon.dart index b8e41a6..2ba4418 100644 --- a/firka_wear/lib/ui/widget/firka_icon.dart +++ b/firka_wear/lib/ui/shared/firka_icon.dart @@ -1,36 +1,39 @@ -import 'dart:typed_data'; - -import 'package:flutter/material.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:majesticons_flutter/majesticons_flutter.dart'; - -enum FirkaIconType { Majesticons, MajesticonsLocal } - -class FirkaIconWidget extends StatelessWidget { - final FirkaIconType iconType; - final Object iconData; - final Color color; - final double? size; - - const FirkaIconWidget( - this.iconType, - this.iconData, { - super.key, - this.color = Colors.white, - this.size, - }); - - @override - Widget build(BuildContext context) { - switch (iconType) { - case FirkaIconType.Majesticons: - return Majesticon(iconData as Uint8List, color: color, size: size); - case FirkaIconType.MajesticonsLocal: - return SvgPicture.asset( - 'assets/majesticons/${iconData as String}.svg', - color: color, - height: size, - ); - } - } -} +// Enum values match external asset/API naming. +// ignore_for_file: constant_identifier_names + +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:majesticons_flutter/majesticons_flutter.dart'; + +enum FirkaIconType { Majesticons, MajesticonsLocal } + +class FirkaIconWidget extends StatelessWidget { + final FirkaIconType iconType; + final Object iconData; + final Color color; + final double? size; + + const FirkaIconWidget( + this.iconType, + this.iconData, { + super.key, + this.color = Colors.white, + this.size, + }); + + @override + Widget build(BuildContext context) { + switch (iconType) { + case FirkaIconType.Majesticons: + return Majesticon(iconData as Uint8List, color: color, size: size); + case FirkaIconType.MajesticonsLocal: + return SvgPicture.asset( + 'assets/majesticons/${iconData as String}.svg', + color: color, + height: size, + ); + } + } +} diff --git a/firka_wear/lib/ui/widget/grade_small_card.dart b/firka_wear/lib/ui/shared/grade_small_card.dart similarity index 88% rename from firka_wear/lib/ui/widget/grade_small_card.dart rename to firka_wear/lib/ui/shared/grade_small_card.dart index 33177e6..6c7acd4 100644 --- a/firka_wear/lib/ui/widget/grade_small_card.dart +++ b/firka_wear/lib/ui/shared/grade_small_card.dart @@ -1,10 +1,10 @@ -import 'package:kreta_api/kreta_api.dart'; -import 'package:firka_wear/helpers/ui/firka_card.dart'; -import 'package:firka_wear/helpers/ui/grade_helpers.dart'; -import 'package:firka_wear/ui/widget/class_icon.dart'; import 'package:flutter/material.dart'; +import 'package:kreta_api/kreta_api.dart'; -import '../model/style.dart'; +import 'package:firka_wear/ui/components/firka_card.dart'; +import 'package:firka_wear/ui/components/grade_helpers.dart'; +import 'package:firka_wear/ui/shared/class_icon.dart'; +import 'package:firka_wear/ui/theme/style.dart'; class GradeSmallCard extends FirkaCard { final List grades; diff --git a/firka_wear/lib/ui/model/style.dart b/firka_wear/lib/ui/theme/style.dart similarity index 98% rename from firka_wear/lib/ui/model/style.dart rename to firka_wear/lib/ui/theme/style.dart index 5359a1d..63e7b3d 100644 --- a/firka_wear/lib/ui/model/style.dart +++ b/firka_wear/lib/ui/theme/style.dart @@ -1,3 +1,6 @@ +// Design token names (e.g. H_H1, B_16R) follow the design system. +// ignore_for_file: non_constant_identifier_names + import 'package:flutter/material.dart'; class FirkaFonts { diff --git a/firka_wear/lib/ui/wear/screens/home/home_screen.dart b/firka_wear/lib/ui/wear/screens/home/home_screen.dart index e326da7..d4f92a7 100644 --- a/firka_wear/lib/ui/wear/screens/home/home_screen.dart +++ b/firka_wear/lib/ui/wear/screens/home/home_screen.dart @@ -1,21 +1,21 @@ import 'dart:async'; import 'dart:math'; -import 'package:kreta_api/kreta_api.dart'; -import 'package:firka_wear/helpers/extensions.dart'; -import 'package:firka_wear/ui/widget/class_icon.dart'; -import 'package:firka_wear/main.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_arc_text/flutter_arc_text.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:kreta_api/kreta_api.dart'; import 'package:watch_connectivity/watch_connectivity.dart'; import 'package:wear_plus/wear_plus.dart'; -import '../../../../helpers/debug_helper.dart'; -import '../../../../l10n/app_localizations.dart'; -import '../../../model/style.dart'; -import '../../widgets/circular_progress_indicator.dart'; +import 'package:firka_wear/app/initialization.dart'; +import 'package:firka_wear/core/debug_helper.dart'; +import 'package:firka_wear/core/extensions.dart'; +import 'package:firka_wear/l10n/app_localizations.dart'; +import 'package:firka_wear/ui/theme/style.dart'; +import 'package:firka_wear/ui/shared/class_icon.dart'; +import 'package:firka_wear/ui/wear/widgets/circular_progress_indicator.dart'; class WearHomeScreen extends StatefulWidget { final WearAppInitialization data; @@ -23,13 +23,11 @@ class WearHomeScreen extends StatefulWidget { const WearHomeScreen(this.data, {super.key}); @override - State createState() => _WearHomeScreenState(data); + State createState() => _WearHomeScreenState(); } class _WearHomeScreenState extends State { - final WearAppInitialization data; - - _WearHomeScreenState(this.data); + WearAppInitialization get data => widget.data; int? currentLessonNo; List today = List.empty(growable: true); diff --git a/firka_wear/lib/ui/wear/screens/login/login_screen.dart b/firka_wear/lib/ui/wear/screens/login/login_screen.dart index f86553c..07d3130 100644 --- a/firka_wear/lib/ui/wear/screens/login/login_screen.dart +++ b/firka_wear/lib/ui/wear/screens/login/login_screen.dart @@ -2,28 +2,27 @@ import 'dart:async'; -import 'package:kreta_api/kreta_api.dart'; -import 'package:firka_wear/helpers/extensions.dart'; import 'package:flutter/material.dart'; +import 'package:kreta_api/kreta_api.dart'; import 'package:watch_connectivity/watch_connectivity.dart'; import 'package:wear_plus/wear_plus.dart'; -import '../../../../helpers/db/models/token_model.dart'; -import '../../../../main.dart'; -import '../../../model/style.dart'; -import '../home/home_screen.dart'; +import 'package:firka_wear/app/initialization.dart'; +import 'package:firka_wear/core/extensions.dart'; +import 'package:firka_wear/data/models/token_model.dart'; +import 'package:firka_wear/ui/theme/style.dart'; +import 'package:firka_wear/ui/wear/screens/home/home_screen.dart'; class WearLoginScreen extends StatefulWidget { final WearAppInitialization data; const WearLoginScreen(this.data, {super.key}); @override - State createState() => _WearLoginScreen(data); + State createState() => _WearLoginScreen(); } class _WearLoginScreen extends State { - final WearAppInitialization initData; - _WearLoginScreen(this.initData); + WearAppInitialization get initData => widget.data; bool init = false; bool isPaired = false; @@ -81,7 +80,7 @@ class _WearLoginScreen extends State { timetable: timetable, grades: grades, ); - if (!context.mounted) return; + if (!mounted) return; Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute( builder: (context) => WearHomeScreen(initData), diff --git a/firka_wear/lib/ui/wear/widgets/circular_progress_indicator.dart b/firka_wear/lib/ui/wear/widgets/circular_progress_indicator.dart index 2d229cd..880c680 100644 --- a/firka_wear/lib/ui/wear/widgets/circular_progress_indicator.dart +++ b/firka_wear/lib/ui/wear/widgets/circular_progress_indicator.dart @@ -17,11 +17,11 @@ class CircularProgressIndicatorWidget extends StatefulWidget { }); @override - _CircularProgressIndicatorWidgetState createState() => - _CircularProgressIndicatorWidgetState(); + CircularProgressIndicatorWidgetState createState() => + CircularProgressIndicatorWidgetState(); } -class _CircularProgressIndicatorWidgetState +class CircularProgressIndicatorWidgetState extends State with SingleTickerProviderStateMixin { late AnimationController _controller;