diff --git a/lib/assets/images/categories/business-dark.svg b/lib/assets/images/categories/business-dark.svg
new file mode 100644
index 0000000..9e09cda
--- /dev/null
+++ b/lib/assets/images/categories/business-dark.svg
@@ -0,0 +1,15 @@
+
diff --git a/lib/assets/images/categories/business-light.svg b/lib/assets/images/categories/business-light.svg
new file mode 100644
index 0000000..4b64c42
--- /dev/null
+++ b/lib/assets/images/categories/business-light.svg
@@ -0,0 +1,15 @@
+
diff --git a/lib/assets/images/categories/business.png b/lib/assets/images/categories/business.png
deleted file mode 100644
index 0470a94..0000000
Binary files a/lib/assets/images/categories/business.png and /dev/null differ
diff --git a/lib/assets/images/categories/economic-dark.svg b/lib/assets/images/categories/economic-dark.svg
new file mode 100644
index 0000000..3700deb
--- /dev/null
+++ b/lib/assets/images/categories/economic-dark.svg
@@ -0,0 +1,11 @@
+
diff --git a/lib/assets/images/categories/economic-light.svg b/lib/assets/images/categories/economic-light.svg
new file mode 100644
index 0000000..0513930
--- /dev/null
+++ b/lib/assets/images/categories/economic-light.svg
@@ -0,0 +1,11 @@
+
diff --git a/lib/assets/images/categories/economic.png b/lib/assets/images/categories/economic.png
deleted file mode 100644
index 44f67fb..0000000
Binary files a/lib/assets/images/categories/economic.png and /dev/null differ
diff --git a/lib/assets/images/categories/enviromental-dark.svg b/lib/assets/images/categories/enviromental-dark.svg
new file mode 100644
index 0000000..b59ba84
--- /dev/null
+++ b/lib/assets/images/categories/enviromental-dark.svg
@@ -0,0 +1,33 @@
+
diff --git a/lib/assets/images/categories/enviromental-light.svg b/lib/assets/images/categories/enviromental-light.svg
new file mode 100644
index 0000000..ce38dd6
--- /dev/null
+++ b/lib/assets/images/categories/enviromental-light.svg
@@ -0,0 +1,33 @@
+
diff --git a/lib/assets/images/categories/enviromental.png b/lib/assets/images/categories/enviromental.png
deleted file mode 100644
index f56f648..0000000
Binary files a/lib/assets/images/categories/enviromental.png and /dev/null differ
diff --git a/lib/assets/images/categories/political-dark.svg b/lib/assets/images/categories/political-dark.svg
new file mode 100644
index 0000000..ae8f3ad
--- /dev/null
+++ b/lib/assets/images/categories/political-dark.svg
@@ -0,0 +1,8 @@
+
diff --git a/lib/assets/images/categories/political-light.svg b/lib/assets/images/categories/political-light.svg
new file mode 100644
index 0000000..c8f71b4
--- /dev/null
+++ b/lib/assets/images/categories/political-light.svg
@@ -0,0 +1,8 @@
+
diff --git a/lib/assets/images/categories/political.png b/lib/assets/images/categories/political.png
deleted file mode 100644
index 06ea42a..0000000
Binary files a/lib/assets/images/categories/political.png and /dev/null differ
diff --git a/lib/assets/images/categories/social-dark.svg b/lib/assets/images/categories/social-dark.svg
new file mode 100644
index 0000000..c4a0fb8
--- /dev/null
+++ b/lib/assets/images/categories/social-dark.svg
@@ -0,0 +1,20 @@
+
diff --git a/lib/assets/images/categories/social-light.svg b/lib/assets/images/categories/social-light.svg
new file mode 100644
index 0000000..2b28dac
--- /dev/null
+++ b/lib/assets/images/categories/social-light.svg
@@ -0,0 +1,20 @@
+
diff --git a/lib/assets/images/categories/social.png b/lib/assets/images/categories/social.png
deleted file mode 100644
index 2b4e4ea..0000000
Binary files a/lib/assets/images/categories/social.png and /dev/null differ
diff --git a/lib/assets/images/categories/tech-dark.svg b/lib/assets/images/categories/tech-dark.svg
new file mode 100644
index 0000000..3fa3e80
--- /dev/null
+++ b/lib/assets/images/categories/tech-dark.svg
@@ -0,0 +1,18 @@
+
diff --git a/lib/assets/images/categories/tech-light.svg b/lib/assets/images/categories/tech-light.svg
new file mode 100644
index 0000000..ec8743a
--- /dev/null
+++ b/lib/assets/images/categories/tech-light.svg
@@ -0,0 +1,18 @@
+
diff --git a/lib/assets/images/categories/tech.png b/lib/assets/images/categories/tech.png
deleted file mode 100644
index 76bdc49..0000000
Binary files a/lib/assets/images/categories/tech.png and /dev/null differ
diff --git a/lib/assets/images/logos/logo-h-t.png b/lib/assets/images/logos/logo-h-t.png
deleted file mode 100644
index 1d259cc..0000000
Binary files a/lib/assets/images/logos/logo-h-t.png and /dev/null differ
diff --git a/lib/assets/images/logos/logo-horizontal-dark.svg b/lib/assets/images/logos/logo-horizontal-dark.svg
new file mode 100644
index 0000000..ab9db91
--- /dev/null
+++ b/lib/assets/images/logos/logo-horizontal-dark.svg
@@ -0,0 +1,44 @@
+
diff --git a/lib/assets/images/logos/logo-horizontal-light.svg b/lib/assets/images/logos/logo-horizontal-light.svg
new file mode 100644
index 0000000..04e066b
--- /dev/null
+++ b/lib/assets/images/logos/logo-horizontal-light.svg
@@ -0,0 +1,47 @@
+
diff --git a/lib/assets/images/logos/logo-v-t.png b/lib/assets/images/logos/logo-v-t.png
deleted file mode 100644
index 9d27213..0000000
Binary files a/lib/assets/images/logos/logo-v-t.png and /dev/null differ
diff --git a/lib/assets/images/logos/logo-vertical-dark.svg b/lib/assets/images/logos/logo-vertical-dark.svg
new file mode 100644
index 0000000..0cf46df
--- /dev/null
+++ b/lib/assets/images/logos/logo-vertical-dark.svg
@@ -0,0 +1,44 @@
+
diff --git a/lib/assets/images/logos/logo-vertical-light.svg b/lib/assets/images/logos/logo-vertical-light.svg
new file mode 100644
index 0000000..0f4c57f
--- /dev/null
+++ b/lib/assets/images/logos/logo-vertical-light.svg
@@ -0,0 +1,47 @@
+
diff --git a/lib/assets/images/themes/dark-theme.svg b/lib/assets/images/themes/dark-theme.svg
new file mode 100644
index 0000000..ce96210
--- /dev/null
+++ b/lib/assets/images/themes/dark-theme.svg
@@ -0,0 +1,6 @@
+
diff --git a/lib/assets/images/themes/light-theme.svg b/lib/assets/images/themes/light-theme.svg
new file mode 100644
index 0000000..93ac8c4
--- /dev/null
+++ b/lib/assets/images/themes/light-theme.svg
@@ -0,0 +1,6 @@
+
diff --git a/lib/config/design_config.dart b/lib/config/design_config.dart
index 3b009c9..3c74136 100644
--- a/lib/config/design_config.dart
+++ b/lib/config/design_config.dart
@@ -15,10 +15,10 @@ class DesignConfig {
Radius.circular(16),
);
- static final Border cardBorder = Border.all(
- color: Theme.of(context).colorScheme.cardBorder,
- width: 0.25,
- );
+ static Border get cardBorder => Border.all(
+ color: Theme.of(context).colorScheme.cardBorder,
+ width: 0.5,
+ );
static List get defaultShadow => [
BoxShadow(
@@ -28,6 +28,8 @@ class DesignConfig {
)
];
+ static Brightness get brightness => Theme.of(context).brightness;
+
static const Duration lowAnimationDuration = Duration(milliseconds: 300);
static const Duration mediumAnimationDuration = Duration(milliseconds: 600);
@@ -37,12 +39,12 @@ class DesignConfig {
? Brightness.light
: Brightness.dark,
statusBarColor: Colors.transparent,
- systemNavigationBarColor: Theme.of(context).colorScheme.surface,
- systemNavigationBarDividerColor: Colors.transparent,
- systemNavigationBarIconBrightness:
- Theme.of(context).colorScheme.brightness == Brightness.dark
- ? Brightness.light
- : Brightness.dark,
+ // systemNavigationBarColor: Theme.of(context).colorScheme.surface,
+ // systemNavigationBarDividerColor: Colors.transparent,
+ // systemNavigationBarIconBrightness:
+ // Theme.of(context).colorScheme.brightness == Brightness.dark
+ // ? Brightness.light
+ // : Brightness.dark,
);
}
diff --git a/lib/constants/assets.dart b/lib/constants/assets.dart
index 59af3fe..e22b26f 100644
--- a/lib/constants/assets.dart
+++ b/lib/constants/assets.dart
@@ -1,24 +1,36 @@
+import 'package:didvan/config/design_config.dart';
+import 'package:flutter/cupertino.dart';
+
class Assets {
static const String _basePath = 'lib/assets';
static const String _baseImagesPath = _basePath + '/images';
+ static const String _baseThemesPath = _basePath + '/images/themes';
static const String _baseAnimationsPath = _basePath + '/animations';
- static const String verticalLogoWithText =
- _baseImagesPath + '/logos/logo-v-t.png';
- static const String horizontalLogoWithText =
- _baseImagesPath + '/logos/logo-h-t.png';
+ static String get verticalLogoWithText =>
+ _baseImagesPath + '/logos/logo-vertical-$_themeSuffix.svg';
+ static String get horizontalLogoWithText =>
+ _baseImagesPath + '/logos/logo-horizontal-$_themeSuffix.svg';
static const String logoLoadingAnimation =
_baseAnimationsPath + '/indicator.riv';
- static const businessCategoryIcon =
- _baseImagesPath + '/categories/business.png';
- static const economicCategoryIcon =
- _baseImagesPath + '/categories/economic.png';
- static const enviromentalCategoryIcon =
- _baseImagesPath + '/categories/enviromental.png';
- static const politicalCategoryIcon =
- _baseImagesPath + '/categories/political.png';
- static const socialCategoryIcon = _baseImagesPath + '/categories/social.png';
- static const techCategoryIcon = _baseImagesPath + '/categories/tech.png';
+ static String get businessCategoryIcon =>
+ _baseImagesPath + '/categories/business-$_themeSuffix.svg';
+ static String get economicCategoryIcon =>
+ _baseImagesPath + '/categories/economic-$_themeSuffix.svg';
+ static String get enviromentalCategoryIcon =>
+ _baseImagesPath + '/categories/enviromental-$_themeSuffix.svg';
+ static String get politicalCategoryIcon =>
+ _baseImagesPath + '/categories/political-$_themeSuffix.svg';
+ static String get socialCategoryIcon =>
+ _baseImagesPath + '/categories/social-$_themeSuffix.svg';
+ static String get techCategoryIcon =>
+ _baseImagesPath + '/categories/tech-$_themeSuffix.svg';
+
+ static const String lightTheme = _baseThemesPath + '/light-theme.svg';
+ static const String darkTheme = _baseThemesPath + '/dark-theme.svg';
+
+ static String get _themeSuffix =>
+ DesignConfig.brightness == Brightness.dark ? 'dark' : 'light';
}
diff --git a/lib/main.dart b/lib/main.dart
index 878f462..87129d8 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,5 +1,5 @@
-import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
+import 'package:didvan/providers/theme_provider.dart';
import 'package:didvan/providers/user_provider.dart';
import 'package:didvan/routes/route_generator.dart';
import 'package:flutter/material.dart';
@@ -16,28 +16,33 @@ class Didvan extends StatelessWidget {
Widget build(BuildContext context) {
return MultiProvider(
providers: [
- ChangeNotifierProvider(
+ ChangeNotifierProvider(
create: (context) => UserProvider(),
),
+ ChangeNotifierProvider(
+ create: (context) => ThemeProvider(),
+ ),
],
- child: MaterialApp(
- debugShowCheckedModeBanner: false,
- title: 'Didvan',
- theme: LightThemeConfig.themeData,
- darkTheme: DarkThemeConfig.themeData,
- color: LightThemeConfig.themeData.primaryColor,
- themeMode: ThemeMode.light,
- onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings),
- initialRoute: '/',
- localizationsDelegates: const [
- GlobalCupertinoLocalizations.delegate,
- GlobalMaterialLocalizations.delegate,
- GlobalWidgetsLocalizations.delegate,
- ],
- supportedLocales: const [
- Locale("fa", "IR"),
- ],
- locale: const Locale("fa", "IR"),
+ child: Consumer(
+ builder: (context, themeProvider, child) => MaterialApp(
+ debugShowCheckedModeBanner: false,
+ title: 'Didvan',
+ theme: LightThemeConfig.themeData,
+ darkTheme: DarkThemeConfig.themeData,
+ color: LightThemeConfig.themeData.primaryColor,
+ themeMode: themeProvider.themeMode,
+ onGenerateRoute: (settings) => RouteGenerator.generateRoute(settings),
+ initialRoute: '/',
+ localizationsDelegates: const [
+ GlobalCupertinoLocalizations.delegate,
+ GlobalMaterialLocalizations.delegate,
+ GlobalWidgetsLocalizations.delegate,
+ ],
+ supportedLocales: const [
+ Locale("fa", "IR"),
+ ],
+ locale: const Locale("fa", "IR"),
+ ),
),
);
}
diff --git a/lib/models/settings_data.dart b/lib/models/settings_data.dart
new file mode 100644
index 0000000..e8404a9
--- /dev/null
+++ b/lib/models/settings_data.dart
@@ -0,0 +1,27 @@
+class SettingsData {
+ final String brightness;
+ final List notificationTimeRange;
+ final String fontFamily;
+ final double fontSizeScale;
+
+ SettingsData(
+ this.brightness,
+ this.notificationTimeRange,
+ this.fontFamily,
+ this.fontSizeScale,
+ );
+
+ factory SettingsData.fromJson(Map json) => SettingsData(
+ json['brightness'],
+ json['notificationTimeRange'],
+ json['fontFamily'],
+ json['fontSizeScale'],
+ );
+
+ Map toJson() => {
+ 'brightness': brightness,
+ 'notificationTimeRange': notificationTimeRange,
+ 'fontFamily': fontFamily,
+ 'fontSizeScale': fontSizeScale,
+ };
+}
diff --git a/lib/pages/home/profile/edit_profile/edit_profile.dart b/lib/pages/home/profile/edit_profile/edit_profile.dart
index 1bd7628..c459622 100644
--- a/lib/pages/home/profile/edit_profile/edit_profile.dart
+++ b/lib/pages/home/profile/edit_profile/edit_profile.dart
@@ -16,55 +16,47 @@ class EditProfile extends StatelessWidget {
return DidvanScaffold(
appBarData: AppBarData(title: 'ویرایش پروفایل'),
slivers: [
- const SliverPadding(
- padding: EdgeInsets.only(top: 16),
- sliver: SliverToBoxAdapter(
- child: ProfilePhoto(),
- ),
- ),
- SliverPadding(
- padding: const EdgeInsets.all(16),
- sliver: SliverToBoxAdapter(
- child: DidvanCard(
- child: Column(
- children: [
- DidvanTextField(
- title: 'نام کاربری',
- hintText: 'انتخاب نام کاربری (اختیاری)',
- onChanged: (value) {
- //TODO: Needs implementation
- },
- ),
- const SizedBox(height: 16),
- DidvanTextField(
- title: 'ایمیل',
- hintText: 'مثال: example@email.com',
- onChanged: (value) {
- //TODO: Meeds implementaion
- },
- ),
- const SizedBox(height: 16),
- const DidvanTextField(
- title: 'موبایل',
- enabled: false,
- hintText: '09123456789', //TODO: Needs api
- ),
- const SizedBox(height: 16),
- DidvanSwitch(
- value: true, //TODO: Needs api
- title: 'ورود با اثر انگشت',
- onChanged: (value) => {
- //TODO: Needs implementaion
- },
- ),
- const DidvanDivider(),
- MenuItem(
- title: 'تغییر رمز عبور',
- onTap: () {},
- ),
- ],
+ const SizedBox(height: 16),
+ const ProfilePhoto(),
+ const SizedBox(height: 16),
+ DidvanCard(
+ child: Column(
+ children: [
+ DidvanTextField(
+ title: 'نام کاربری',
+ hintText: 'انتخاب نام کاربری (اختیاری)',
+ onChanged: (value) {
+ //TODO: Needs implementation
+ },
),
- ),
+ const SizedBox(height: 16),
+ DidvanTextField(
+ title: 'ایمیل',
+ hintText: 'مثال: example@email.com',
+ onChanged: (value) {
+ //TODO: Meeds implementaion
+ },
+ ),
+ const SizedBox(height: 16),
+ const DidvanTextField(
+ title: 'موبایل',
+ enabled: false,
+ hintText: '09123456789', //TODO: Needs api
+ ),
+ const SizedBox(height: 16),
+ DidvanSwitch(
+ value: true, //TODO: Needs api
+ title: 'ورود با اثر انگشت',
+ onChanged: (value) => {
+ //TODO: Needs implementaion
+ },
+ ),
+ const DidvanDivider(),
+ MenuItem(
+ title: 'تغییر رمز عبور',
+ onTap: () {},
+ ),
+ ],
),
),
],
diff --git a/lib/pages/home/profile/profile.dart b/lib/pages/home/profile/profile.dart
index d6fc48c..805099b 100644
--- a/lib/pages/home/profile/profile.dart
+++ b/lib/pages/home/profile/profile.dart
@@ -1,12 +1,14 @@
import 'package:didvan/constants/app_icons.dart';
import 'package:didvan/pages/home/profile/widgets/menu_item.dart';
import 'package:didvan/pages/home/widgets/logo_app_bar.dart';
+import 'package:didvan/providers/theme_provider.dart';
import 'package:didvan/routes/routes.dart';
import 'package:didvan/widgets/didvan/card.dart';
import 'package:didvan/widgets/didvan/divider.dart';
import 'package:didvan/widgets/didvan/text.dart';
import 'package:didvan/widgets/item_title.dart';
import 'package:flutter/material.dart';
+import 'package:provider/provider.dart';
class Profile extends StatelessWidget {
const Profile({Key? key}) : super(key: key);
@@ -18,7 +20,12 @@ class Profile extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- const LogoAppBar(hasExtraPadding: false),
+ Consumer(
+ builder: (context, themeProvider, child) => LogoAppBar(
+ hasExtraPadding: false,
+ key: UniqueKey(),
+ ),
+ ),
const SizedBox(height: 16),
DidvanCard(
child: Column(
diff --git a/lib/pages/home/profile/settings/settings.dart b/lib/pages/home/profile/settings/settings.dart
index e445f8a..c73bf6b 100644
--- a/lib/pages/home/profile/settings/settings.dart
+++ b/lib/pages/home/profile/settings/settings.dart
@@ -1,23 +1,124 @@
+import 'package:day_night_time_picker/lib/daynight_timepicker.dart';
+import 'package:didvan/config/design_config.dart';
+import 'package:didvan/constants/app_icons.dart';
+import 'package:didvan/constants/assets.dart';
import 'package:didvan/models/view/app_bar_data.dart';
+import 'package:didvan/pages/home/profile/settings/settings_state.dart';
import 'package:didvan/pages/home/profile/widgets/menu_item.dart';
+import 'package:didvan/providers/theme_provider.dart';
import 'package:didvan/widgets/didvan/card.dart';
+import 'package:didvan/widgets/didvan/divider.dart';
import 'package:didvan/widgets/didvan/scaffold.dart';
+import 'package:didvan/widgets/didvan/text.dart';
+import 'package:didvan/widgets/item_title.dart';
+import 'package:didvan/widgets/state_handler.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
+import 'package:provider/provider.dart';
class Settings extends StatelessWidget {
const Settings({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
- return DidvanScaffold(
- appBarData: AppBarData(hasBack: true, title: 'تنظیمات'),
- slivers: [
- SliverToBoxAdapter(
- child: DidvanCard(
- child: MenuItem(title: 'زمان دریافت اعلان', onTap: () {}),
- ),
+ return Consumer(
+ builder: (context, state, child) => StateHandler(
+ state: context.read(),
+ builder: (context, state) => DidvanScaffold(
+ appBarData: AppBarData(hasBack: true, title: 'تنظیمات'),
+ slivers: [
+ DidvanCard(
+ child: MenuItem(
+ title: 'زمان دریافت اعلان',
+ onTap: () => _pickTimeRange(context),
+ icon: DidvanIcons.notification_regular,
+ suffix: state.notificationTimeRange[0],
+ ),
+ ),
+ const ItemTitle(
+ title: 'انتخاب قلم',
+ icon: DidvanIcons.font_solid,
+ ),
+ DidvanCard(
+ child: Column(
+ children: [
+ MenuItem(
+ suffix: 'نیاز به پیادهسازی',
+ title: 'فونت برنامه',
+ onTap: () {},
+ ),
+ const DidvanDivider(),
+ MenuItem(
+ suffix: 'نیاز به پیادهسازی',
+ title: 'اندازه متن',
+ onTap: () {},
+ ),
+ ],
+ ),
+ ),
+ const ItemTitle(
+ title: 'ظاهر برنامه',
+ icon: DidvanIcons.theme_solid,
+ ),
+ DidvanCard(
+ child: Row(
+ mainAxisAlignment: MainAxisAlignment.spaceAround,
+ children: [
+ _themeItem(context, state, 'light'),
+ _themeItem(context, state, 'dark'),
+ ],
+ ),
+ ),
+ ],
),
- ],
+ ),
+ );
+ }
+
+ Future _pickTimeRange(context) async {
+ final SettingsState state = context.read();
+ Navigator.of(context).push(
+ showPicker(
+ context: context,
+ value: const TimeOfDay(hour: 0, minute: 0),
+ onChange: (time) {
+ String hour = time.toString().split(':')[0];
+ state.notificationTimeRange = [];
+ },
+ ),
+ );
+ }
+
+ Widget _themeItem(
+ BuildContext context, SettingsState state, String brightness) {
+ final bool isDarkTheme = brightness == 'dark';
+ return GestureDetector(
+ onTap: () {
+ state.brightness = brightness;
+ if (isDarkTheme && Theme.of(context).brightness == Brightness.dark) {
+ return;
+ } else if (!isDarkTheme &&
+ Theme.of(context).brightness == Brightness.light) {
+ return;
+ } else {
+ if (isDarkTheme) {
+ context.read().themeMode = ThemeMode.dark;
+ DesignConfig.updateSystemUiOverlayStyle();
+ } else {
+ context.read().themeMode = ThemeMode.light;
+ DesignConfig.updateSystemUiOverlayStyle();
+ }
+ }
+ },
+ child: Column(
+ children: [
+ SvgPicture.asset(isDarkTheme ? Assets.darkTheme : Assets.lightTheme),
+ const SizedBox(height: 8),
+ DidvanText(
+ isDarkTheme ? 'تیره' : 'روشن',
+ ),
+ ],
+ ),
);
}
}
diff --git a/lib/pages/home/profile/settings/settings_state.dart b/lib/pages/home/profile/settings/settings_state.dart
new file mode 100644
index 0000000..0f0e973
--- /dev/null
+++ b/lib/pages/home/profile/settings/settings_state.dart
@@ -0,0 +1,73 @@
+import 'package:didvan/models/enums.dart';
+import 'package:didvan/providers/core_provider.dart';
+import 'package:didvan/services/storage/storage.dart';
+
+class SettingsState extends CoreProvier {
+ SettingsState() {
+ getSettingsFromStorage();
+ }
+
+ List _notificationTimeRange = [];
+ String _fontFamily = 'Dana-FA';
+ double _fontSizeScale = 1;
+ String _brightness = 'light';
+
+ set notificationTimeRange(List value) {
+ _notificationTimeRange = value;
+ StorageService.setValue(
+ key: 'notificationTimeRange',
+ value: value,
+ boxName: 'settings',
+ );
+ }
+
+ List get notificationTimeRange => _notificationTimeRange;
+
+ set fontFamily(String value) {
+ _fontFamily = value;
+ StorageService.setValue(
+ key: 'fontFamily',
+ value: value,
+ boxName: 'settings',
+ );
+ notifyListeners();
+ }
+
+ String get fontFamily => _fontFamily;
+
+ set fontSizeScale(double value) {
+ _fontSizeScale = value;
+ StorageService.setValue(
+ key: 'fontSizeScale',
+ value: value,
+ boxName: 'settings',
+ );
+ notifyListeners();
+ }
+
+ double get fontSizeScale => _fontSizeScale;
+
+ set brightness(String value) {
+ _brightness = value;
+ StorageService.setValue(
+ key: 'brightness',
+ value: value,
+ boxName: 'settings',
+ );
+ notifyListeners();
+ }
+
+ String get brightness => _brightness;
+
+ Future getSettingsFromStorage() async {
+ appState = AppState.busy;
+ final Map settingsData = await StorageService.getBoxData(
+ boxName: 'settings',
+ );
+ _notificationTimeRange = settingsData['notificationTimeRange'];
+ _fontFamily = settingsData['fontFamily'];
+ _fontSizeScale = settingsData['fontSizeScale'];
+ _brightness = settingsData['brightness'];
+ appState = AppState.idle;
+ }
+}
diff --git a/lib/pages/home/profile/widgets/menu_item.dart b/lib/pages/home/profile/widgets/menu_item.dart
index 5f4e855..f6956a3 100644
--- a/lib/pages/home/profile/widgets/menu_item.dart
+++ b/lib/pages/home/profile/widgets/menu_item.dart
@@ -33,6 +33,15 @@ class MenuItem extends StatelessWidget {
color: color ?? Theme.of(context).colorScheme.title,
),
const Spacer(),
+ if (suffix != null)
+ DidvanText(
+ suffix!,
+ style: Theme.of(context)
+ .textTheme
+ .subtitle2!
+ .copyWith(fontWeight: FontWeight.w400),
+ color: Theme.of(context).colorScheme.primary,
+ ),
trailing ??
Icon(
DidvanIcons.angle_left_regular,
diff --git a/lib/pages/home/radar/widgets/category_item.dart b/lib/pages/home/radar/widgets/category_item.dart
index bfbdbbb..b9bec99 100644
--- a/lib/pages/home/radar/widgets/category_item.dart
+++ b/lib/pages/home/radar/widgets/category_item.dart
@@ -3,6 +3,7 @@ import 'package:didvan/config/theme_data.dart';
import 'package:didvan/widgets/animated_visibility.dart';
import 'package:didvan/widgets/didvan/text.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_svg/flutter_svg.dart';
class CategoryItem extends StatelessWidget {
final String title;
@@ -45,9 +46,7 @@ class CategoryItem extends StatelessWidget {
borderRadius: DesignConfig.mediumBorderRadius,
),
padding: const EdgeInsets.all(8),
- child: Image.asset(
- asset,
- ),
+ child: SvgPicture.asset(asset),
),
),
const SizedBox(
diff --git a/lib/pages/splash/splash.dart b/lib/pages/splash/splash.dart
index 7e2645b..5d7de57 100644
--- a/lib/pages/splash/splash.dart
+++ b/lib/pages/splash/splash.dart
@@ -1,10 +1,14 @@
import 'package:didvan/config/design_config.dart';
import 'package:didvan/config/theme_data.dart';
import 'package:didvan/main.dart';
+import 'package:didvan/pages/splash/splash_state.dart';
+import 'package:didvan/providers/theme_provider.dart';
import 'package:didvan/routes/routes.dart';
+import 'package:didvan/services/app_initalizer.dart';
import 'package:didvan/widgets/logos/didvan_horizontal_logo.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
+import 'package:provider/provider.dart';
class Splash extends StatefulWidget {
const Splash({Key? key}) : super(key: key);
@@ -14,31 +18,47 @@ class Splash extends StatefulWidget {
}
class _SplashState extends State {
+ bool _isGettingThemeData = true;
+
@override
void initState() {
- Future.delayed(
- const Duration(seconds: 2),
- () {
- Navigator.of(context).pushReplacementNamed(
- Routes.home,
- );
- },
- );
+ _initialize();
super.initState();
}
+ Future _initialize() async {
+ await AppInitializer.setupServices();
+ final ThemeMode themeMode = await AppInitializer.initilizeSettings();
+ context.read().themeMode = themeMode;
+ await Future.delayed(
+ const Duration(milliseconds: 200),
+ () => setState(() {
+ _isGettingThemeData = false;
+ }),
+ );
+ await Future.delayed(const Duration(seconds: 2));
+ Navigator.of(context).pushReplacementNamed(Routes.home);
+ }
+
@override
Widget build(BuildContext context) {
DesignConfig.context = context;
+ if (_isGettingThemeData) {
+ return Container(
+ color: Colors.black,
+ height: double.infinity,
+ width: double.infinity,
+ );
+ }
return AnnotatedRegion(
value: DesignConfig.systemUiOverlayStyle.copyWith(
- systemNavigationBarColor: Theme.of(context).colorScheme.focused,
- ),
+ // systemNavigationBarColor: Theme.of(context).colorScheme.focused,
+ ),
child: Scaffold(
body: Container(
alignment: Alignment.center,
padding: const EdgeInsets.all(60),
- color: Theme.of(context).colorScheme.focused,
+ color: Theme.of(context).colorScheme.background,
child: const DidvanVerticalLogo(),
),
),
diff --git a/lib/providers/core_provider.dart b/lib/providers/core_provider.dart
index 3238711..45ef78c 100644
--- a/lib/providers/core_provider.dart
+++ b/lib/providers/core_provider.dart
@@ -9,5 +9,7 @@ class CoreProvier with ChangeNotifier {
notifyListeners();
}
+ void update() => notifyListeners();
+
AppState get appState => _appState;
}
diff --git a/lib/providers/theme_provider.dart b/lib/providers/theme_provider.dart
index 638c1c7..ab095b2 100644
--- a/lib/providers/theme_provider.dart
+++ b/lib/providers/theme_provider.dart
@@ -2,5 +2,12 @@ import 'package:didvan/providers/core_provider.dart';
import 'package:flutter/material.dart';
class ThemeProvider extends CoreProvier {
- late ThemeMode themeMode;
+ ThemeMode _themeMode = ThemeMode.system;
+
+ set themeMode(ThemeMode value) {
+ _themeMode = value;
+ notifyListeners();
+ }
+
+ ThemeMode get themeMode => _themeMode;
}
diff --git a/lib/routes/route_generator.dart b/lib/routes/route_generator.dart
index 4fdba0a..7b05f54 100644
--- a/lib/routes/route_generator.dart
+++ b/lib/routes/route_generator.dart
@@ -4,6 +4,7 @@ import 'package:didvan/pages/home/home.dart';
import 'package:didvan/pages/home/home_state.dart';
import 'package:didvan/pages/home/profile/edit_profile/edit_profile.dart';
import 'package:didvan/pages/home/profile/settings/settings.dart';
+import 'package:didvan/pages/home/profile/settings/settings_state.dart';
import 'package:didvan/pages/splash/splash.dart';
import 'package:didvan/pages/splash/splash_state.dart';
import 'package:didvan/routes/routes.dart';
@@ -40,7 +41,10 @@ class RouteGenerator {
);
case Routes.settings:
return _createRoute(
- const Settings(),
+ ChangeNotifierProvider(
+ create: (context) => SettingsState(),
+ child: const Settings(),
+ ),
);
default:
return _errorRoute();
diff --git a/lib/services/app_initalizer.dart b/lib/services/app_initalizer.dart
new file mode 100644
index 0000000..ac76df2
--- /dev/null
+++ b/lib/services/app_initalizer.dart
@@ -0,0 +1,37 @@
+import 'dart:io';
+
+import 'package:didvan/models/settings_data.dart';
+import 'package:didvan/services/storage/storage.dart';
+import 'package:flutter/material.dart';
+import 'package:hive/hive.dart';
+import 'package:path_provider/path_provider.dart';
+
+class AppInitializer {
+ static Future setupServices() async {
+ final Directory appDir = await getApplicationDocumentsDirectory();
+ Hive.init(appDir.path);
+ }
+
+ static Future initilizeSettings() async {
+ final bool settingsBoxExists = await StorageService.boxExists(
+ boxName: 'settings',
+ );
+ if (settingsBoxExists) {
+ final String brightness =
+ await StorageService.getValue(key: 'brightness', boxName: 'settings');
+ return brightness == 'dark' ? ThemeMode.dark : ThemeMode.light;
+ } else {
+ final SettingsData settingsData = SettingsData(
+ 'light',
+ ['00:00', '23:59'],
+ 'Dana-FA',
+ 1,
+ );
+ await StorageService.setBoxData(
+ data: settingsData.toJson(),
+ boxName: 'settings',
+ );
+ return ThemeMode.light;
+ }
+ }
+}
diff --git a/lib/services/request_handler.dart b/lib/services/network/request.dart
similarity index 99%
rename from lib/services/request_handler.dart
rename to lib/services/network/request.dart
index 462ee4d..fb2c7b7 100644
--- a/lib/services/request_handler.dart
+++ b/lib/services/network/request.dart
@@ -3,7 +3,7 @@ import 'dart:developer';
import 'dart:io';
import 'package:http/http.dart' as http;
-class RequestHandler {
+class RequestService {
static late String token;
String? errorMessage;
@@ -18,7 +18,7 @@ class RequestHandler {
bool isSuccess = false;
- RequestHandler(
+ RequestService(
this.url, {
Map? requestHeaders,
body,
diff --git a/lib/services/network/request_helper.dart b/lib/services/network/request_helper.dart
new file mode 100644
index 0000000..4e25ff3
--- /dev/null
+++ b/lib/services/network/request_helper.dart
@@ -0,0 +1 @@
+class RequestHelper {}
diff --git a/lib/services/storage/storage.dart b/lib/services/storage/storage.dart
new file mode 100644
index 0000000..ec01ccf
--- /dev/null
+++ b/lib/services/storage/storage.dart
@@ -0,0 +1,40 @@
+import 'package:hive/hive.dart';
+
+class StorageService {
+ static Future setValue({
+ required String key,
+ required dynamic value,
+ required String boxName,
+ }) async {
+ final Box box = await Hive.openBox(boxName);
+ await box.put(key, value);
+ await box.close();
+ }
+
+ static Future getValue({required String key, required String boxName}) async {
+ final Box box = await Hive.openBox(boxName);
+ final value = await box.get(key);
+ await box.close();
+ return value;
+ }
+
+ static Future setBoxData({
+ required Map data,
+ required String boxName,
+ }) async {
+ final Box box = await Hive.openBox(boxName);
+ await box.putAll(data);
+ await box.close();
+ }
+
+ static Future