Skip to content

Commit

Permalink
feat: ✨ update my quotes page
Browse files Browse the repository at this point in the history
Update to navigate the page with better accessibility.
  • Loading branch information
rootasjey committed Apr 3, 2024
1 parent 2020650 commit d01f7c1
Show file tree
Hide file tree
Showing 9 changed files with 775 additions and 211 deletions.
39 changes: 21 additions & 18 deletions lib/screens/dashboard/dashboard_header.dart
Original file line number Diff line number Diff line change
Expand Up @@ -65,25 +65,28 @@ class DashboardHeader extends StatelessWidget {
"assets/images/profile-picture-avocado.png",
),
),
TextButton.icon(
onPressed: () {
onTapNewQuoteButton?.call(context);
},
style: TextButton.styleFrom(
backgroundColor: isDark ? Colors.black : Colors.white,
foregroundColor: foregroundColor,
padding: const EdgeInsets.symmetric(
vertical: 12.0,
horizontal: 24.0,
Utils.graphic.tooltip(
tooltipString: "quote.new".tr(),
child: TextButton.icon(
onPressed: () {
onTapNewQuoteButton?.call(context);
},
style: TextButton.styleFrom(
backgroundColor: isDark ? Colors.black : Colors.white,
foregroundColor: foregroundColor,
padding: const EdgeInsets.symmetric(
vertical: 12.0,
horizontal: 24.0,
),
shape: const StadiumBorder(),
),
shape: const StadiumBorder(),
),
icon: const Icon(TablerIcons.plus, size: 16.0),
label: Text(
"quote.name".tr(),
style: Utils.calligraphy.body(
textStyle: const TextStyle(
fontWeight: FontWeight.w500,
icon: const Icon(TablerIcons.plus, size: 16.0),
label: Text(
"quote.name".tr(),
style: Utils.calligraphy.body(
textStyle: const TextStyle(
fontWeight: FontWeight.w500,
),
),
),
),
Expand Down
125 changes: 70 additions & 55 deletions lib/screens/drafts/drafts_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ import "package:kwotes/router/locations/dashboard_location.dart";
import "package:kwotes/router/navigation_state_helper.dart";
import "package:kwotes/screens/drafts/drafts_page_body.dart";
import "package:kwotes/screens/drafts/drafts_page_header.dart";
import "package:kwotes/screens/drafts/simple_drafts_page_header.dart";
import "package:kwotes/screens/published/header_filter.dart";
import "package:kwotes/types/alias/json_alias.dart";
import "package:kwotes/types/draft_quote.dart";
import "package:kwotes/types/enums/enum_language_selection.dart";
Expand All @@ -33,11 +31,19 @@ class DraftsPage extends StatefulWidget {
const DraftsPage({
super.key,
this.isInTab = false,
this.pageScrollController,
this.selectedLanguage = EnumLanguageSelection.en,
});

/// True if this page is in a tab.
final bool isInTab;

/// Current selected language to fetch draft quotes.
final EnumLanguageSelection selectedLanguage;

/// Page's scroll controller from parent widget.
final ScrollController? pageScrollController;

@override
State<DraftsPage> createState() => _DraftsPageState();
}
Expand All @@ -55,9 +61,6 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
/// Color of selected widgets (e.g. for filter chips).
Color _selectedColor = Colors.amber.shade200;

/// Current selected language to fetch draft quotes.
EnumLanguageSelection _selectedLanguage = EnumLanguageSelection.all;

/// Page's state.
EnumPageState _pageState = EnumPageState.idle;

Expand All @@ -83,8 +86,19 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
fetch();
}

@override
void didUpdateWidget(covariant DraftsPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.selectedLanguage != widget.selectedLanguage) {
_lastDocument = null;
_drafts.clear();
fetch();
}
}

@override
void dispose() {
widget.pageScrollController?.removeListener(onPageScroll);
_pageScrollController.dispose();
_draftSub?.cancel();
_draftSub = null;
Expand All @@ -95,7 +109,23 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
Widget build(BuildContext context) {
final bool isMobileSize = Utils.measurements.isMobileSize(context);
final bool isDark = Theme.of(context).brightness == Brightness.dark;
double toolbarHeight = 92.0;

if (widget.isInTab) {
return DraftsPageBody(
animateList: _animateList,
draftQuotes: _drafts,
isDark: isDark,
isMobileSize: isMobileSize,
onCopyFrom: onCopyFromDraftQuote,
onDelete: onDeleteDraftQuote,
onEdit: onEditDraftQuote,
onSubmit: onSubmitDraftQuote,
onTap: onTapDraftQuote,
pageState: _pageState,
);
}

double toolbarHeight = 160.0;
if (!widget.isInTab) {
toolbarHeight = isMobileSize ? 200.0 : 282.0;
}
Expand All @@ -114,18 +144,14 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
isMobileSize: isMobileSize,
toolbarHeight: toolbarHeight,
children: [
widget.isInTab
? SimpleDraftsPageHeader(
onTapFilter: onTapFilter,
)
: DraftsPageHeader(
isMobileSize: isMobileSize,
onSelectLanguage: onSelectedLanguage,
onTapTitle: onTapTitle,
selectedColor: _selectedColor,
selectedLanguage: _selectedLanguage,
show: NavigationStateHelper.showHeaderPageOptions,
),
DraftsPageHeader(
isMobileSize: isMobileSize,
onSelectLanguage: onSelectedLanguage,
onTapTitle: onTapTitle,
selectedColor: _selectedColor,
selectedLanguage: widget.selectedLanguage,
show: NavigationStateHelper.showHeaderPageOptions,
),
],
),
DraftsPageBody(
Expand Down Expand Up @@ -159,6 +185,12 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
return;
}

setState(() {
_pageState = _lastDocument == null
? EnumPageState.loading
: EnumPageState.loadingMore;
});

try {
final QueryMap query = getQuery(userFirestore.id);
final QuerySnapMap snapshot = await query.get();
Expand Down Expand Up @@ -203,10 +235,10 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
.orderBy("created_at", descending: _descending)
.limit(_limit);

if (_selectedLanguage != EnumLanguageSelection.all) {
if (widget.selectedLanguage != EnumLanguageSelection.all) {
baseQuery = baseQuery.where(
"language",
isEqualTo: _selectedLanguage.name,
isEqualTo: widget.selectedLanguage.name,
);
}

Expand Down Expand Up @@ -273,7 +305,7 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {

/// Initialize page properties.
void initProps() async {
_selectedLanguage = await Utils.vault.getPageLanguage();
widget.pageScrollController?.addListener(onPageScroll);
_selectedColor = Constants.colors.getRandomFromPalette().withOpacity(0.6);
setState(() {});

Expand Down Expand Up @@ -308,13 +340,26 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
});
}

/// Scrolls the page based on the current scroll position.
///
/// This function retrieves the current scroll position from the provided
/// `pageScrollController`. If the scroll position is at or beyond the maximum
/// scroll extent, it calls the `fetch` function.
void onPageScroll() {
final ScrollController? controller = widget.pageScrollController;
if (controller == null) return;
if (controller.position.pixels >= controller.position.maxScrollExtent) {
fetch();
}
}

void onScroll(double offset) {
if (!_hasNextPage) {
return;
}

if (_pageState == EnumPageState.searching ||
_pageState == EnumPageState.searchingMore) {
if (_pageState == EnumPageState.loading ||
_pageState == EnumPageState.loadingMore) {
return;
}

Expand Down Expand Up @@ -376,12 +421,12 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {

/// Callback to select a language.
void onSelectedLanguage(EnumLanguageSelection language) {
if (_selectedLanguage == language) {
if (widget.selectedLanguage == language) {
return;
}

setState(() {
_selectedLanguage = language;
// _selectedLanguage = language;
_drafts.clear();
_lastDocument = null;
});
Expand Down Expand Up @@ -424,34 +469,4 @@ class _DraftsPageState extends State<DraftsPage> with UiLoggy {
NavigationStateHelper.showHeaderPageOptions = newShowPageOptions;
});
}

/// Callback fired when the drafts filter is tapped.
void onTapFilter() {
Utils.graphic.showAdaptiveDialog(
context,
isMobileSize: true,
builder: (BuildContext context) {
return Align(
heightFactor: 0.5,
alignment: Alignment.bottomCenter,
child: Padding(
padding: const EdgeInsets.only(
left: 16.0,
right: 16.0,
bottom: 24.0,
top: 64.0,
),
child: HeaderFilter(
direction: Axis.vertical,
selectedLanguage: _selectedLanguage,
onSelectLanguage: (language) {
onSelectedLanguage(language);
Navigator.pop(context);
},
),
),
);
},
);
}
}

0 comments on commit d01f7c1

Please sign in to comment.