Skip to content
Snippets Groups Projects
main.dart 6.06 KiB
Newer Older
tylersavery's avatar
tylersavery committed
import 'dart:io';
vjrj's avatar
vjrj committed
import 'package:connectivity_wrapper/connectivity_wrapper.dart';
anfeichtinger's avatar
anfeichtinger committed
import 'package:easy_localization/easy_localization.dart';
vjrj's avatar
vjrj committed
import 'package:easy_logger/easy_logger.dart';
vjrj's avatar
vjrj committed
import 'package:flutter/foundation.dart';
anfeichtinger's avatar
anfeichtinger committed
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_displaymode/flutter_displaymode.dart';
vjrj's avatar
vjrj committed
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:hive_flutter/hive_flutter.dart';
anfeichtinger's avatar
anfeichtinger committed
import 'package:hydrated_bloc/hydrated_bloc.dart';
vjrj's avatar
vjrj committed
import 'package:introduction_screen/introduction_screen.dart';
anfeichtinger's avatar
anfeichtinger committed
import 'package:path_provider/path_provider.dart';
vjrj's avatar
vjrj committed
import 'package:responsive_framework/responsive_wrapper.dart';
anfeichtinger's avatar
anfeichtinger committed

import 'config/theme.dart';
import 'cubit/theme_cubit.dart';
vjrj's avatar
vjrj committed
import 'shared_prefs.dart';
import 'ui/screens/skeleton_screen.dart';
vjrj's avatar
vjrj committed

vjrj's avatar
vjrj committed
// logs
final EasyLogger logger = EasyLogger(
vjrj's avatar
vjrj committed
  name: 'ginkgo',
vjrj's avatar
vjrj committed
  defaultLevel: LevelMessages.debug,
  enableBuildModes: <BuildMode>[
    BuildMode.debug,
    BuildMode.profile,
    BuildMode.release
  ],
  enableLevels: <LevelMessages>[
    LevelMessages.debug,
    LevelMessages.info,
    LevelMessages.error,
    LevelMessages.warning
  ],
);
anfeichtinger's avatar
anfeichtinger committed

void main() async {
  /// Initialize packages
  WidgetsFlutterBinding.ensureInitialized();
  await EasyLocalization.ensureInitialized();
vjrj's avatar
vjrj committed

  if (!kIsWeb && Platform.isAndroid) {
tylersavery's avatar
tylersavery committed
    await FlutterDisplayMode.setHighRefreshRate();
vjrj's avatar
vjrj committed
  }

vjrj's avatar
vjrj committed
  final SharedPreferencesHelper shared = SharedPreferencesHelper();
  await shared.init();
  await shared.getWallet();
  assert(shared.getPubKey() != null);

vjrj's avatar
vjrj committed
  // .env
vjrj's avatar
vjrj committed
  await dotenv.load(
      fileName: kReleaseMode
          ? 'assets/env.production.txt'
          : 'assets/.env.development');
vjrj's avatar
vjrj committed

  if (kIsWeb) {
    await Hive.initFlutter();
    HydratedBloc.storage = await HydratedStorage.build(
        storageDirectory: HydratedStorage.webStorageDirectory);
  } else {
    final Directory tmpDir = await getTemporaryDirectory();
    Hive.init(tmpDir.toString());
vjrj's avatar
vjrj committed
    HydratedBloc.storage =
        await HydratedStorage.build(storageDirectory: tmpDir);
tylersavery's avatar
tylersavery committed
  }
anfeichtinger's avatar
anfeichtinger committed

  runApp(
    EasyLocalization(
      path: 'assets/translations',
      supportedLocales: const <Locale>[
        Locale('en'),
vjrj's avatar
vjrj committed
        Locale('es'),
vjrj's avatar
vjrj committed
        Locale('fr'),
      ],
      fallbackLocale: const Locale('en'),
      useFallbackTranslations: true,
      child: const MyApp(),
anfeichtinger's avatar
anfeichtinger committed
    ),
  );
}

vjrj's avatar
vjrj committed
class AppIntro extends StatefulWidget {
  const AppIntro({super.key});

  @override
  State<AppIntro> createState() => _AppIntro();
}

