Skip to content

Commit 178f6cd

Browse files
author
davidwei
committed
Refactor note creation and page size handling for dynamic updates
1 parent 5980c09 commit 178f6cd

4 files changed

Lines changed: 61 additions & 46 deletions

File tree

lib/providers/note_list_provider.dart

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@ import '../screens/components/list_grouper.dart';
1010

1111
/// Abstract base class for providers that manage paginated note lists with date grouping
1212
abstract class NoteListProvider extends AuthAwareProvider {
13-
NoteListProvider() {
14-
try {
15-
_pageSize = AppConfig.pageSize;
16-
} catch (e) {
17-
_pageSize = 10; // Default for tests
18-
}
19-
}
20-
2113
// Note list state
2214
List<Note> _notes = [];
2315
List<Note> get notes => _notes;
@@ -27,7 +19,9 @@ abstract class NoteListProvider extends AuthAwareProvider {
2719
int get currentPage => _currentPage;
2820

2921
int _totalNotes = 0;
30-
late final int _pageSize;
22+
23+
// Read pageSize dynamically from AppConfig so setting changes take effect
24+
int get _pageSize => AppConfig.pageSize;
3125

3226
// Computed properties
3327
int get totalPages => _totalNotes <= 0 ? 1 : (_totalNotes / _pageSize).ceil();

lib/providers/tag_notes_provider.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,14 @@ class TagNotesProvider extends NoteListProvider {
6363
return await _notesService.tagNotes(_currentTag, pageSize, pageNumber);
6464
}
6565

66+
/// This is used for optimistic UI updates when creating a note with the current tag
67+
void insertNoteIfOnFirstPage(Note note) {
68+
if (currentPage == 1) {
69+
notes.insert(0, note);
70+
notifyListeners();
71+
}
72+
}
73+
6674
@override
6775
Future<void> performDelete(int noteId) async {
6876
await _notesService.delete(noteId);

lib/screens/search/search_results_page.dart

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import 'package:happy_notes/screens/components/floating_pagination.dart';
1616
import 'package:happy_notes/screens/components/pagination_controls.dart';
1717
import 'package:happy_notes/screens/components/tappable_app_bar_title.dart';
1818
import 'package:happy_notes/entities/note.dart';
19+
import 'package:happy_notes/app_config.dart';
20+
import 'package:happy_notes/screens/components/create_note_fab.dart';
1921

2022
class SearchResultsPage extends StatefulWidget {
2123
final String query;
@@ -74,25 +76,6 @@ class _SearchResultsPageState extends State<SearchResultsPage> {
7476
);
7577
},
7678
),
77-
IconButton(
78-
icon: Util.writeNoteIcon(),
79-
tooltip: 'New Public Note',
80-
onPressed: () async {
81-
final scaffoldMessenger = ScaffoldMessenger.of(context);
82-
final bool? savedSuccessfully = await Navigator.push<bool>(
83-
context,
84-
MaterialPageRoute(
85-
builder: (context) => const NewNote(
86-
isPrivate: false,
87-
),
88-
),
89-
);
90-
if (savedSuccessfully ?? false) {
91-
if (!mounted) return;
92-
Util.showInfo(scaffoldMessenger, 'Note saved successfully.');
93-
}
94-
},
95-
),
9679
],
9780
),
9881
body: Consumer<SearchProvider>(
@@ -106,6 +89,22 @@ class _SearchResultsPageState extends State<SearchResultsPage> {
10689
totalPages: searchProvider.totalPages,
10790
navigateToPage: navigateToPage,
10891
),
92+
CreateNoteFAB(
93+
isPrivate: AppConfig.privateNoteOnlyIsEnabled,
94+
onPressed: () async {
95+
final scaffoldMessenger = ScaffoldMessenger.of(context);
96+
final bool? savedSuccessfully = await Navigator.push<bool>(
97+
context,
98+
MaterialPageRoute(
99+
builder: (context) => NewNote(isPrivate: AppConfig.privateNoteOnlyIsEnabled),
100+
),
101+
);
102+
if (savedSuccessfully ?? false) {
103+
if (!mounted) return;
104+
Util.showInfo(scaffoldMessenger, 'Note saved successfully.');
105+
}
106+
},
107+
),
109108
],
110109
);
111110
},

lib/screens/tag_notes/tag_notes.dart

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'package:flutter/material.dart';
22
import 'package:provider/provider.dart';
3-
import 'package:happy_notes/app_config.dart';
43
import 'package:happy_notes/screens/note_detail/note_detail.dart';
54
import 'package:happy_notes/providers/tag_notes_provider.dart';
65
import 'package:happy_notes/providers/note_list_provider.dart';
@@ -15,6 +14,9 @@ import '../account/user_session.dart';
1514
import '../new_note/new_note.dart';
1615
import '../components/tappable_app_bar_title.dart';
1716
import '../../entities/note.dart';
17+
import 'package:happy_notes/app_config.dart';
18+
import 'package:happy_notes/screens/components/create_note_fab.dart';
19+
import 'package:happy_notes/utils/util.dart';
1820

1921
class TagNotes extends StatefulWidget {
2022
final String tag;
@@ -91,7 +93,6 @@ class TagNotesState extends State<TagNotes> {
9193
);
9294
},
9395
),
94-
_buildNewNoteButton(context),
9596
],
9697
),
9798
body: Consumer<TagNotesProvider>(
@@ -105,29 +106,42 @@ class TagNotesState extends State<TagNotes> {
105106
totalPages: tagProvider.totalPages,
106107
navigateToPage: navigateToPage,
107108
),
109+
CreateNoteFAB(
110+
isPrivate: AppConfig.privateNoteOnlyIsEnabled,
111+
onPressed: () async {
112+
final scaffoldMessenger = ScaffoldMessenger.of(context);
113+
final tagProvider = context.read<TagNotesProvider>();
114+
final Note? savedNote = await Navigator.push<Note>(
115+
context,
116+
MaterialPageRoute(
117+
builder: (context) => NewNote(
118+
isPrivate: AppConfig.privateNoteOnlyIsEnabled,
119+
initialTag: widget.tag,
120+
),
121+
),
122+
);
123+
124+
if (savedNote != null && mounted) {
125+
// Check if saved note contains the current tag
126+
final noteContainsTag = savedNote.tags?.contains(widget.tag) ?? false;
127+
128+
if (noteContainsTag && currentPageNumber == 1) {
129+
// Optimistically insert the note at the top
130+
tagProvider.insertNoteIfOnFirstPage(savedNote);
131+
} else {
132+
// Show success message
133+
Util.showInfo(scaffoldMessenger, 'Note saved successfully.');
134+
}
135+
}
136+
},
137+
),
108138
],
109139
);
110140
},
111141
),
112142
);
113143
}
114144

115-
IconButton _buildNewNoteButton(BuildContext context) {
116-
return IconButton(
117-
icon: const Icon(Icons.edit),
118-
onPressed: () async {
119-
await Navigator.push(
120-
context,
121-
MaterialPageRoute(
122-
builder: (context) => NewNote(
123-
isPrivate: AppConfig.privateNoteOnlyIsEnabled,
124-
initialTag: widget.tag,
125-
),
126-
),
127-
);
128-
},
129-
);
130-
}
131145

132146
Widget _buildBody() {
133147
return Consumer<TagNotesProvider>(

0 commit comments

Comments
 (0)