import 'dart:async'; import 'package:arasystem_app/app.dart'; import 'package:arasystem_app/core/api/dio_provider.dart'; import 'package:arasystem_app/core/api/user_agent.dart'; import 'package:arasystem_app/core/constants/app_info_provider.dart'; import 'package:arasystem_app/core/files/downloaded_files.dart'; import 'package:arasystem_app/core/storage/first_run_marker.dart'; import 'package:arasystem_app/core/storage/secure_store.dart'; import 'package:arasystem_app/core/storage/token_store.dart'; import 'package:arasystem_app/core/storage/token_store_provider.dart'; import 'package:arasystem_app/core/theme/app_fonts.dart'; import 'package:arasystem_app/core/utils/provider_retry.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; /// `.env` 파일 이름 (pubspec assets) const String _envFileName = '.env'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); // .env 가 없으면 기본 주소로 동작한다 (ApiConfig.fromEnv) try { await dotenv.load(fileName: _envFileName); } on FileNotFoundError { // 기본값을 쓴다 } on EmptyEnvFileError { // 기본값을 쓴다 } AppFonts.registerFontLicenses(); // 토큰 보관 준비 — 첫 실행이면 보안 저장소에 남은 값을 지운다(앱을 띄우기 전에 끝낸다) final TokenStore tokenStore = TokenStore( secure: const FlutterSecureStore(), firstRun: PrefsFirstRunMarker(), ); await tokenStore.prepare(); final ({String? appVersion, String userAgent}) device = await loadAppDeviceInfo(); // 지난 실행이 받아 둔 파일(메일 첨부)을 지운다 — 기다리지 않는다(저장소가 차례를 지켜 새로 받는 파일은 지우지 않는다) final DownloadedFileStore downloadedFiles = CacheDirFileStore(); unawaited(downloadedFiles.purge()); runApp( ProviderScope( // 프로바이더의 실패를 저절로 다시 하지 않는다(core/utils/provider_retry.dart) retry: noAutomaticRetry, overrides: [ tokenStoreProvider.overrideWithValue(tokenStore), userAgentProvider.overrideWithValue(device.userAgent), appVersionProvider.overrideWithValue(device.appVersion), downloadedFileStoreProvider.overrideWithValue(downloadedFiles), ], child: const App(), ), ); }