fixed important things

url-works
Christopher Schmitt 2024-01-09 12:34:44 +01:00
parent 1add5bb6fe
commit cf53061e3a
29 changed files with 344 additions and 560 deletions

View File

@ -1,12 +1,11 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:moody/utils/SlideDirection.dart';
import 'package:moody/utils/widgets/QuestionSliderWidget.dart';
import 'package:moody/utils/slide_direction.dart';
import 'package:moody/utils/widgets/question_slider_widget.dart';
import 'package:moody/views/color_page/color_page.dart';
import 'package:moody/views/entry_view/entry_page.dart';
import 'package:moody/views/first_page/first_page.dart';
import 'package:moody/views/home_page/home_page.dart';
import 'package:moody/views/home_page/kalendartryhome_page.dart';
import 'package:moody/views/settings_page/settings_page.dart';
import 'package:moody/views/start_page/start_page.dart';
import 'package:moody/views/statistic/statistic_page.dart';
@ -18,37 +17,32 @@ final GoRouter _router = GoRouter(
routes: [
GoRoute(
path: '/',
pageBuilder: (context, state) =>
_noAnimationTransition(context, state, StartPage()),
pageBuilder: (context, state) => _noAnimationTransition(context, state, const StartPage()),
),
GoRoute(
path: '/moods',
builder: (context, state) => CalendarPage(),
builder: (context, state) => const StatisticPage(),
),
GoRoute(
path: '/settings',
pageBuilder: (context, state) =>
_noAnimationTransition(context, state, SettingsPage()),
pageBuilder: (context, state) => _noAnimationTransition(context, state, const SettingsPage()),
),
GoRoute(
path: '/statistic',
pageBuilder: (context, state) =>
_noAnimationTransition(context, state, StatisticPage()),
// ignore: prefer_const_constructors
pageBuilder: (context, state) => _noAnimationTransition(context, state, StatisticPage()),
),
GoRoute(
path: '/home',
pageBuilder: (context, state) =>
_noAnimationTransition(context, state, HomePage()),
pageBuilder: (context, state) => _noAnimationTransition(context, state, const HomePage()),
),
GoRoute(
path: '/first',
pageBuilder: (context, state) =>
_noAnimationTransition(context, state, FirstPage()),
pageBuilder: (context, state) => _noAnimationTransition(context, state, const FirstPage()),
),
GoRoute(
path: '/color',
pageBuilder: (context, state) =>
_noAnimationTransition(context, state, ColorPage()),
pageBuilder: (context, state) => _noAnimationTransition(context, state, const ColorPage()),
),
GoRoute(
path: '/write',
@ -81,10 +75,9 @@ class MyApp extends StatelessWidget {
}
}
CustomTransitionPage<dynamic> _createSlideTransition(BuildContext context,
GoRouterState state, Widget child, SlideDirection direction) {
var beginOffset =
direction == SlideDirection.left ? Offset(1.0, 0.0) : Offset(-1.0, 0.0);
/* A Slide Transition that will may be used in future versions
CustomTransitionPage<dynamic> _createSlideTransition(BuildContext context, GoRouterState state, Widget child, SlideDirection direction) {
var beginOffset = direction == SlideDirection.left ? Offset(1.0, 0.0) : Offset(-1.0, 0.0);
return CustomTransitionPage(
key: state.pageKey,
@ -93,8 +86,7 @@ CustomTransitionPage<dynamic> _createSlideTransition(BuildContext context,
var end = Offset.zero;
var curve = Curves.easeInOut;
var tween =
Tween(begin: beginOffset, end: end).chain(CurveTween(curve: curve));
var tween = Tween(begin: beginOffset, end: end).chain(CurveTween(curve: curve));
var offsetAnimation = animation.drive(tween);
return SlideTransition(
@ -103,15 +95,9 @@ CustomTransitionPage<dynamic> _createSlideTransition(BuildContext context,
);
},
);
}
}*/
SlideDirection determineSlideDirection(
String currentRoute, String targetRoute) {
print(currentRoute);
print(targetRoute);
if (currentRoute == targetRoute) {
print("Sameroute pls fix!!");
}
SlideDirection determineSlideDirection(String currentRoute, String targetRoute) {
if (targetRoute == "/statistic") {
return SlideDirection.right;
} else if (targetRoute == "/settings") {
@ -123,13 +109,10 @@ SlideDirection determineSlideDirection(
return SlideDirection.right;
}
}
return currentRoute.compareTo(targetRoute) < 0
? SlideDirection.left
: SlideDirection.right;
return currentRoute.compareTo(targetRoute) < 0 ? SlideDirection.left : SlideDirection.right;
}
CustomTransitionPage<dynamic> _noAnimationTransition(
BuildContext context, GoRouterState state, Widget child) {
CustomTransitionPage<dynamic> _noAnimationTransition(BuildContext context, GoRouterState state, Widget child) {
return CustomTransitionPage(
key: state.pageKey,
child: child,

View File

@ -1,4 +1,4 @@
import 'dart:math' as Math;
import 'dart:math' as math;
import 'package:flutter/material.dart';
@ -6,9 +6,7 @@ class CirclePainter extends CustomPainter {
final double value;
final Color color; // New field for color
CirclePainter(this.value, this.color) {
print("CirclePainter " + value.toString());
}
CirclePainter(this.value, this.color);
@override
void paint(Canvas canvas, Size size) {
@ -16,7 +14,7 @@ class CirclePainter extends CustomPainter {
..color = color.withOpacity(0.5) // Use the passed color
..style = PaintingStyle.fill;
double radius = Math.pow(((value + 5) * 500 / 100) / 1.5, 1.14).toDouble();
double radius = math.pow(((value + 5) * 500 / 100) / 1.5, 1.14).toDouble();
canvas.drawCircle(Offset(55, size.height / 4), radius, paint);
}

View File

@ -1,44 +0,0 @@
import 'package:flutter/material.dart';
class ColorPair {
final Color textColor;
final Color backgroundColor;
final String name;
ColorPair(
{required this.name,
required this.textColor,
required this.backgroundColor});
}
List<ColorPair> colorPairs = [
ColorPair(
name: "origin",
textColor: Color(0xff446F2F),
backgroundColor: Color(0xffC9E7BB)),
ColorPair(
name: "lavender",
textColor: Color(0xff765EAB),
backgroundColor: Color(0xffD3CAE7)),
ColorPair(
name: "orange",
textColor: Color(0xffC78233),
backgroundColor: Color(0xffF0CFA9)),
ColorPair(
name: "rose",
textColor: Color(0xffB15555),
backgroundColor: Color(0xffEBD6D6)),
ColorPair(
name: "mountain",
textColor: Color(0xff1D6289),
backgroundColor: Color(0xffB4D0E0)),
ColorPair(
name: "moon",
textColor: Color(0xff7A83C7),
backgroundColor: Color(0xff393C55)),
ColorPair(
name: "forest",
textColor: Color(0xffC9E7BB),
backgroundColor: Color(0xff4C5847)),
// ...add other color pairs with names...
];

View File

@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
class ColorPair {
final Color textColor;
final Color backgroundColor;
final String name;
ColorPair({required this.name, required this.textColor, required this.backgroundColor});
}
List<ColorPair> colorPairs = [
ColorPair(name: "origin", textColor: const Color(0xff446F2F), backgroundColor: const Color(0xffC9E7BB)),
ColorPair(name: "lavender", textColor: const Color(0xff765EAB), backgroundColor: const Color(0xffD3CAE7)),
ColorPair(name: "orange", textColor: const Color(0xffC78233), backgroundColor: const Color(0xffF0CFA9)),
ColorPair(name: "rose", textColor: const Color(0xffB15555), backgroundColor: const Color(0xffEBD6D6)),
ColorPair(name: "mountain", textColor: const Color(0xff1D6289), backgroundColor: const Color(0xffB4D0E0)),
ColorPair(name: "moon", textColor: const Color(0xff7A83C7), backgroundColor: const Color(0xff393C55)),
ColorPair(name: "forest", textColor: const Color(0xffC9E7BB), backgroundColor: const Color(0xff4C5847)),
];

View File

@ -4,7 +4,7 @@ import 'dart:ui';
import 'package:intl/intl.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../definitions/ColorPairs.dart';
import '../definitions/color_pair.dart';
class PreferencesService {
static const _keyColor1 = 'color1';
@ -138,7 +138,7 @@ class PreferencesService {
while (entryDates.contains(DateFormat('yyyy-MM-dd').format(currentDate))) {
streakCount++;
currentDate = currentDate.subtract(Duration(days: 1)); // Move to the previous day
currentDate = currentDate.subtract(const Duration(days: 1)); // Move to the previous day
}
return streakCount;

View File

@ -1,20 +1,18 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:moody/utils/definitions/ColorPairs.dart';
import 'package:moody/utils/logic/PreferencesService.dart';
import 'package:moody/utils/definitions/color_pair.dart';
import 'package:moody/utils/logic/preferences_service.dart';
class CustomBottomNavigationBar extends StatefulWidget {
final int initialSelectedIndex;
CustomBottomNavigationBar({Key? key, this.initialSelectedIndex = 0})
: super(key: key);
const CustomBottomNavigationBar({Key? key, this.initialSelectedIndex = 0}) : super(key: key);
@override
_CustomBottomNavigationBarState createState() =>
_CustomBottomNavigationBarState();
State<CustomBottomNavigationBar> createState() => _CustomBottomNavigationBar();
}
class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
class _CustomBottomNavigationBar extends State<CustomBottomNavigationBar> {
late int _selectedIndex;
@override
@ -27,9 +25,7 @@ class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
setState(() {
_selectedIndex = index;
});
print('Item $index clicked');
var currentRoute =
GoRouter.of(context).routeInformationProvider.value.location;
var currentRoute = GoRouter.of(context).routeInformationProvider.value.uri.toString();
var goToRoute = "/";
switch (index) {
case 0:
@ -50,47 +46,41 @@ class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
@override
Widget build(BuildContext context) {
return FutureBuilder<ColorPair>(
future:
PreferencesService().loadColorPair(), // Async loading of the color
future: PreferencesService().loadColorPair(), // Async loading of the color
builder: (BuildContext context, AsyncSnapshot<ColorPair> snapshot) {
if (snapshot.connectionState == ConnectionState.done &&
snapshot.hasData) {
if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) {
// When data is loaded
Color backgroundColor =
snapshot.data!.backgroundColor; // Use loaded background color
Color backgroundColor = snapshot.data!.backgroundColor; // Use loaded background color
return buildNavigationBar(backgroundColor);
} else {
// While loading or if no data, show default or loading indicator
return buildNavigationBar(
Colors.white); // Default color or loading indicator
return buildNavigationBar(Colors.white); // Default color or loading indicator
}
},
);
}
@override
Widget buildNavigationBar(Color backgroundColor) {
return Container(
width: 175,
margin: EdgeInsets.only(bottom: 30),
padding: EdgeInsets.all(5),
margin: const EdgeInsets.only(bottom: 30),
padding: const EdgeInsets.all(5),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.transparent),
borderRadius:
BorderRadius.circular(35), // Adjust radius to fit your design
borderRadius: BorderRadius.circular(35), // Adjust radius to fit your design
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.5),
spreadRadius: 1,
blurRadius: 7,
offset: Offset(3, 3), // changes position of shadow
offset: const Offset(3, 3), // changes position of shadow
),
BoxShadow(
color: Colors.grey.withOpacity(0.3),
spreadRadius: 1,
blurRadius: 5,
offset: Offset(-1, -1), // changes position of shadow
offset: const Offset(-1, -1), // changes position of shadow
),
// You can add more BoxShadow layers to create more complex shadows
],
@ -100,12 +90,9 @@ class _CustomBottomNavigationBarState extends State<CustomBottomNavigationBar> {
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
_buildNavItem(Image.asset('assets/icons/icon-analyze.png'), 0,
backgroundColor),
_buildNavItem(
Image.asset('assets/icons/icon-logo.png'), 1, backgroundColor),
_buildNavItem(Image.asset('assets/icons/icon-settings.png'), 2,
backgroundColor),
_buildNavItem(Image.asset('assets/icons/icon-analyze.png'), 0, backgroundColor),
_buildNavItem(Image.asset('assets/icons/icon-logo.png'), 1, backgroundColor),
_buildNavItem(Image.asset('assets/icons/icon-settings.png'), 2, backgroundColor),
],
),
),

View File

@ -8,7 +8,7 @@ class MoodTextAreaWidget extends StatefulWidget {
final bool forceBlinkingCursor;
final TextEditingController? controller;
MoodTextAreaWidget({
const MoodTextAreaWidget({
Key? key,
this.initialText = '',
this.isDisabled = false,
@ -19,10 +19,10 @@ class MoodTextAreaWidget extends StatefulWidget {
}) : super(key: key);
@override
_MoodTextAreaWidgetState createState() => _MoodTextAreaWidgetState();
State<MoodTextAreaWidget> createState() => _MoodTextAreaWidget();
}
class _MoodTextAreaWidgetState extends State<MoodTextAreaWidget> {
class _MoodTextAreaWidget extends State<MoodTextAreaWidget> {
late TextEditingController _controller;
final FocusNode _focusNode = FocusNode();
late bool _isEditingEnabled;
@ -70,7 +70,6 @@ class _MoodTextAreaWidgetState extends State<MoodTextAreaWidget> {
@override
Widget build(BuildContext context) {
print("initialtext######${widget.initialText}");
if (!_isEditingEnabled) _controller.text = widget.initialText;
return TextField(
controller: _controller,

View File

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:moody/utils/logic/QuestionGenerator.dart';
import 'package:moody/utils/logic/question_generator.dart';
class QuestionSliderWidget extends StatefulWidget {
final DateTime date;
@ -11,7 +11,7 @@ class QuestionSliderWidget extends StatefulWidget {
final ValueChanged<double> onSliderPositionChanged;
final Color sliderColor; // parameter for the color
QuestionSliderWidget({
const QuestionSliderWidget({
Key? key,
required this.date,
required this.questionText,
@ -23,10 +23,10 @@ class QuestionSliderWidget extends StatefulWidget {
}) : super(key: key);
@override
_QuestionSliderWidgetState createState() => _QuestionSliderWidgetState();
State<QuestionSliderWidget> createState() => _QuestionSliderWidget();
}
class _QuestionSliderWidgetState extends State<QuestionSliderWidget> {
class _QuestionSliderWidget extends State<QuestionSliderWidget> {
bool _showDragText = true;
SliderChangeData? _sliderData;
QuestionGenerator generator = QuestionGenerator();
@ -38,7 +38,6 @@ class _QuestionSliderWidgetState extends State<QuestionSliderWidget> {
super.initState();
//_sliderData?.value = widget.initialSliderValue;
_sliderData = SliderChangeData(widget.initialSliderValue, 0);
print("innit");
if (!widget.isSliderEnabled) {
_showDragText = false;
}
@ -51,13 +50,11 @@ class _QuestionSliderWidgetState extends State<QuestionSliderWidget> {
} else {
if (!initValSet && changedInitValue != widget.initialSliderValue) {
initValSet = true;
print("here");
changedInitValue != widget.initialSliderValue;
_sliderData?.value = widget.initialSliderValue;
}
}
print(_sliderData?.value);
return Padding(
padding: const EdgeInsets.fromLTRB(0, 150, 20, 0),
child: Column(
@ -72,12 +69,12 @@ class _QuestionSliderWidgetState extends State<QuestionSliderWidget> {
children: [
Text(
DateFormat('dd MM yyyy').format(widget.date),
style: TextStyle(fontSize: 18),
style: const TextStyle(fontSize: 18),
),
SizedBox(height: 10),
const SizedBox(height: 10),
Text(
widget.questionText == "" ? generator.getQuestionByDate(widget.date) : widget.questionText,
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
style: const TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
),
],
),
@ -91,7 +88,7 @@ class _QuestionSliderWidgetState extends State<QuestionSliderWidget> {
data: SliderTheme.of(context).copyWith(
disabledThumbColor: Colors.transparent,
activeTrackColor: widget.sliderColor,
trackShape: RectangularSliderTrackShape(),
trackShape: const RectangularSliderTrackShape(),
inactiveTickMarkColor: Colors.transparent,
inactiveTrackColor: Colors.transparent,
valueIndicatorColor: Colors.transparent,

View File

@ -4,17 +4,17 @@ class WhyWidget extends StatefulWidget {
final TextEditingController controller;
final bool prependWhy;
WhyWidget({
const WhyWidget({
Key? key,
required this.controller,
this.prependWhy = true,
}) : super(key: key);
@override
_WhyWidgetState createState() => _WhyWidgetState();
State<WhyWidget> createState() => _WhyWidget();
}
class _WhyWidgetState extends State<WhyWidget> {
class _WhyWidget extends State<WhyWidget> {
//final TextEditingController _controller = TextEditingController(text: "warum? ");
final FocusNode _focusNode = FocusNode();

View File

@ -1,19 +1,21 @@
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../utils/definitions/ColorPairs.dart';
import '../../utils/definitions/color_pair.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/widgets/BottomNavigationWidget.dart';
import '../../utils/logic/preferences_service.dart';
import '../../utils/widgets/custom_bottom_navigation_bar.dart';
// ...Include PreferencesService and other necessary imports
class ColorPage extends StatefulWidget {
const ColorPage({super.key});
@override
_ColorPageState createState() => _ColorPageState();
State<ColorPage> createState() => _ColorPage();
}
class _ColorPageState extends State<ColorPage> {
class _ColorPage extends State<ColorPage> {
int? selectedColorIndex; // Index of the selected color
@override
@ -25,20 +27,13 @@ class _ColorPageState extends State<ColorPage> {
// Load selected color from preferences
void _loadSelectedColor() async {
ColorPair? savedColorPair = await PreferencesService().loadColorPair();
if (savedColorPair != null) {
// Find the index of the saved color in the colorPairs list
int index = colorPairs.indexWhere(
(pair) => pair.backgroundColor.value == savedColorPair.backgroundColor.value && pair.textColor.value == savedColorPair.textColor.value,
);
if (index != -1) {
setState(() {
selectedColorIndex = index;
});
}
} else {
// If no color is selected, default to the first one
// Find the index of the saved color in the colorPairs list
int index = colorPairs.indexWhere(
(pair) => pair.backgroundColor.value == savedColorPair.backgroundColor.value && pair.textColor.value == savedColorPair.textColor.value,
);
if (index != -1) {
setState(() {
selectedColorIndex = 0;
selectedColorIndex = index;
});
}
}
@ -83,7 +78,7 @@ class _ColorPageState extends State<ColorPage> {
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: CustomBottomNavigationBar(initialSelectedIndex: 2),
floatingActionButton: const CustomBottomNavigationBar(initialSelectedIndex: 2),
);
}
@ -101,7 +96,7 @@ class _ColorPageState extends State<ColorPage> {
child: Container(
width: bubbleWidth,
height: bubbleWidth,
padding: EdgeInsets.all(10), // Padding for inner circle effect
padding: const EdgeInsets.all(10), // Padding for inner circle effect
decoration: BoxDecoration(
color: colorPairs[index].backgroundColor,
shape: BoxShape.circle,

View File

@ -2,24 +2,24 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart';
import '../../utils/CirclePainter.dart';
import '../../utils/definitions/ColorPairs.dart';
import '../../utils/circle_painter.dart';
import '../../utils/definitions/color_pair.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/widgets/BottomNavigationWidget.dart';
import '../../utils/widgets/MoodTextArea.dart';
import '../../utils/widgets/QuestionSliderWidget.dart';
import '../../utils/logic/preferences_service.dart';
import '../../utils/widgets/custom_bottom_navigation_bar.dart';
import '../../utils/widgets/mood_text_area_widget.dart';
import '../../utils/widgets/question_slider_widget.dart';
class EntryPage extends StatefulWidget {
final DateTime date;
EntryPage({Key? key, required this.date}) : super(key: key);
const EntryPage({Key? key, required this.date}) : super(key: key);
@override
_EntryPageState createState() => _EntryPageState();
State<EntryPage> createState() => _EntryPage();
}
class _EntryPageState extends State<EntryPage> {
class _EntryPage extends State<EntryPage> {
SliderChangeData sliderData = SliderChangeData(0, 0);
String _moodText = "";
final PreferencesService _prefsService = PreferencesService();
@ -59,7 +59,7 @@ class _EntryPageState extends State<EntryPage> {
});
}
// _textController.text = _moodText;
_textController.text = currentEntry != null ? currentEntry!.texts.join(" ") : _moodText;
_textController.text = (currentEntry != null ? currentEntry.texts.join(" ") : _moodText);
}
void _toggleEdit() {
@ -72,7 +72,7 @@ class _EntryPageState extends State<EntryPage> {
}
void _saveEntry() async {
print("saveEntry....");
//print("saveEntry...."); Todo for future versions
}
@override
@ -114,11 +114,11 @@ class _EntryPageState extends State<EntryPage> {
child: Column(
children: [
Text(
sliderData.value.toString() + "%",
style: TextStyle(color: Colors.black),
"${sliderData.value}%",
style: const TextStyle(color: Colors.black),
),
Text(DateFormat('dd MM yyyy').format(widget.date).toString(),
style: TextStyle(color: Colors.black, fontSize: 18, fontWeight: FontWeight.bold)),
style: const TextStyle(color: Colors.black, fontSize: 18, fontWeight: FontWeight.bold)),
],
),
),
@ -138,7 +138,7 @@ class _EntryPageState extends State<EntryPage> {
style: TextStyle(fontSize: 18, color: textColor), // Use appropriate styling
),
),
SizedBox(height: 400), // Space for floating bottom navigation bar
const SizedBox(height: 400), // Space for floating bottom navigation bar
],
),
],
@ -146,7 +146,7 @@ class _EntryPageState extends State<EntryPage> {
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: CustomBottomNavigationBar(initialSelectedIndex: 0),
floatingActionButton: const CustomBottomNavigationBar(initialSelectedIndex: 0),
);
}
}

View File

@ -1,11 +1,12 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:moody/utils/widgets/QuestionSliderWidget.dart';
import 'package:moody/utils/widgets/question_slider_widget.dart';
import '../../utils/CirclePainter.dart';
import '../../utils/definitions/ColorPairs.dart';
import '../../utils/circle_painter.dart';
import '../../utils/definitions/color_pair.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/logic/preferences_service.dart';
class FirstPage extends StatefulWidget {
final bool showSkipText; // Add this line
@ -14,10 +15,10 @@ class FirstPage extends StatefulWidget {
: super(key: key);
@override
_FirstPageState createState() => _FirstPageState();
State<FirstPage> createState() => _FirstPage();
}
class _FirstPageState extends State<FirstPage> {
class _FirstPage extends State<FirstPage> {
SliderChangeData sliderData = SliderChangeData(0, 50);
bool _sliderChanged = false;
final PreferencesService _prefsService = PreferencesService();
@ -33,9 +34,9 @@ class _FirstPageState extends State<FirstPage> {
}
void _checkExistingEntry() async {
WidgetsBinding.instance?.addPostFrameCallback((_) async {
WidgetsBinding.instance.addPostFrameCallback((_) async {
DiaryEntry? entry = await _prefsService.getDiaryEntryByCurrentDate();
if (entry != null) {
if (entry != null && mounted) {
context.go('/home');
}
});
@ -60,7 +61,9 @@ class _FirstPageState extends State<FirstPage> {
await _prefsService.saveDiaryEntry(entry);
} catch (e) {
print("Error saving entry: $e"); // Consider showing an error dialog or toast instead
if (kDebugMode) {
print("Error saving entry: $e");
} // Consider showing an error dialog or toast instead
}
}
@ -91,7 +94,7 @@ class _FirstPageState extends State<FirstPage> {
children: [
QuestionSliderWidget(
onSliderPositionChanged: (value) {
print("sliderposchanged");
//print("slider Moved");
},
sliderColor: textColor,
date: DateTime.now(),
@ -129,7 +132,6 @@ class _FirstPageState extends State<FirstPage> {
right: 20,
child: TextButton(
onPressed: () {
print(_sliderChanged);
if (_sliderChanged) {
_saveEntry();
context.go('/home', extra: sliderData.value);
@ -141,7 +143,7 @@ class _FirstPageState extends State<FirstPage> {
? Text("save.", style: TextStyle(fontSize: 18, color: textColor))
: widget.showSkipText // Use the showSkipText parameter
? const Text("skip", style: TextStyle(fontSize: 18, color: Colors.grey))
: SizedBox.shrink(),
: const SizedBox.shrink(),
),
),
],

View File

@ -1,13 +1,15 @@
import 'package:flutter/material.dart';
import '../../../utils/CirclePainter.dart';
import '../../../utils/circle_painter.dart';
class DragWidget extends StatefulWidget {
const DragWidget({super.key});
@override
_DragWidgetState createState() => _DragWidgetState();
State<DragWidget> createState() => _DragWidget();
}
class _DragWidgetState extends State<DragWidget> {
class _DragWidget extends State<DragWidget> {
double _sliderValue = 0.0;
@override
@ -28,7 +30,7 @@ class _DragWidgetState extends State<DragWidget> {
padding: const EdgeInsets.only(top: 20.0, left: 20.0),
child: Text(
"${DateTime.now().toLocal()}",
style: TextStyle(fontSize: 18),
style: const TextStyle(fontSize: 18),
),
),
const Padding(
@ -38,7 +40,7 @@ class _DragWidgetState extends State<DragWidget> {
style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold),
),
),
SizedBox(height: 32), // 2 line padding
const SizedBox(height: 32), // 2 line padding
SliderTheme(
data: SliderTheme.of(context).copyWith(
trackShape: CustomTrackShape(),
@ -57,10 +59,10 @@ class _DragWidgetState extends State<DragWidget> {
),
if (_sliderValue > 0)
Padding(
padding: EdgeInsets.only(left: 20.0),
padding: const EdgeInsets.only(left: 20.0),
child: Text(
"${_sliderValue.toStringAsFixed(0)}%",
style: TextStyle(fontSize: 18),
style: const TextStyle(fontSize: 18),
),
),
],
@ -82,8 +84,7 @@ class CustomTrackShape extends RoundedRectSliderTrackShape {
}) {
final double trackHeight = sliderTheme.trackHeight ?? 4;
final double trackLeft = offset.dx;
final double trackTop =
offset.dy + (parentBox.size.height - trackHeight) / 2;
final double trackTop = offset.dy + (parentBox.size.height - trackHeight) / 2;
final double trackWidth = parentBox.size.width;
return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight);
}

View File

@ -1,13 +1,14 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:moody/utils/definitions/style_guide.dart';
import 'package:moody/views/first_page/first_page.dart';
import '../../utils/CirclePainter.dart';
import '../../utils/definitions/ColorPairs.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/widgets/BottomNavigationWidget.dart';
import '../../utils/widgets/QuestionSliderWidget.dart';
import '../../utils/widgets/WhyWidget.dart';
import '../../utils/circle_painter.dart';
import '../../utils/definitions/color_pair.dart';
import '../../utils/logic/preferences_service.dart';
import '../../utils/widgets/custom_bottom_navigation_bar.dart';
import '../../utils/widgets/question_slider_widget.dart';
import '../../utils/widgets/why_widget.dart';
class HomePage extends StatefulWidget {
const HomePage({super.key});
@ -18,7 +19,6 @@ class HomePage extends StatefulWidget {
class _HomePageState extends State<HomePage> {
SliderChangeData sliderData = SliderChangeData(0, 0);
String _moodText = "";
bool _isTextAreaEditable = false;
final PreferencesService _prefsService = PreferencesService();
Color backgroundColor = Colors.lightGreenAccent;
@ -45,15 +45,11 @@ class _HomePageState extends State<HomePage> {
void _loadCurrentDiaryEntry() async {
DiaryEntry? currentEntry = await _prefsService.getDiaryEntryByCurrentDate();
if (currentEntry != null) {
print(currentEntry.texts.join(" "));
setState(() {
sliderData.value = currentEntry.percentValue.toDouble();
print(currentEntry.percentValue);
_moodText = currentEntry.texts.join(" "); // Assuming you want to concatenate all texts
_textController.text = currentEntry.texts.join(" ");
});
setState(() {});
print(sliderData.value);
} else {
setState(() {
noData = true;
@ -73,7 +69,6 @@ class _HomePageState extends State<HomePage> {
void _saveEntry() async {
try {
List<String> texts = _textController.text.isEmpty ? [] : [_textController.text];
print("DerText:${_textController.text}");
DiaryEntry entry = DiaryEntry(
date: DateTime.now(),
percentValue: sliderData.value.toInt(),
@ -82,15 +77,17 @@ class _HomePageState extends State<HomePage> {
await _prefsService.saveDiaryEntry(entry);
} catch (e) {
print("Error saving entry: $e");
if (kDebugMode) {
print("Error saving entry: $e");
}
}
}
@override
Widget build(BuildContext context) {
return noData
? Scaffold(
body: const FirstPage(showSkipText: false),
? const Scaffold(
body: FirstPage(showSkipText: false),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: CustomBottomNavigationBar(initialSelectedIndex: 1),
)
@ -113,7 +110,7 @@ class _HomePageState extends State<HomePage> {
children: [
QuestionSliderWidget(
onSliderPositionChanged: (value) {
print("sliderposchanged");
//print("Slider moved");
},
sliderColor: textColor,
date: DateTime.now(),
@ -169,7 +166,7 @@ class _HomePageState extends State<HomePage> {
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: CustomBottomNavigationBar(initialSelectedIndex: 1),
floatingActionButton: const CustomBottomNavigationBar(initialSelectedIndex: 1),
);
}
}

View File

@ -1,100 +0,0 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CalendarPage(),
);
}
}
class CalendarPage extends StatefulWidget {
@override
_CalendarPageState createState() => _CalendarPageState();
}
class _CalendarPageState extends State<CalendarPage> {
DateTime currentDate = DateTime.now();
late List<DateTime> dateList;
@override
void initState() {
super.initState();
dateList = _generateDateList(currentDate);
}
List<DateTime> _generateDateList(DateTime date) {
List<DateTime> list = [];
DateTime firstOfMonth = DateTime(date.year, date.month, 1);
int dayOfWeek = firstOfMonth.weekday;
// Adjust to Monday start
int startDay = dayOfWeek - 1;
if (startDay < 0) startDay = 6;
// Dates from previous month
for (int i = startDay; i > 0; i--) {
list.add(firstOfMonth.subtract(Duration(days: i)));
}
// Dates of current month
int daysInMonth = DateUtils.getDaysInMonth(date.year, date.month);
for (int i = 0; i < daysInMonth; i++) {
list.add(DateTime(date.year, date.month, i + 1));
}
return list;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Calendar"),
),
body: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7,
),
itemBuilder: (context, index) {
double radius =
(Random().nextInt(50).toDouble() + 20) / 2; // Reduced by 50%
DateTime date = dateList[index];
return Center(
child: Container(
width: radius * 2,
height: radius * 2,
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(color: Colors.black, width: 2),
),
child: Center(
child: Container(
width: radius,
height: radius,
decoration: BoxDecoration(
shape: BoxShape.circle,
color: Colors.lightGreen,
),
child: Center(
child: Text(
DateFormat("d").format(date),
style: TextStyle(color: Colors.black),
),
),
),
),
),
);
},
itemCount: dateList.length,
),
);
}
}

View File

@ -2,18 +2,20 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/widgets/BottomNavigationWidget.dart';
import 'widgets/CustomDivider.dart';
import 'widgets/SetPinPopup.dart';
import 'widgets/TextSwitchContainer.dart';
import '../../utils/logic/preferences_service.dart';
import '../../utils/widgets/custom_bottom_navigation_bar.dart';
import 'widgets/custom_divider_widget.dart';
import 'widgets/set_pin_popup_widget.dart';
import 'widgets/text_switch_container_widget.dart';
class SettingsPage extends StatefulWidget {
const SettingsPage({super.key});
@override
_SettingsPageState createState() => _SettingsPageState();
State<SettingsPage> createState() => _SettingsPage();
}
class _SettingsPageState extends State<SettingsPage> {
class _SettingsPage extends State<SettingsPage> {
bool isPinEnabled = false; // Default to false
@override
@ -32,7 +34,7 @@ class _SettingsPageState extends State<SettingsPage> {
return Scaffold(
backgroundColor: AppStyle.backgroundColor,
body: Container(
padding: EdgeInsets.only(bottom: 0),
padding: const EdgeInsets.only(bottom: 0),
margin: const EdgeInsets.fromLTRB(30, 30, 30, 0),
child: SingleChildScrollView(
child: Column(
@ -43,20 +45,20 @@ class _SettingsPageState extends State<SettingsPage> {
// Settings section
Container(
margin: EdgeInsets.only(bottom: 10),
margin: const EdgeInsets.only(bottom: 10),
alignment: Alignment.topLeft,
child: Text('settings', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 24)),
child: const Text('settings', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 24)),
),
TextSwitchContainer(
leftText: "change color",
onTap: () => context.go("/color"),
),
CustomDivider(),
const CustomDivider(),
FutureBuilder<bool>(
future: PreferencesService().isPinEnabled(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator(); // or some other placeholder
return const CircularProgressIndicator(); // or some other placeholder
}
bool pinEnabled = snapshot.data ?? false; // Default to false if null
return TextSwitchContainer(
@ -75,63 +77,63 @@ class _SettingsPageState extends State<SettingsPage> {
);
},
),
CustomDivider(),
const CustomDivider(),
TextSwitchContainer(
leftText: "your data",
onTap: () => print('Container tapped'),
onTap: () => {},
),
// Community section
Padding(
padding: const EdgeInsets.fromLTRB(0, 50, 0, 10),
child: Container(
alignment: Alignment.topLeft,
margin: EdgeInsets.only(bottom: 10),
child: Text('community', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 24)),
margin: const EdgeInsets.only(bottom: 10),
child: const Text('community', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 24)),
),
),
TextSwitchContainer(
leftText: "join our discord",
rightText: "fulfilled",
onTap: () => print('Container tapped'),
onTap: () => {},
),
CustomDivider(),
const CustomDivider(),
TextSwitchContainer(
leftText: "our instagram",
rightText: "@get.fulfilled",
onTap: () => print('Container tapped'),
onTap: () => {},
),
CustomDivider(),
const CustomDivider(),
TextSwitchContainer(
leftText: "share fulfilled with your loved ones",
onTap: () => print('Container tapped'),
onTap: () => {},
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 50, 0, 10),
child: Container(
alignment: Alignment.topLeft,
child: Text('humans behind fulfilled', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 24)),
child: const Text('humans behind fulfilled', style: TextStyle(fontWeight: FontWeight.w500, fontSize: 24)),
),
),
TextSwitchContainer(
leftText: "about us",
onTap: () => print('Container tapped'),
onTap: () => {},
),
CustomDivider(),
const CustomDivider(),
TextSwitchContainer(
leftText: "support us",
onTap: () => print('Container tapped'),
onTap: () => {},
),
CustomDivider(),
const CustomDivider(),
TextSwitchContainer(
leftText: "give feedback",
onTap: () => print('Container tapped'),
onTap: () => {},
),
//
ListTile(
title: Text('imprint & privacy policy', style: TextStyle(color: Colors.grey, fontSize: 15)),
title: const Text('imprint & privacy policy', style: TextStyle(color: Colors.grey, fontSize: 15)),
onTap: () => {}, // Implement your logic
),
SizedBox(
const SizedBox(
height: 150,
)
],
@ -139,7 +141,7 @@ class _SettingsPageState extends State<SettingsPage> {
),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: CustomBottomNavigationBar(initialSelectedIndex: 2),
floatingActionButton: const CustomBottomNavigationBar(initialSelectedIndex: 2),
);
}
@ -147,7 +149,7 @@ class _SettingsPageState extends State<SettingsPage> {
showDialog(
context: context,
builder: (BuildContext context) {
return SetPinPopup();
return const SetPinPopup();
},
);
}

View File

@ -3,20 +3,21 @@ import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '../../../utils/logic/PreferencesService.dart'; // For HapticFeedback
import '../../../utils/logic/preferences_service.dart'; // For HapticFeedback
// ...Include PreferencesService and other necessary imports
class SetPinPopup extends StatefulWidget {
const SetPinPopup({super.key});
@override
_SetPinPopupState createState() => _SetPinPopupState();
State<SetPinPopup> createState() => _SetPinPopup();
}
class _SetPinPopupState extends State<SetPinPopup> {
class _SetPinPopup extends State<SetPinPopup> {
String _pin = '';
String _confirmedPin = '';
bool _isSettingPin =
true; // True if setting the PIN, false if confirming the PIN
bool _isSettingPin = true; // True if setting the PIN, false if confirming the PIN
static const int pinLength = 4;
@ -55,12 +56,11 @@ class _SetPinPopupState extends State<SetPinPopup> {
Widget _buildNumberButton(int number) {
return GestureDetector(
onTap: () => _onNumberTap(number),
onTapDown: (_) =>
HapticFeedback.lightImpact(), // Cool haptic feedback on tap
onTapDown: (_) => HapticFeedback.lightImpact(), // Cool haptic feedback on tap
child: Container(
width: 70,
height: 70,
margin: EdgeInsets.all(10),
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.black),
@ -69,7 +69,7 @@ class _SetPinPopupState extends State<SetPinPopup> {
child: Center(
child: Text(
number.toString(),
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
),
),
@ -85,8 +85,7 @@ class _SetPinPopupState extends State<SetPinPopup> {
}
});
if ((_isSettingPin && _pin.length == pinLength) ||
(!_isSettingPin && _confirmedPin.length == pinLength)) {
if ((_isSettingPin && _pin.length == pinLength) || (!_isSettingPin && _confirmedPin.length == pinLength)) {
if (!_isSettingPin && _pin == _confirmedPin) {
// Call setPin and enablePin methods, assuming they are async
PreferencesService().setPin(int.parse(_pin));
@ -117,35 +116,28 @@ class _SetPinPopupState extends State<SetPinPopup> {
child: Container(
height: 600,
width: 400,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(50))),
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(_isSettingPin ? 'Set a PIN' : 'Repeat PIN',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
SizedBox(height: 20),
Text(_isSettingPin ? 'Set a PIN' : 'Repeat PIN', style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
const SizedBox(height: 20),
Row(
mainAxisSize: MainAxisSize.min,
children: List.generate(pinLength, (index) {
return Container(
margin: EdgeInsets.all(4),
margin: const EdgeInsets.all(4),
width: 15,
height: 15,
decoration: BoxDecoration(
color:
(_isSettingPin ? _pin.length : _confirmedPin.length) >
index
? Colors.black
: Colors.transparent,
color: (_isSettingPin ? _pin.length : _confirmedPin.length) > index ? Colors.black : Colors.transparent,
border: Border.all(color: Colors.grey),
borderRadius: BorderRadius.circular(15),
),
);
}),
),
SizedBox(height: 20),
const SizedBox(height: 20),
..._buildNumberPad(),
],
),

View File

@ -1,3 +1,4 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:url_launcher/url_launcher.dart';
@ -5,8 +6,7 @@ class SettingsSection extends StatelessWidget {
final String title;
final List<SettingsItem> items;
SettingsSection({Key? key, required this.title, required this.items})
: super(key: key);
const SettingsSection({Key? key, required this.title, required this.items}) : super(key: key);
@override
Widget build(BuildContext context) {
@ -14,11 +14,10 @@ class SettingsSection extends StatelessWidget {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.all(8.0),
padding: const EdgeInsets.all(8.0),
child: Text(
title,
style: TextStyle(
fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black),
style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold, color: Colors.black),
),
),
...items.map((item) => _buildItem(item)).toList(),
@ -36,9 +35,9 @@ class SettingsSection extends StatelessWidget {
? GestureDetector(
child: Text(
item.trailingText ?? "",
style: TextStyle(color: Colors.grey),
style: const TextStyle(color: Colors.grey),
),
onTap: () => _launchURL(item.url!),
onTap: () => _launchURL(Uri.parse(item.url!)),
)
: null,
onTap: item.onTap,
@ -47,11 +46,13 @@ class SettingsSection extends StatelessWidget {
);
}
void _launchURL(String url) async {
if (await canLaunch(url)) {
await launch(url);
void _launchURL(Uri url) async {
if (await canLaunchUrl(url)) {
await launchUrl(url);
} else {
print("Could not launch $url");
if (kDebugMode) {
print("Could not launch $url");
}
}
}
}

View File

@ -1,15 +1,19 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import '../../../utils/definitions/color_pair.dart';
import '../../../utils/logic/preferences_service.dart';
class TextSwitchContainer extends StatefulWidget {
final String leftText;
final String? rightText;
final bool hasSwitch;
final Function onTap;
final Function(bool)? onSwitchToggle;
final bool switchDefaultValue; // Added parameter for the default switch value
final bool switchDefaultValue; // Parameter for the default switch value
TextSwitchContainer({
const TextSwitchContainer({
super.key,
required this.leftText,
this.rightText,
this.hasSwitch = false,
@ -19,33 +23,46 @@ class TextSwitchContainer extends StatefulWidget {
});
@override
_TextSwitchContainerState createState() =>
_TextSwitchContainerState(switchValue: this.switchDefaultValue);
State<TextSwitchContainer> createState() => _TextSwitchContainer();
}
class _TextSwitchContainerState extends State<TextSwitchContainer> {
bool switchValue; // No longer explicitly initialized here
class _TextSwitchContainer extends State<TextSwitchContainer> {
late bool switchValue;
Color backgroundColor = Colors.white; // Default value
Color textColor = Colors.black; // Default value
_TextSwitchContainerState(
{required this.switchValue}); // Constructor takes the initial switch value
@override
void initState() {
super.initState();
switchValue = widget.switchDefaultValue; // Initialize switchValue here
_loadColor();
}
void _loadColor() async {
ColorPair colorPair = await PreferencesService().loadColorPair();
setState(() {
backgroundColor = colorPair.backgroundColor;
textColor = colorPair.textColor;
});
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => widget.onTap(),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 0, vertical: 20),
padding: const EdgeInsets.symmetric(horizontal: 0, vertical: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
widget.leftText,
style: TextStyle(fontSize: 18),
style: const TextStyle(fontSize: 18),
),
if (widget.hasSwitch)
CupertinoSwitch(
trackColor: Colors.white,
thumbColor: switchValue ? Colors.lightGreen : Colors.grey,
thumbColor: switchValue ? backgroundColor : Colors.grey,
value: switchValue,
onChanged: (newValue) {
setState(() {
@ -60,7 +77,7 @@ class _TextSwitchContainerState extends State<TextSwitchContainer> {
else if (widget.rightText != null)
Text(
widget.rightText!,
style: TextStyle(fontSize: 16, color: Colors.grey),
style: const TextStyle(fontSize: 16, color: Colors.grey),
),
],
),

View File

@ -1,14 +1,17 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:go_router/go_router.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart'; // For Haptic Feedback
import '../../utils/logic/preferences_service.dart'; // For Haptic Feedback
class StartPage extends StatelessWidget {
const StartPage({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
return const MaterialApp(
title: 'PIN Input',
home: PinInputScreen(),
);
@ -16,11 +19,13 @@ class StartPage extends StatelessWidget {
}
class PinInputScreen extends StatefulWidget {
const PinInputScreen({super.key});
@override
_PinInputScreenState createState() => _PinInputScreenState();
State<PinInputScreen> createState() => _PinInputScreen();
}
class _PinInputScreenState extends State<PinInputScreen> {
class _PinInputScreen extends State<PinInputScreen> {
String _pin = '';
static const int pinLength = 4;
@ -31,11 +36,13 @@ class _PinInputScreenState extends State<PinInputScreen> {
}
Future<void> _checkPinStatus() async {
bool pinEnabled = await PreferencesService().isPinEnabled(); // Adjust with actual implementation
bool pinEnabled = await PreferencesService().isPinEnabled();
if (!pinEnabled) {
// If no PIN is enabled, navigate to the "/first" route.
// Navigator context will be available after the widget build.
Future.microtask(() => context.go("/first"));
Future.microtask(() {
if (mounted) {
context.go("/first");
}
});
}
}
@ -61,12 +68,15 @@ class _PinInputScreenState extends State<PinInputScreen> {
Future<void> _validatePin() async {
bool correct = await checkPin(int.parse(_pin));
if (correct) {
print("Right");
context.go("/first");
if (mounted) {
context.go("/first");
}
// Perform any actions you need on successful pin entry
} else {
// Handle wrong pin entry, e.g., reset pin, show error, etc.
print("Wrong PIN");
if (kDebugMode) {
print("Wrong PIN");
}
}
// Resetting the PIN for this example, you might want to do this differently
@ -91,17 +101,17 @@ class _PinInputScreenState extends State<PinInputScreen> {
child: Container(
height: 600,
width: 400,
decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
decoration: const BoxDecoration(color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(50))),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('Welcome Back!', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
SizedBox(height: 20),
const Text('Welcome Back!', style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold)),
const SizedBox(height: 20),
Row(
mainAxisSize: MainAxisSize.min,
children: List.generate(pinLength, (index) {
return Container(
margin: EdgeInsets.all(4),
margin: const EdgeInsets.all(4),
width: 15,
height: 15,
decoration: BoxDecoration(
@ -112,7 +122,7 @@ class _PinInputScreenState extends State<PinInputScreen> {
);
}),
),
SizedBox(height: 20),
const SizedBox(height: 20),
..._buildNumberPad(),
],
),
@ -160,7 +170,7 @@ class _PinInputScreenState extends State<PinInputScreen> {
child: Container(
width: 70,
height: 70,
margin: EdgeInsets.all(10),
margin: const EdgeInsets.all(10),
decoration: BoxDecoration(
border: Border.all(color: Colors.black),
borderRadius: BorderRadius.circular(35),
@ -168,7 +178,7 @@ class _PinInputScreenState extends State<PinInputScreen> {
child: Center(
child: Text(
number.toString(),
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
),
),

View File

@ -2,17 +2,19 @@ import 'package:flutter/material.dart';
import 'package:moody/views/statistic/widget/calendar_widget.dart';
import 'package:moody/views/statistic/widget/streak_widget.dart';
import '../../utils/definitions/ColorPairs.dart';
import '../../utils/definitions/color_pair.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/widgets/BottomNavigationWidget.dart';
import '../../utils/logic/preferences_service.dart';
import '../../utils/widgets/custom_bottom_navigation_bar.dart';
class StatisticPage extends StatefulWidget {
const StatisticPage({super.key});
@override
_StatisticPageState createState() => _StatisticPageState();
State<StatisticPage> createState() => _StatisticPage();
}
class _StatisticPageState extends State<StatisticPage> {
class _StatisticPage extends State<StatisticPage> {
Color backgroundColor = Colors.white; // Default fallback color
Color textColor = Colors.black; // Default fallback color
final ScrollController _scrollController = ScrollController();
@ -47,7 +49,7 @@ class _StatisticPageState extends State<StatisticPage> {
child: Scaffold(
backgroundColor: AppStyle.backgroundColor,
body: Column(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
SizedBox(
const SizedBox(
height: 50,
),
Column(
@ -61,11 +63,11 @@ class _StatisticPageState extends State<StatisticPage> {
color: backgroundColor,
);
} else {
return CircularProgressIndicator(); // or some placeholder
return const CircularProgressIndicator(); // or some placeholder
}
},
),
Text(
const Text(
"browse your memories!",
style: TextStyle(fontSize: 24),
),
@ -76,11 +78,11 @@ class _StatisticPageState extends State<StatisticPage> {
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(height: 50),
Container(child: CalendarWidget(currentDate: DateTime(DateTime.now().year, DateTime.now().month - 2, 1))),
Container(child: CalendarWidget(currentDate: DateTime(DateTime.now().year, DateTime.now().month - 1, 1))),
Container(child: CalendarWidget(currentDate: DateTime.now())),
SizedBox(
const SizedBox(height: 50),
CalendarWidget(currentDate: DateTime(DateTime.now().year, DateTime.now().month - 2, 1)),
CalendarWidget(currentDate: DateTime(DateTime.now().year, DateTime.now().month - 1, 1)),
CalendarWidget(currentDate: DateTime.now()),
const SizedBox(
height: 50,
)
],
@ -89,7 +91,7 @@ class _StatisticPageState extends State<StatisticPage> {
),
]),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
floatingActionButton: CustomBottomNavigationBar(initialSelectedIndex: 0),
floatingActionButton: const CustomBottomNavigationBar(initialSelectedIndex: 0),
),
),
);

View File

@ -2,19 +2,19 @@ import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:intl/intl.dart';
import '../../../utils/definitions/ColorPairs.dart';
import '../../../utils/logic/PreferencesService.dart'; // Correct the path as necessary
import '../../../utils/definitions/color_pair.dart';
import '../../../utils/logic/preferences_service.dart'; // Correct the path as necessary
class CalendarWidget extends StatefulWidget {
final DateTime currentDate;
CalendarWidget({Key? key, required this.currentDate}) : super(key: key);
const CalendarWidget({Key? key, required this.currentDate}) : super(key: key);
@override
_CalendarWidgetState createState() => _CalendarWidgetState();
State<CalendarWidget> createState() => _CalendarWidget();
}
class _CalendarWidgetState extends State<CalendarWidget> {
class _CalendarWidget extends State<CalendarWidget> {
List<DateTime> dateList = []; // Initialized immediately as an empty list
Map<String, DiaryEntry?> diaryEntries = {}; // Holds diary entries by date
late ColorPair currentColorPair; // Holds the current color pair
@ -28,7 +28,7 @@ class _CalendarWidgetState extends State<CalendarWidget> {
void _loadColorPairAndDiaryData() async {
// Load color pair
currentColorPair = await PreferencesService().loadColorPair() ?? colorPairs[0];
currentColorPair = await PreferencesService().loadColorPair();
// Generate date list
//dateList = _generateDateList(widget.currentDate);
@ -67,7 +67,7 @@ class _CalendarWidgetState extends State<CalendarWidget> {
// Adjust list to end with a complete week
while (list.length % 7 != 0) {
list.add(list.last.add(Duration(days: 1)));
list.add(list.last.add(const Duration(days: 1)));
}
return list;
@ -82,24 +82,24 @@ class _CalendarWidgetState extends State<CalendarWidget> {
future: PreferencesService().loadColorPair(),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(child: CircularProgressIndicator());
return const Center(child: CircularProgressIndicator());
}
ColorPair colorPair = snapshot.data!;
return Container(
return SizedBox(
height: 360 + addon,
child: Column(
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 8.0),
child: Text(monthName, style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), // Month Header
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text(monthName, style: const TextStyle(fontSize: 20, fontWeight: FontWeight.bold)), // Month Header
),
Expanded(
child: Padding(
padding: const EdgeInsets.fromLTRB(25, 0, 25, 0),
child: GridView.builder(
physics: NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
physics: const NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7,
),
itemBuilder: (context, index) {
@ -109,18 +109,23 @@ class _CalendarWidgetState extends State<CalendarWidget> {
// Fetching diary entry percentage value
DiaryEntry? entry = diaryEntries[DateFormat('yyyy-MM-dd').format(date)];
if (entry != null) {
print(entry);
print(entry!.date.toString());
print(entry!.percentValue);
print(entry!.texts);
}
double fillPercentage = entry != null ? entry.percentValue / 100.0 : 0.0;
return Center(
child: GestureDetector(
onTap: () => {context.go('/entry', extra: date)},
onTap: () {
DiaryEntry? entry = diaryEntries[DateFormat('yyyy-MM-dd').format(date)];
if (entry != null) {
context.go('/entry', extra: date);
} else {
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("no entry there :("),
duration: Duration(seconds: 2),
),
);
}
},
child: Container(
width: 50,
height: 50,
@ -142,7 +147,7 @@ class _CalendarWidgetState extends State<CalendarWidget> {
DateTime.now().day == date.day && DateTime.now().month == date.month && DateTime.now().year == date.year
? "today"
: DateFormat("d").format(date),
style: TextStyle(color: Colors.black),
style: const TextStyle(color: Colors.black),
),
],
),
@ -159,40 +164,13 @@ class _CalendarWidgetState extends State<CalendarWidget> {
);
});
}
Widget _buildDateCell(DateTime date, DiaryEntry? entry) {
bool isCurrentMonth = date.month == widget.currentDate.month;
double opacity = isCurrentMonth ? 1.0 : 0.5;
Color bgColor = entry != null ? currentColorPair.backgroundColor.withOpacity(opacity) : Colors.transparent;
double fillPercentage = entry != null ? entry.percentValue / 100 : 0; // Assuming percentValue is 0-100
return GestureDetector(
onTap: () {
context.go('/entry', extra: date);
},
child: Container(
child: Stack(
alignment: Alignment.center,
children: [
CircleWidget(
radius: 25 * fillPercentage, // Adjust radius based on value
color: fillPercentage > 0 ? currentColorPair.backgroundColor : Colors.grey.withOpacity(opacity)),
Text(
DateFormat("d").format(date),
style: TextStyle(color: Colors.black),
),
],
),
),
);
}
}
class CircleWidget extends StatelessWidget {
final double radius;
final Color color;
CircleWidget({Key? key, required this.radius, required this.color}) : super(key: key);
const CircleWidget({Key? key, required this.radius, required this.color}) : super(key: key);
@override
Widget build(BuildContext context) {

View File

@ -4,7 +4,7 @@ class StreakWidget extends StatelessWidget {
final int dayCount;
final Color color; // Optional color parameter
StreakWidget({
const StreakWidget({
Key? key,
required this.dayCount,
this.color = Colors.white, // Default to white if not provided

View File

@ -1,81 +0,0 @@
import 'package:flutter/material.dart';
class WritePageOLD extends StatefulWidget {
final double moodPercentage;
const WritePageOLD({Key? key, required this.moodPercentage})
: super(key: key);
@override
_WritePageState createState() => _WritePageState();
}
class _WritePageState extends State<WritePageOLD> {
final TextEditingController _textController = TextEditingController();
bool _hasText = false;
@override
void initState() {
super.initState();
_textController.addListener(() {
setState(() {
_hasText = _textController.text.isNotEmpty;
});
});
}
@override
void dispose() {
_textController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
// Displaying the mood percentage
Text(
"${widget.moodPercentage.toStringAsFixed(0)}%",
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
SizedBox(height: 8),
Text("Today", style: TextStyle(fontSize: 20)),
SizedBox(height: 4),
Text(
"Why was today only ${widget.moodPercentage.toStringAsFixed(0)}% good?",
style: TextStyle(fontSize: 16),
),
SizedBox(height: 20),
// Text area
Expanded(
child: TextField(
controller: _textController,
maxLines: null, // Allows for unlimited lines
expands: true,
decoration: InputDecoration(
hintText: "Enter your thoughts here...",
border: OutlineInputBorder(),
),
),
),
],
),
),
),
// Dynamic Save or Skip button
floatingActionButton: FloatingActionButton.extended(
onPressed: () {
// Implement save or skip functionality
},
label: Text(_hasText ? 'Save' : 'Skip'),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
);
}
}

View File

@ -1,22 +1,23 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:moody/utils/widgets/WhyWidget.dart';
import 'package:moody/utils/widgets/why_widget.dart';
import '../../utils/CirclePainter.dart';
import '../../utils/definitions/ColorPairs.dart';
import '../../utils/circle_painter.dart';
import '../../utils/definitions/color_pair.dart';
import '../../utils/definitions/style_guide.dart';
import '../../utils/logic/PreferencesService.dart';
import '../../utils/widgets/QuestionSliderWidget.dart';
import '../../utils/logic/preferences_service.dart';
import '../../utils/widgets/question_slider_widget.dart';
class WritePage extends StatefulWidget {
final SliderChangeData sliderData;
const WritePage({Key? key, required this.sliderData}) : super(key: key);
@override
_WritePageState createState() => _WritePageState();
State<WritePage> createState() => _WritePage();
}
class _WritePageState extends State<WritePage> {
class _WritePage extends State<WritePage> {
SliderChangeData _sliderData = SliderChangeData(0, 0);
final bool _sliderChanged = true;
final PreferencesService _prefsService = PreferencesService();
@ -43,7 +44,6 @@ class _WritePageState extends State<WritePage> {
// Create a DiaryEntry object from the input
try {
List<String> texts = _textController.text.isEmpty ? [] : [_textController.text];
print("DerText:${_textController.text}");
DiaryEntry entry = DiaryEntry(
date: DateTime.now(), // or some date picker value
percentValue: _sliderData.value.toInt(),
@ -55,7 +55,9 @@ class _WritePageState extends State<WritePage> {
// Handle successful save here, maybe show a snackbar or navigate away
} catch (e) {
// Handle any errors here, such as invalid percent value or failed save
print("Error saving entry: $e"); // Consider showing an error dialog or toast instead
if (kDebugMode) {
print("Error saving entry: $e");
} // Consider showing an error dialog or toast instead
}
}

View File

@ -0,0 +1,27 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:moody/main.dart';
import 'package:moody/utils/slide_direction.dart';
import 'package:moody/views/settings_page/settings_page.dart';
void main() {
// Test for basic rendering of MyApp
testWidgets('MyApp renders correctly', (WidgetTester tester) async {
await tester.pumpWidget(const MyApp());
expect(find.byType(MaterialApp), findsOneWidget);
});
// Test for route configuration
testWidgets('Navigating to /settings shows SettingsPage', (WidgetTester tester) async {
await tester.pumpWidget(const MyApp());
await tester.tap(find.text('Settings'));
await tester.pumpAndSettle();
expect(find.byType(SettingsPage), findsOneWidget);
});
// Test for custom logic - determineSlideDirection
test('determineSlideDirection returns correct SlideDirection', () {
expect(determineSlideDirection('/', '/settings'), equals(SlideDirection.left));
// Add more test cases for different route combinations
});
}