diff --git a/lib/widgets/journal/entry_details_widget.dart b/lib/widgets/journal/entry_details_widget.dart index 729ebc26a..df164bff9 100644 --- a/lib/widgets/journal/entry_details_widget.dart +++ b/lib/widgets/journal/entry_details_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:lotti/classes/journal_entities.dart'; -import 'package:lotti/database/database.dart'; -import 'package:lotti/get_it.dart'; +import 'package:lotti/features/journal/state/entry_controller.dart'; import 'package:lotti/widgets/audio/audio_player.dart'; import 'package:lotti/widgets/events/event_form.dart'; import 'package:lotti/widgets/journal/editor/editor_widget.dart'; @@ -17,7 +17,7 @@ import 'package:lotti/widgets/journal/journal_card.dart'; import 'package:lotti/widgets/journal/tags/tags_list_widget.dart'; import 'package:lotti/widgets/tasks/task_form.dart'; -class EntryDetailWidget extends StatelessWidget { +class EntryDetailWidget extends ConsumerWidget { const EntryDetailWidget({ required this.itemId, required this.popOnDelete, @@ -36,90 +36,81 @@ class EntryDetailWidget extends StatelessWidget { final Set? parentTags; @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: getIt().watchEntityById(itemId), - builder: ( - BuildContext context, - AsyncSnapshot snapshot, - ) { - final item = snapshot.data; - if (item == null || item.meta.deletedAt != null) { - return const SizedBox.shrink(); - } + Widget build( + BuildContext context, + WidgetRef ref, + ) { + final provider = entryControllerProvider(id: itemId); + final entryState = ref.watch(provider).value; - final isTask = item is Task; - final isAudio = item is JournalAudio; + final item = entryState?.entry; + if (item == null || item.meta.deletedAt != null) { + return const SizedBox.shrink(); + } - if (isTask && !showTaskDetails) { - return JournalCard( - item: item, - showLinkedDuration: true, - ); - } + final isTask = item is Task; + final isAudio = item is JournalAudio; - return Card( - key: isAudio ? Key('$itemId-${item.meta.vectorClock}') : Key(itemId), - margin: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - item.maybeMap( - journalImage: EntryImageWidget.new, - orElse: () => const SizedBox.shrink(), - ), - EntryDetailHeader( + if (isTask && !showTaskDetails) { + return JournalCard( + item: item, + showLinkedDuration: true, + ); + } + + return Card( + key: isAudio ? Key('$itemId-${item.meta.vectorClock}') : Key(itemId), + margin: const EdgeInsets.symmetric(horizontal: 4, vertical: 4), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + item.maybeMap( + journalImage: EntryImageWidget.new, + orElse: () => const SizedBox.shrink(), + ), + EntryDetailHeader( + entryId: itemId, + inLinkedEntries: unlinkFn != null, + linkedFromId: linkedFromId, + unlinkFn: unlinkFn, + ), + TagsListWidget(entryId: itemId, parentTags: parentTags), + item.maybeMap( + task: (_) => const SizedBox.shrink(), + event: (_) => const SizedBox.shrink(), + quantitative: (_) => const SizedBox.shrink(), + workout: (_) => const SizedBox.shrink(), + orElse: () { + return EditorWidget( entryId: itemId, - inLinkedEntries: unlinkFn != null, - linkedFromId: linkedFromId, unlinkFn: unlinkFn, - ), - TagsListWidget(entryId: itemId, parentTags: parentTags), - item.maybeMap( - task: (_) => const SizedBox.shrink(), - event: (_) => const SizedBox.shrink(), - quantitative: (_) => const SizedBox.shrink(), - workout: (_) => const SizedBox.shrink(), - orElse: () { - return EditorWidget( - entryId: itemId, - unlinkFn: unlinkFn, - ); - }, - ), - item.map( - journalAudio: (JournalAudio audio) { - return AudioPlayerWidget(audio); - }, - workout: WorkoutSummary.new, - survey: SurveySummary.new, - quantitative: HealthSummary.new, - measurement: MeasurementSummary.new, - task: (Task task) { - return TaskForm( - data: task.data, - task: task, - ); - }, - event: EventForm.new, - habitCompletion: (habit) => HabitSummary( - habit, - paddingLeft: 10, - showIcon: true, - showText: false, - ), - journalEntry: (_) => const SizedBox.shrink(), - journalImage: (_) => const SizedBox.shrink(), - checklistItem: (_) => const SizedBox.shrink(), - ), - EntryDetailFooter(entryId: itemId), - ], + ); + }, + ), + item.map( + journalAudio: AudioPlayerWidget.new, + workout: WorkoutSummary.new, + survey: SurveySummary.new, + quantitative: HealthSummary.new, + measurement: MeasurementSummary.new, + task: TaskForm.new, + event: EventForm.new, + habitCompletion: (habit) => HabitSummary( + habit, + paddingLeft: 10, + showIcon: true, + showText: false, + ), + journalEntry: (_) => const SizedBox.shrink(), + journalImage: (_) => const SizedBox.shrink(), + checklistItem: (_) => const SizedBox.shrink(), ), - ), - ); - }, + EntryDetailFooter(entryId: itemId), + ], + ), + ), ); } } diff --git a/lib/widgets/tasks/task_form.dart b/lib/widgets/tasks/task_form.dart index 8da5e7c49..df2f01809 100644 --- a/lib/widgets/tasks/task_form.dart +++ b/lib/widgets/tasks/task_form.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_form_builder/flutter_form_builder.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:lotti/classes/journal_entities.dart'; -import 'package:lotti/classes/task.dart'; import 'package:lotti/features/journal/state/entry_controller.dart'; import 'package:lotti/l10n/app_localizations_context.dart'; import 'package:lotti/themes/theme.dart'; @@ -13,15 +12,13 @@ import 'package:lotti/widgets/journal/editor/editor_widget.dart'; import 'package:lotti/widgets/journal/entry_tools.dart'; class TaskForm extends ConsumerStatefulWidget { - const TaskForm({ + const TaskForm( + this.task, { super.key, - this.task, - this.data, this.focusOnTitle = false, }); - final TaskData? data; - final Task? task; + final Task task; final bool focusOnTitle; @override @@ -31,7 +28,8 @@ class TaskForm extends ConsumerStatefulWidget { class _TaskFormState extends ConsumerState { @override Widget build(BuildContext context) { - final entryId = widget.task!.meta.id; + final entryId = widget.task.meta.id; + final taskData = widget.task.data; final provider = entryControllerProvider(id: entryId); final notifier = ref.read(provider.notifier); final entryState = ref.watch(provider).value; @@ -53,9 +51,9 @@ class _TaskFormState extends ConsumerState { FormBuilderTextField( autofocus: widget.focusOnTitle, focusNode: notifier.taskTitleFocusNode, - initialValue: widget.data?.title ?? '', + initialValue: taskData.title, decoration: inputDecoration( - labelText: '${widget.data?.title}'.isEmpty + labelText: taskData.title.isEmpty ? context.messages.taskNameLabel : '', themeData: Theme.of(context), @@ -82,16 +80,14 @@ class _TaskFormState extends ConsumerState { style: Theme.of(context).textTheme.titleMedium, readOnly: true, controller: TextEditingController( - text: formatDuration(widget.data?.estimate) - .substring(0, 5), + text: + formatDuration(taskData.estimate).substring(0, 5), ), onTap: () async { final duration = await showModalBottomSheet( context: context, builder: (context) { - return DurationBottomSheet( - widget.data?.estimate, - ); + return DurationBottomSheet(taskData.estimate); }, ); if (duration != null) { @@ -111,7 +107,7 @@ class _TaskFormState extends ConsumerState { labelText: 'Status:', themeData: Theme.of(context), ), - initialValue: widget.data?.status.map( + initialValue: taskData.status.map( open: (_) => 'OPEN', groomed: (_) => 'GROOMED', started: (_) => 'STARTED', diff --git a/pubspec.yaml b/pubspec.yaml index 220cb8de6..27264bf8a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,7 +1,7 @@ name: lotti description: Achieve your goals and keep your data private with Lotti. publish_to: 'none' -version: 0.9.475+2552 +version: 0.9.475+2553 msix_config: display_name: LottiApp