Skip to content

Commit

Permalink
Merge pull request #1764 from matthiasn/refactor/replace_stream_builder
Browse files Browse the repository at this point in the history
refactor: replace StreamBuilder with controller
  • Loading branch information
matthiasn committed Jun 4, 2024
2 parents 423cd81 + 585b2f0 commit 1ea8d4e
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 97 deletions.
153 changes: 72 additions & 81 deletions lib/widgets/journal/entry_details_widget.dart
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -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,
Expand All @@ -36,90 +36,81 @@ class EntryDetailWidget extends StatelessWidget {
final Set<String>? parentTags;

@override
Widget build(BuildContext context) {
return StreamBuilder<JournalEntity?>(
stream: getIt<JournalDb>().watchEntityById(itemId),
builder: (
BuildContext context,
AsyncSnapshot<JournalEntity?> 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),
],
),
),
);
}
}
26 changes: 11 additions & 15 deletions lib/widgets/tasks/task_form.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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
Expand All @@ -31,7 +28,8 @@ class TaskForm extends ConsumerStatefulWidget {
class _TaskFormState extends ConsumerState<TaskForm> {
@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;
Expand All @@ -53,9 +51,9 @@ class _TaskFormState extends ConsumerState<TaskForm> {
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),
Expand All @@ -82,16 +80,14 @@ class _TaskFormState extends ConsumerState<TaskForm> {
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<Duration>(
context: context,
builder: (context) {
return DurationBottomSheet(
widget.data?.estimate,
);
return DurationBottomSheet(taskData.estimate);
},
);
if (duration != null) {
Expand All @@ -111,7 +107,7 @@ class _TaskFormState extends ConsumerState<TaskForm> {
labelText: 'Status:',
themeData: Theme.of(context),
),
initialValue: widget.data?.status.map(
initialValue: taskData.status.map(
open: (_) => 'OPEN',
groomed: (_) => 'GROOMED',
started: (_) => 'STARTED',
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit 1ea8d4e

Please sign in to comment.