Skip to content

Commit

Permalink
perf: new way of caching for faster loading
Browse files Browse the repository at this point in the history
  • Loading branch information
SlayerOrnstein committed May 26, 2024
1 parent 0cf173f commit fc7f954
Show file tree
Hide file tree
Showing 59 changed files with 1,319,694 additions and 2,623 deletions.
22 changes: 22 additions & 0 deletions .husky/pre-commit
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,25 @@
dart format --line-length 80 --set-exit-if-changed lib test
flutter analyze
flutter test

cd packages

cd fish_repository
dart format --line-length 80 --set-exit-if-changed lib test
flutter analyze
flutter test

# cd ../navis_ui
# dart format --line-length 80 --set-exit-if-changed lib test
# flutter analyze
# flutter test

# cd ../notification_repository
# dart format --line-length 80 --set-exit-if-changed lib test
# flutter analyze
# flutter test

cd ../warframestat_repository
dart format --line-length 80 --set-exit-if-changed lib test
dart analyze
dart test
4 changes: 4 additions & 0 deletions lib/app/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import 'package:navis/worldstate/worldstate.dart';
import 'package:navis_ui/navis_ui.dart';
import 'package:notification_repository/notification_repository.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class NavisApp extends StatefulWidget {
const NavisApp({super.key});
Expand Down Expand Up @@ -115,6 +117,8 @@ class _NavisAppState extends State<NavisApp> with WidgetsBindingObserver {

if (language != newLocale) {
userSettingsCubit.updateLanguage(newLocale);
RepositoryProvider.of<WarframestatRepository>(context).language =
Language.values.byName(newLocale.languageCode);
}

return newLocale;
Expand Down
5 changes: 3 additions & 2 deletions lib/app/widgets/bloc_bootstrap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:navis/settings/settings.dart';
import 'package:navis/worldstate/worldstate.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class BlocBootstrap extends StatelessWidget {
const BlocBootstrap({super.key, required this.child});
Expand All @@ -11,7 +11,8 @@ class BlocBootstrap extends StatelessWidget {

@override
Widget build(BuildContext context) {
final worldstateRepo = RepositoryProvider.of<WorldstateRepository>(context);
final worldstateRepo =
RepositoryProvider.of<WarframestatRepository>(context);
final usersettings = RepositoryProvider.of<UserSettings>(context);

return MultiBlocProvider(
Expand Down
15 changes: 8 additions & 7 deletions lib/app/widgets/repo_bootstrap.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:hive/hive.dart';
import 'package:navis/settings/settings.dart';
import 'package:notification_repository/notification_repository.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class RepositoryBootstrap extends StatefulWidget {
const RepositoryBootstrap({
super.key,
required this.settings,
required this.warframestatCache,
required this.cache,
required this.child,
});

final UserSettings settings;
final WarframestatCache warframestatCache;
final Box<Map<dynamic, dynamic>> cache;
final Widget child;

@override
Expand All @@ -23,16 +24,16 @@ class RepositoryBootstrap extends StatefulWidget {

class _RepositoryBootstrapState extends State<RepositoryBootstrap> {
late NotificationRepository _notifications;
late WorldstateRepository _worldstateRepository;
late WarframestatRepository _warframestatRepository;

@override
void initState() {
super.initState();

_notifications = NotificationRepository();
_worldstateRepository = WorldstateRepository(
_warframestatRepository = WarframestatRepository(
client: SentryHttpClient(),
cache: widget.warframestatCache,
cache: widget.cache,
);
}

Expand All @@ -41,7 +42,7 @@ class _RepositoryBootstrapState extends State<RepositoryBootstrap> {
return MultiRepositoryProvider(
providers: [
RepositoryProvider.value(value: widget.settings),
RepositoryProvider.value(value: _worldstateRepository),
RepositoryProvider.value(value: _warframestatRepository),
RepositoryProvider.value(value: _notifications),
],
child: widget.child,
Expand Down
13 changes: 9 additions & 4 deletions lib/bootstrap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,26 +12,31 @@ import 'package:navis/firebase_options.dart';
import 'package:navis/settings/settings.dart';
import 'package:navis/utils/utils.dart';
import 'package:path_provider/path_provider.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:sentry_hive/sentry_hive.dart';

Future<void> bootstrap(FutureOr<Widget> Function() builder) async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
await Hive.initFlutter();

final appDir = await getApplicationDocumentsDirectory();
final temp = await getTemporaryDirectory();
final settings = await UserSettings.initSettings(appDir.path);
final warframestateCache = await WarframestatCache.initCache(appDir.path);

Bloc.observer = AppBlocObserver();
HydratedBloc.storage = await SentryHydratedStorage.build(
storageDirectory: await getTemporaryDirectory(),
storageDirectory: temp,
);

final cache = await SentryHive.openBox<Map<dynamic, dynamic>>(
'cache',
path: temp.path,
);

runApp(
RepositoryBootstrap(
settings: settings,
warframestatCache: warframestateCache,
cache: cache,
child: BlocBootstrap(child: await builder()),
),
);
Expand Down
4 changes: 2 additions & 2 deletions lib/codex/bloc/search_bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:navis/utils/utils.dart';
import 'package:rxdart/rxdart.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

export 'search_event.dart';
export 'search_state.dart';
Expand All @@ -20,7 +20,7 @@ class SearchBloc extends Bloc<SearchEvent, SearchState> {
on<FilterResults>(_filterResults);
}

final WorldstateRepository repository;
final WarframestatRepository repository;

List<MinimalItem> _originalResults = [];

Expand Down
4 changes: 2 additions & 2 deletions lib/codex/cubit/item_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import 'package:equatable/equatable.dart';
import 'package:navis/utils/utils.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

part 'item_state.dart';

class ItemCubit extends Cubit<ItemState> {
ItemCubit(this.repo) : super(ItemInitial());

final WorldstateRepository repo;
final WarframestatRepository repo;

Future<void> fetchItem(String uniqueName) async {
try {
Expand Down
4 changes: 2 additions & 2 deletions lib/codex/views/codex_search_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
import 'package:navis/codex/codex.dart';
import 'package:navis/l10n/l10n.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class CodexSearchPage extends StatelessWidget {
const CodexSearchPage({super.key});

@override
Widget build(BuildContext context) {
final repo = RepositoryProvider.of<WorldstateRepository>(context);
final repo = RepositoryProvider.of<WarframestatRepository>(context);

return TraceableWidget(
child: Scaffold(
Expand Down
4 changes: 2 additions & 2 deletions lib/codex/views/component_drops.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:navis/codex/codex.dart';
import 'package:navis/l10n/l10n.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class ComponentDrops extends StatelessWidget {
const ComponentDrops({super.key, required this.drops});
Expand All @@ -23,7 +23,7 @@ class ComponentDrops extends StatelessWidget {
builder: (BuildContext context) {
return BlocProvider(
create: (context) => SearchBloc(
RepositoryProvider.of<WorldstateRepository>(context),
RepositoryProvider.of<WarframestatRepository>(context),
),
child: Scaffold(
body: Builder(
Expand Down
4 changes: 2 additions & 2 deletions lib/codex/views/entry_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:navis/codex/codex.dart';
import 'package:navis_ui/navis_ui.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class EntryView extends StatelessWidget {
const EntryView({super.key, required this.item});
Expand All @@ -15,7 +15,7 @@ class EntryView extends StatelessWidget {

@override
Widget build(BuildContext context) {
final repo = RepositoryProvider.of<WorldstateRepository>(context);
final repo = RepositoryProvider.of<WarframestatRepository>(context);

return BlocProvider(
create: (context) => ItemCubit(repo)..fetchItem(item.uniqueName),
Expand Down
4 changes: 2 additions & 2 deletions lib/codex/widgets/codex_search/search_bar.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:navis/codex/codex.dart';
import 'package:navis/codex/utils/debouncer.dart';
import 'package:navis/l10n/l10n.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class CodexSearchBar extends StatefulWidget {
const CodexSearchBar({super.key});
Expand All @@ -26,7 +26,7 @@ class _CodexSearchBarState extends State<CodexSearchBar> {
Future<List<MinimalItem>?> _search(String query) async {
_currentQuery = query;

final api = RepositoryProvider.of<WorldstateRepository>(context);
final api = RepositoryProvider.of<WarframestatRepository>(context);
final options = await api.searchItems(query);

if (_currentQuery != query) return null;
Expand Down
6 changes: 3 additions & 3 deletions lib/synthtargets/cubit/synthtargets_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:navis/synthtargets/cubit/synthtargets_state.dart';
import 'package:navis/utils/utils.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

export 'synthtargets_state.dart';

Expand All @@ -13,11 +13,11 @@ enum SynthtargetsEvent { update }
class SynthtargetsCubit extends HydratedCubit<SynthtargetsState> {
SynthtargetsCubit(this.repository) : super(SynthtargetsInitial());

final WorldstateRepository repository;
final WarframestatRepository repository;

Future<void> fetchSynthtargets() async {
try {
final targets = await ConnectionManager.call(repository.getSynthTargets);
final targets = await ConnectionManager.call(repository.fetchTargets);

emit(TargetsLocated(targets));
} catch (e) {
Expand Down
4 changes: 2 additions & 2 deletions lib/synthtargets/views/targets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
import 'package:navis/synthtargets/cubit/synthtargets_cubit.dart';
import 'package:navis/synthtargets/widgets/target.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class SynthTargetsView extends StatelessWidget {
const SynthTargetsView({super.key});
Expand All @@ -17,7 +17,7 @@ class SynthTargetsView extends StatelessWidget {
appBar: AppBar(),
body: BlocProvider(
create: (_) => SynthtargetsCubit(
RepositoryProvider.of<WorldstateRepository>(context),
RepositoryProvider.of<WarframestatRepository>(context),
)..fetchSynthtargets(),
child: const _SynthTargetsPage(),
),
Expand Down
8 changes: 4 additions & 4 deletions lib/worldstate/cubits/deals/darvodeal_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,24 @@ import 'package:navis/utils/utils.dart';
import 'package:navis/worldstate/cubits/deals/darvodeal_state.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

class DarvodealCubit extends HydratedCubit<DarvodealState> {
DarvodealCubit(this.repository) : super(DarvodealInitial());

final WorldstateRepository repository;
final WarframestatRepository repository;

Future<void> fetchDeal(String uniqueName, String name) async {
emit(DarvodealLoading());

try {
Item? info;
if (await ConnectionManager.hasInternetConnection) {
info = await repository.getDealInfo(uniqueName, name);
info = await repository.fetchDealInfo(uniqueName, name);
}

info = await ConnectionManager.call(
() async => repository.getDealInfo(uniqueName, name),
() async => repository.fetchDealInfo(uniqueName, name),
);

if (info != null) {
Expand Down
12 changes: 3 additions & 9 deletions lib/worldstate/cubits/worldstate/worldstate_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import 'package:hydrated_bloc/hydrated_bloc.dart';
import 'package:navis/utils/utils.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:warframestat_client/warframestat_client.dart';
import 'package:worldstate_repository/worldstate_repository.dart';
import 'package:warframestat_repository/warframestat_repository.dart';

part 'worldstate_state.dart';

Expand All @@ -18,21 +18,15 @@ const String unknownException = r'Something happened ¯\_(ツ)_/¯';
class WorldstateCubit extends HydratedCubit<SolsystemState> {
WorldstateCubit(this.repository) : super(SolsystemInitial());

final WorldstateRepository repository;
final WarframestatRepository repository;

Future<void> fetchWorldstate(
Locale locale, {
bool forceUpdate = false,
}) async {
try {
final state = await ConnectionManager.call(
() async => repository.getWorldstate(
language: Language.values.firstWhere(
(e) => e.name == locale.languageCode,
orElse: () => Language.en,
),
forceUpdate: forceUpdate,
),
() async => repository.fetchWorldstate(),
);

state.clean();
Expand Down
5 changes: 2 additions & 3 deletions lib/worldstate/widgets/timers/rewards.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ class DailyReward extends StatelessWidget {
const DailyReward({super.key});

DateTime get endOfDay {
final now = DateTime.now().toUtc();
final now = DateTime.timestamp();

return DateTime.utc(now.year, now.month, now.day, 23, 59, 59, 999)
.add(expiryWait);
return DateTime.utc(now.year, now.month, now.day, 23, 59, 59, 999);
}

@override
Expand Down
Loading

0 comments on commit fc7f954

Please sign in to comment.