[auth] Hide pin concept in custom sort mode

This commit is contained in:
Neeraj Gupta 2024-12-06 12:45:12 +05:30
parent 95127e6bcd
commit 60bb28668d
5 changed files with 39 additions and 77 deletions

View File

@ -451,10 +451,10 @@
"customEndpoint": "Connected to {endpoint}",
"pinText": "Pin",
"unpinText": "Unpin",
"pinnedCodeMessage": "{code} has been pinned",
"unpinnedCodeMessage": "{code} has been unpinned",
"pinned": "Pinned",
"favorites": "Favorites",
"favoritedCodeMessage": "{code} has been added to favorites",
"unfavoritedCodeMessage": "{code} has been removed from favorites",
"tags": "Tags",
"createNewTag": "Create New Tag",
"tag": "Tag",

View File

@ -57,6 +57,7 @@ class _CodeWidgetState extends State<CodeWidget> {
bool isMaskingEnabled = false;
int _codeTimeStep = -1;
int lastRefreshTime = 0;
bool ignorePin = false;
@override
void initState() {
@ -99,6 +100,7 @@ class _CodeWidgetState extends State<CodeWidget> {
@override
Widget build(BuildContext context) {
ignorePin = widget.sortKey == null || widget.sortKey == CodeSortKey.manual;
final colorScheme = getEnteColorScheme(context);
if (isMaskingEnabled != PreferenceService.instance.shouldHideCodes()) {
isMaskingEnabled = PreferenceService.instance.shouldHideCodes();
@ -117,7 +119,7 @@ class _CodeWidgetState extends State<CodeWidget> {
Widget getCardContents(AppLocalizations l10n) {
return Stack(
children: [
if (widget.code.isPinned)
if (!ignorePin && widget.code.isPinned)
Align(
alignment: Alignment.topRight,
child: CustomPaint(
@ -171,7 +173,7 @@ class _CodeWidgetState extends State<CodeWidget> {
: const SizedBox(height: 32),
],
),
if (widget.code.isPinned) ...[
if (!ignorePin && widget.code.isPinned) ...[
Align(
alignment: Alignment.topRight,
child: Padding(
@ -224,6 +226,7 @@ class _CodeWidgetState extends State<CodeWidget> {
builder: (_) {
return BottomActionBarWidget(
code: widget.code,
showPin: !ignorePin,
onEdit: () => _onEditPressed(true),
onShare: () => _onSharePressed(true),
onPin: () => _onPinPressed(true),
@ -272,7 +275,7 @@ class _CodeWidgetState extends State<CodeWidget> {
icon: Icons.notes_outlined,
onSelected: () => _onShowNotesPressed(null),
),
if (!widget.code.isTrashed)
if (!widget.code.isTrashed && !ignorePin)
MenuItem(
label:
widget.code.isPinned ? l10n.unpinText : l10n.pinText,
@ -602,8 +605,8 @@ class _CodeWidgetState extends State<CodeWidget> {
(value) => showToast(
context,
!currentlyPinned
? context.l10n.favoritedCodeMessage(widget.code.issuer)
: context.l10n.unfavoritedCodeMessage(widget.code.issuer),
? context.l10n.pinnedCodeMessage(widget.code.issuer)
: context.l10n.unpinnedCodeMessage(widget.code.issuer),
),
),
);

View File

@ -19,10 +19,12 @@ class BottomActionBarWidget extends StatelessWidget {
final VoidCallback? onRestore;
final VoidCallback? onDelete;
final VoidCallback? onTrashed;
final bool showPin;
const BottomActionBarWidget({
required this.code,
this.onCancel,
this.showPin = true,
this.backgroundColor,
super.key,
this.onShare,
@ -65,6 +67,7 @@ class BottomActionBarWidget extends StatelessWidget {
const SizedBox(height: 8),
CodeSelectionActionsWidget(
code: code,
showPin: showPin,
onShare: onShare,
onPin: onPin,
onShowQR: onShowQR,

View File

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
class CodeSelectionActionsWidget extends StatefulWidget {
final Code code;
final bool showPin;
final VoidCallback? onShare;
final VoidCallback? onPin;
final VoidCallback? onShowQR;
@ -16,6 +17,7 @@ class CodeSelectionActionsWidget extends StatefulWidget {
const CodeSelectionActionsWidget({
super.key,
required this.code,
this.showPin = true,
this.onShare,
this.onPin,
this.onShowQR,
@ -54,16 +56,18 @@ class _CodeSelectionActionsWidgetState
onTap: widget.onShare,
),
);
items.add(
SelectionActionButton(
labelText: widget.code.isPinned
? context.l10n.unpinText
: context.l10n.pinText,
icon: widget.code.isPinned ? Icons.push_pin_outlined : Icons.pin,
onTap: widget.onPin,
),
);
if (widget.showPin) {
items.add(
SelectionActionButton(
labelText: widget.code.isPinned
? context.l10n.unpinText
: context.l10n.pinText,
icon:
widget.code.isPinned ? Icons.push_pin : Icons.push_pin_outlined,
onTap: widget.onPin,
),
);
}
items.add(
SelectionActionButton(

View File

@ -80,9 +80,7 @@ class _HomePageState extends State<HomePage> {
bool hasTrashedCodes = false;
bool hasNonTrashedCodes = false;
bool isCompactMode = false;
bool _isFavouriteOpen = false;
bool hasFavouriteCodes = false;
bool hasNonFavouriteCodes = false;
late CodeSortKey _codeSortKey;
@override
@ -117,8 +115,6 @@ class _HomePageState extends State<HomePage> {
_allCodes = codes;
hasTrashedCodes = false;
hasNonTrashedCodes = false;
hasNonFavouriteCodes = false;
hasFavouriteCodes = false;
for (final c in _allCodes ?? []) {
if (c.isTrashed) {
@ -126,17 +122,8 @@ class _HomePageState extends State<HomePage> {
} else {
hasNonTrashedCodes = true;
}
if (!c.isTrashed) {
if (c.isPinned) {
hasFavouriteCodes = true;
} else {
hasNonFavouriteCodes = true;
}
}
if (hasTrashedCodes &&
hasNonTrashedCodes &&
hasFavouriteCodes &&
hasNonFavouriteCodes) {
if (hasTrashedCodes && hasNonTrashedCodes) {
break;
}
}
@ -146,12 +133,6 @@ class _HomePageState extends State<HomePage> {
if (!hasNonTrashedCodes && hasTrashedCodes) {
_isTrashOpen = true;
}
if (!hasFavouriteCodes) {
_isFavouriteOpen = false;
}
if (!hasNonFavouriteCodes && hasFavouriteCodes) {
_isFavouriteOpen = true;
}
CodeDisplayStore.instance.getAllTags(allCodes: _allCodes).then((value) {
tags = value;
@ -182,8 +163,7 @@ class _HomePageState extends State<HomePage> {
if (codeState.hasError ||
selectedTag != "" &&
!codeState.display.tags.contains(selectedTag) ||
(codeState.isTrashed != _isTrashOpen) ||
(codeState.isPinned != _isFavouriteOpen && val.isEmpty)) {
(codeState.isTrashed != _isTrashOpen)) {
continue;
}
@ -202,14 +182,6 @@ class _HomePageState extends State<HomePage> {
)
.toList() ??
[];
} else if (_isFavouriteOpen) {
_filteredCodes = _allCodes
?.where(
(element) =>
!element.hasError && !element.isTrashed && element.isPinned,
)
.toList() ??
[];
} else {
_filteredCodes = _allCodes
?.where(
@ -404,7 +376,8 @@ class _HomePageState extends State<HomePage> {
currentKey: PreferenceService.instance.codeSortKey(),
onSelected: (newOrder) async {
await PreferenceService.instance.setCodeSortKey(newOrder);
if (newOrder == CodeSortKey.manual && newOrder == _codeSortKey) {
if (newOrder == CodeSortKey.manual &&
newOrder == _codeSortKey) {
await navigateToReorderPage(_allCodes!);
}
setState(() {
@ -474,8 +447,7 @@ class _HomePageState extends State<HomePage> {
_allCodes?.firstWhereOrNull((element) => element.hasError) != null;
final indexOffset = anyCodeHasError ? 1 : 0;
final itemCount = (hasNonTrashedCodes ? tags.length + 1 : 0) +
(hasTrashedCodes ? 1 : 0) +
(hasFavouriteCodes ? 1 : 0);
(hasTrashedCodes ? 1 : 0);
final list = Column(
crossAxisAlignment: CrossAxisAlignment.start,
@ -494,36 +466,19 @@ class _HomePageState extends State<HomePage> {
if (index == 0 && hasNonTrashedCodes) {
return TagChip(
label: l10n.all,
state: selectedTag == "" &&
_isTrashOpen == false &&
_isFavouriteOpen == false
state: selectedTag == "" && _isTrashOpen == false
? TagChipState.selected
: TagChipState.unselected,
onTap: () {
selectedTag = "";
_isTrashOpen = false;
_isFavouriteOpen = false;
setState(() {});
_applyFilteringAndRefresh();
},
);
}
if (index == 1 && hasFavouriteCodes) {
return TagChip(
label: context.l10n.favorites,
state: _isFavouriteOpen
? TagChipState.selected
: TagChipState.unselected,
onTap: () {
selectedTag = "";
_isTrashOpen = false;
_isFavouriteOpen = !_isFavouriteOpen;
setState(() {});
_applyFilteringAndRefresh();
},
// iconData: Icons.star,
);
}
if (index == itemCount - 1 && hasTrashedCodes) {
return TagChip(
label: l10n.trash,
@ -533,15 +488,13 @@ class _HomePageState extends State<HomePage> {
onTap: () {
selectedTag = "";
_isTrashOpen = !_isTrashOpen;
_isFavouriteOpen = false;
setState(() {});
_applyFilteringAndRefresh();
},
iconData: Icons.delete,
);
}
final customTagIndex =
hasFavouriteCodes ? index - 2 : index - 1;
final customTagIndex = index - 1;
if (customTagIndex >= 0 && customTagIndex < tags.length) {
return TagChip(
label: tags[customTagIndex],
@ -551,7 +504,6 @@ class _HomePageState extends State<HomePage> {
: TagChipState.unselected,
onTap: () {
_isTrashOpen = false;
_isFavouriteOpen = false;
if (selectedTag == tags[customTagIndex]) {
selectedTag = "";
setState(() {});