// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. library fitness; import 'package:playfair/playfair.dart' as playfair; import 'package:sky/editing/input.dart'; import 'package:sky/painting/text_style.dart'; import 'package:sky/theme/colors.dart' as colors; import 'package:sky/widgets.dart'; import 'user_data.dart'; import 'date_utils.dart'; import 'dart:async'; part 'feed.dart'; part 'fitness_item.dart'; part 'fitness_types.dart'; part 'meal.dart'; part 'measurement.dart'; part 'settings.dart'; class UserData { List _items = []; List get items => _items; void set items(List newItems) { _items = []; _items.addAll(newItems); sort(); } void sort() { _items.sort((a, b) => -a.when.compareTo(b.when)); } void addAndSave(FitnessItem item) { _items.add(item); sort(); save(); } void removeAndSave(FitnessItem item) { _items.remove(item); save(); } Future save() => saveFitnessData(_items); } class FitnessApp extends App { NavigationState _navigationState; final UserData _userData = new UserData(); void didMount() { super.didMount(); loadFitnessData().then((List list) { setState(() => _userData.items = list); }).catchError((e) => print("Failed to load data: $e")); } void save() { _userData.save().catchError((e) => print("Failed to load data: $e")); } void initState() { _navigationState = new NavigationState([ new Route( name: '/', builder: (navigator, route) => new FeedFragment( navigator: navigator, userData: _userData.items, onItemCreated: _handleItemCreated, onItemDeleted: _handleItemDeleted ) ), new Route( name: '/meals/new', builder: (navigator, route) => new MealFragment( navigator: navigator, onCreated: _handleItemCreated ) ), new Route( name: '/measurements/new', builder: (navigator, route) => new MeasurementFragment( navigator: navigator, onCreated: _handleItemCreated ) ), new Route( name: '/settings', builder: (navigator, route) => new SettingsFragment(navigator, backupSetting, settingsUpdater) ), ]); super.initState(); } void onBack() { if (_navigationState.hasPrevious()) { setState(() => _navigationState.pop()); } else { super.onBack(); } } void _handleItemCreated(FitnessItem item) { setState(() => _userData.addAndSave(item)); } void _handleItemDeleted(FitnessItem item) { setState(() => _userData.removeAndSave(item)); } BackupMode backupSetting = BackupMode.disabled; void settingsUpdater({ BackupMode backup }) { setState(() { if (backup != null) backupSetting = backup; }); } Widget build() { return new Theme( data: new ThemeData( brightness: ThemeBrightness.light, primarySwatch: colors.Indigo, accentColor: colors.PinkAccent[200] ), child: new TaskDescription( label: 'Fitness', child: new Navigator(_navigationState) ) ); } } void main() { runApp(new FitnessApp()); }