class _AppIntro extends State<AppIntro> {
  final GlobalKey<IntroductionScreenState> introKey =
      GlobalKey<IntroductionScreenState>();

  void _onIntroEnd(BuildContext context) {
    Navigator.of(context).pushReplacement(
vjrj's avatar
vjrj committed
      MaterialPageRoute<void>(
          builder: (BuildContext _) => const SkeletonScreen()),
vjrj's avatar
vjrj committed
    );
  }

  @override
  Widget build(BuildContext context) {
    return IntroductionScreen(
      key: introKey,
      pages: <PageViewModel>[
        for (int i = 1; i <= 5; i++)
          createPageViewModel('intro_${i}_title', 'intro_${i}_description',
vjrj's avatar
vjrj committed
              'assets/img/undraw_intro_$i.png'),
vjrj's avatar
vjrj committed
      ],
      onDone: () => _onIntroEnd(context),
      showSkipButton: true,
      skipOrBackFlex: 0,
vjrj's avatar
vjrj committed
      onSkip: () => _onIntroEnd(context),
vjrj's avatar
vjrj committed
      nextFlex: 0,
vjrj's avatar
vjrj committed
      skip: Text(tr('skip')),
vjrj's avatar
vjrj committed
      next: const Icon(Icons.arrow_forward),
vjrj's avatar
vjrj committed
      done: Text(tr('start'),
          style: const TextStyle(fontWeight: FontWeight.w600)),
vjrj's avatar
vjrj committed
      dotsDecorator: const DotsDecorator(
        size: Size(10.0, 10.0),
        color: Color(0xFFBDBDBD),
        activeColor: Colors.blueAccent,
        activeSize: Size(22.0, 10.0),
        activeShape: RoundedRectangleBorder(
          borderRadius: BorderRadius.all(Radius.circular(25.0)),
        ),
      ),
    );
  }
}

PageViewModel createPageViewModel(
    String title, String body, String imageAsset) {
  return PageViewModel(
    title: tr(title),
    body: tr(body),
    image: Image.asset(imageAsset),
    decoration: const PageDecoration(
      pageColor: Colors.white,
      bodyTextStyle: TextStyle(fontSize: 18),
      titleTextStyle: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
    ),
  );
}

vjrj's avatar
vjrj committed
class MyApp extends StatefulWidget {
vjrj's avatar
vjrj committed
  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final bool _skip = false;

anfeichtinger's avatar
anfeichtinger committed
  @override
  Widget build(BuildContext context) {
    return BlocProvider<ThemeCubit>(
      create: (BuildContext context) => ThemeCubit(),
      child: BlocBuilder<ThemeCubit, ThemeModeState>(
        builder: (BuildContext context, ThemeModeState state) {
vjrj's avatar
vjrj committed
          return ConnectivityAppWrapper(
              app: MaterialApp(
anfeichtinger's avatar
anfeichtinger committed
            /// Localization is not available for the title.
vjrj's avatar
vjrj committed
            title: 'Ğinkgo',

            /// Theme stuff
            theme: lightTheme,
            darkTheme: darkTheme,
            themeMode: state.themeMode,

            /// Localization stuff
anfeichtinger's avatar
anfeichtinger committed
            localizationsDelegates: context.localizationDelegates,
            supportedLocales: context.supportedLocales,
            locale: context.locale,
            debugShowCheckedModeBanner: false,
vjrj's avatar
vjrj committed
            home: MediaQuery(
              data: const MediaQueryData(),
              child: _skip ? const SkeletonScreen() : const AppIntro(),
            ),
            builder: (BuildContext buildContext, Widget? widget) {
              return ResponsiveWrapper.builder(
                ConnectivityWidgetWrapper(
                  message: tr('offline'),
                  height: 20,
                  child: widget!,
                ),
                maxWidth: 480,
                minWidth: 480,
                // defaultScale: true,
                breakpoints: <ResponsiveBreakpoint>[
                  // const ResponsiveBreakpoint.resize(200, name: MOBILE),
                  const ResponsiveBreakpoint.resize(480, name: TABLET),
                  const ResponsiveBreakpoint.resize(480, name: DESKTOP),
                ],
                background: Container(color: const Color(0xFFF5F5F5)),
              );
            },
          ));