From cf96cdb75ce5fc4a61ca02939e552f65df7881fa Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Tue, 5 Mar 2024 02:51:22 +0200 Subject: [PATCH 01/20] fix: translation --- lib/home/home_screen.dart | 31 +++--- lib/home/tags/tags_screen.dart | 36 ++++--- lib/home/tags/tags_screen_state.dart | 4 +- packages/core/lib/src/generated/intl/S.dart | 102 ++++++++++++++++++ .../core/lib/src/generated/intl/S_en.dart | 53 +++++++++ .../core/lib/src/generated/intl/S_it.dart | 59 +++++++++- .../core/lib/src/generated/intl/S_ru.dart | 53 +++++++++ packages/core/lib/src/l10n/intl_en.arb | 19 +++- packages/core/lib/src/l10n/intl_it.arb | 25 ++++- packages/core/lib/src/l10n/intl_ru.arb | 19 +++- 10 files changed, 359 insertions(+), 42 deletions(-) diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index 12f9be77..04c415ec 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -101,6 +101,7 @@ class TagsVerticalBar extends StatelessWidget { tagId: tag?.id ?? ProjectTagModelId.empty, ), ); + final l10n = context.l10n; return Column( children: [ @@ -122,7 +123,7 @@ class TagsVerticalBar extends StatelessWidget { ), ), icon: const Icon(Icons.edit_square), - tooltip: 'Click to edit Folders', + tooltip: l10n.clickToEditFolders, ), const Gap(8), Expanded( @@ -166,19 +167,21 @@ class _TagListTile extends StatelessWidget { final ProjectTagModelId selectedTagId; @override - Widget build(final BuildContext context) => ListTile( - contentPadding: EdgeInsets.zero, - minVerticalPadding: 0, - dense: true, - titleTextStyle: context.textTheme.labelSmall, - title: - Text(tag.isEmpty ? 'All' : tag.title, textAlign: TextAlign.center), - // ignore: avoid_bool_literals_in_conditional_expressions - selected: tag.isEmpty && selectedTagId.isEmpty - ? true - : tag.id == selectedTagId, - onTap: onTap, - ); + Widget build(final BuildContext context) { + final l10n = context.l10n; + return ListTile( + contentPadding: EdgeInsets.zero, + minVerticalPadding: 0, + dense: true, + titleTextStyle: context.textTheme.labelSmall, + title: + Text(tag.isEmpty ? l10n.all : tag.title, textAlign: TextAlign.center), + // ignore: avoid_bool_literals_in_conditional_expressions + selected: + tag.isEmpty && selectedTagId.isEmpty ? true : tag.id == selectedTagId, + onTap: onTap, + ); + } } class ProjectsListScreen extends StatelessWidget { diff --git a/lib/home/tags/tags_screen.dart b/lib/home/tags/tags_screen.dart index af276c48..93b394e3 100644 --- a/lib/home/tags/tags_screen.dart +++ b/lib/home/tags/tags_screen.dart @@ -52,7 +52,7 @@ class _TagsListView extends StatelessWidget { child: CustomScrollView( shrinkWrap: true, slivers: [ - const DialogTopBar(title: 'Folders').sliver(), + DialogTopBar(title: l10n.folders).sliver(), Card( child: Padding( padding: const EdgeInsets.all(8), @@ -60,14 +60,12 @@ class _TagsListView extends StatelessWidget { text: TextSpan( style: textTheme.bodyMedium, children: [ - const TextSpan( - text: - 'Use 🗂️Folders for Notes and Ideas to quickly organize them.', + TextSpan( + text: l10n.useFoldersForNotes, ), TextSpan( style: textTheme.bodySmall, - text: - '\n\nYou can create up to $foldersLimit Folders.', + text: l10n.youCanCreateUpTo(foldersLimit), ), ], ), @@ -109,7 +107,9 @@ class _TagsListView extends StatelessWidget { onPressed: isLimitReached ? null : tagsScreenNotifier.onCreateTagManagement, - child: Text(isLimitReached ? 'Limit reached' : 'Create folder'), + child: Text( + isLimitReached ? l10n.limitReached : l10n.createFolder, + ), ), ), ], @@ -156,6 +156,7 @@ class _ManageTagView extends StatelessWidget { final textTheme = context.textTheme; final formHelper = stateNotifier.folderFieldFormHelper; final isSaving = selectedTag.isLoading; + final l10n = context.l10n; return Form( key: formHelper.formKey, @@ -165,7 +166,8 @@ class _ManageTagView extends StatelessWidget { child: CustomScrollView( slivers: [ DialogTopBar( - title: '${tagId.isEmpty ? 'Create' : 'Edit'} Folder', + title: + '${tagId.isEmpty ? l10n.create : l10n.edit} ${l10n.folder}', onClose: stateNotifier.onCloseTagManagement, isBottomBorderVisible: false, ).sliver(), @@ -173,8 +175,8 @@ class _ManageTagView extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: UiTextField( - decoration: const InputDecoration( - labelText: 'Folder name', + decoration: InputDecoration( + labelText: l10n.folderName, ), maxLength: 12, value: selectedTag.value.title, @@ -190,7 +192,7 @@ class _ManageTagView extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( - 'Projects', + l10n.projects, style: textTheme.titleMedium, ), ).sliver(), @@ -200,7 +202,7 @@ class _ManageTagView extends StatelessWidget { child: FilledButton.icon( onPressed: stateNotifier.onOpenAddProjects, icon: const Icon(Icons.add), - label: const Text('Add projects'), + label: Text(l10n.addProjects), ), ).sliver(), const SliverGap(16), @@ -232,7 +234,7 @@ class _ManageTagView extends StatelessWidget { Expanded( child: TextButton( onPressed: stateNotifier.onCloseTagManagement, - child: const Text('Cancel'), + child: Text(l10n.cancel), ), ), Expanded( @@ -240,7 +242,7 @@ class _ManageTagView extends StatelessWidget { onPressed: isSaving ? () {} : stateNotifier.onSaveTag, child: isSaving ? const UiCircularProgress() - : Text(tagId.isEmpty ? 'Create' : 'Save'), + : Text(tagId.isEmpty ? l10n.create : l10n.save), ), ), ], @@ -302,7 +304,7 @@ class _AddProjectsView extends StatelessWidget { @override Widget build(final BuildContext context) { final tagsScreenNotifier = context.watch(); - + final l10n = context.l10n; final projects = tagsScreenNotifier.value.projects; return Column( children: [ @@ -315,7 +317,7 @@ class _AddProjectsView extends StatelessWidget { ), automaticallyImplyLeading: false, floating: true, - title: const Text('Add projects'), + title: Text(l10n.addProjects), actions: [ CloseButton(onPressed: tagsScreenNotifier.onCloseAddProjects), ], @@ -357,7 +359,7 @@ class _AddProjectsView extends StatelessWidget { ), ], elevation: const MaterialStatePropertyAll(8), - hintText: 'Search projects', + hintText: l10n.searchProjects, onChanged: tagsScreenNotifier.onSearchAddProjects, padding: const MaterialStatePropertyAll( EdgeInsets.symmetric(horizontal: 16), diff --git a/lib/home/tags/tags_screen_state.dart b/lib/home/tags/tags_screen_state.dart index d52334c8..9b51576d 100644 --- a/lib/home/tags/tags_screen_state.dart +++ b/lib/home/tags/tags_screen_state.dart @@ -163,8 +163,8 @@ extension TagsNotifierXFolderEditing on TagsScreenNotifier { final l10n = context.l10n; final shouldBeDeleted = await Modals.of(context).showWarningDialog( description: - "${l10n.beCarefulItsInreversableAction}. \nDeletion of this Folder doesn't delete any Note or Idea.", - title: 'Delete folder?', + '${l10n.beCarefulItsInreversableAction}. ${l10n.folderDeletionWillNotDeleteProjects}', + title: l10n.deleteFolder, noActionText: l10n.cancel, yesActionText: l10n.delete, ); diff --git a/packages/core/lib/src/generated/intl/S.dart b/packages/core/lib/src/generated/intl/S.dart index 493fab4e..5027cb3f 100644 --- a/packages/core/lib/src/generated/intl/S.dart +++ b/packages/core/lib/src/generated/intl/S.dart @@ -670,6 +670,108 @@ abstract class S { /// In en, this message translates to: /// **'Restore from clipboard'** String get getAllProjectsFromClipboard; + + /// No description provided for @searchProjects. + /// + /// In en, this message translates to: + /// **'Search projects'** + String get searchProjects; + + /// No description provided for @addProjects. + /// + /// In en, this message translates to: + /// **'Add projects'** + String get addProjects; + + /// No description provided for @create. + /// + /// In en, this message translates to: + /// **'Create'** + String get create; + + /// No description provided for @edit. + /// + /// In en, this message translates to: + /// **'Edit'** + String get edit; + + /// No description provided for @folder. + /// + /// In en, this message translates to: + /// **'Folder'** + String get folder; + + /// No description provided for @folderName. + /// + /// In en, this message translates to: + /// **'Folder name'** + String get folderName; + + /// No description provided for @projects. + /// + /// In en, this message translates to: + /// **'Projects'** + String get projects; + + /// No description provided for @folders. + /// + /// In en, this message translates to: + /// **'Folders'** + String get folders; + + /// No description provided for @save. + /// + /// In en, this message translates to: + /// **'Save'** + String get save; + + /// No description provided for @limitReached. + /// + /// In en, this message translates to: + /// **'Limit reached'** + String get limitReached; + + /// No description provided for @createFolder. + /// + /// In en, this message translates to: + /// **'Create folder'** + String get createFolder; + + /// No description provided for @deleteFolder. + /// + /// In en, this message translates to: + /// **'Delete folder?'** + String get deleteFolder; + + /// No description provided for @folderDeletionWillNotDeleteProjects. + /// + /// In en, this message translates to: + /// **'\nDeletion of this Folder doesn\'t delete any Note or Idea.'** + String get folderDeletionWillNotDeleteProjects; + + /// No description provided for @useFoldersForNotes. + /// + /// In en, this message translates to: + /// **'Use 🗂️Folders for Notes and Ideas to quickly organize them.'** + String get useFoldersForNotes; + + /// No description provided for @youCanCreateUpTo. + /// + /// In en, this message translates to: + /// **'\n\nYou can create up to {foldersLimit} Folders.'** + String youCanCreateUpTo(Object foldersLimit); + + /// No description provided for @clickToEditFolders. + /// + /// In en, this message translates to: + /// **'Click to edit Folders'** + String get clickToEditFolders; + + /// No description provided for @all. + /// + /// In en, this message translates to: + /// **'All'** + String get all; } class _SDelegate extends LocalizationsDelegate { diff --git a/packages/core/lib/src/generated/intl/S_en.dart b/packages/core/lib/src/generated/intl/S_en.dart index 413bed79..34e07f1d 100644 --- a/packages/core/lib/src/generated/intl/S_en.dart +++ b/packages/core/lib/src/generated/intl/S_en.dart @@ -297,4 +297,57 @@ class SEn extends S { @override String get getAllProjectsFromClipboard => 'Restore from clipboard'; + + @override + String get searchProjects => 'Search projects'; + + @override + String get addProjects => 'Add projects'; + + @override + String get create => 'Create'; + + @override + String get edit => 'Edit'; + + @override + String get folder => 'Folder'; + + @override + String get folderName => 'Folder name'; + + @override + String get projects => 'Projects'; + + @override + String get folders => 'Folders'; + + @override + String get save => 'Save'; + + @override + String get limitReached => 'Limit reached'; + + @override + String get createFolder => 'Create folder'; + + @override + String get deleteFolder => 'Delete folder?'; + + @override + String get folderDeletionWillNotDeleteProjects => '\nDeletion of this Folder doesn\'t delete any Note or Idea.'; + + @override + String get useFoldersForNotes => 'Use 🗂️Folders for Notes and Ideas to quickly organize them.'; + + @override + String youCanCreateUpTo(Object foldersLimit) { + return '\n\nYou can create up to $foldersLimit Folders.'; + } + + @override + String get clickToEditFolders => 'Click to edit Folders'; + + @override + String get all => 'All'; } diff --git a/packages/core/lib/src/generated/intl/S_it.dart b/packages/core/lib/src/generated/intl/S_it.dart index e40a1825..e219dd10 100644 --- a/packages/core/lib/src/generated/intl/S_it.dart +++ b/packages/core/lib/src/generated/intl/S_it.dart @@ -284,17 +284,70 @@ class SIt extends S { String get allProjectsWereCopiedToClipboard => 'All projects were copied to clipboard 🎉'; @override - String get applyTimestamp => 'Apply timestamp'; + String get applyTimestamp => 'Applica timestamp'; @override - String get restoreFromFile => 'Restore from file'; + String get restoreFromFile => 'Ripristina da file'; @override - String get saveToFile => 'Save to file'; + String get saveToFile => 'Salva su file'; @override String get copyAllProjectsToClipboard => 'Copy to clipboard'; @override String get getAllProjectsFromClipboard => 'Restore from clipboard'; + + @override + String get searchProjects => 'Search projects'; + + @override + String get addProjects => 'Add projects'; + + @override + String get create => 'Create'; + + @override + String get edit => 'Edit'; + + @override + String get folder => 'Folder'; + + @override + String get folderName => 'Folder name'; + + @override + String get projects => 'Projects'; + + @override + String get folders => 'Folders'; + + @override + String get save => 'Save'; + + @override + String get limitReached => 'Limit reached'; + + @override + String get createFolder => 'Create folder'; + + @override + String get deleteFolder => 'Delete folder?'; + + @override + String get folderDeletionWillNotDeleteProjects => '\nL\'eliminazione di questa cartella non elimina alcuna Nota o Idea.'; + + @override + String get useFoldersForNotes => 'Usa 🗂️ Cartelle per Note e Idee per organizzarle rapidamente.'; + + @override + String youCanCreateUpTo(Object foldersLimit) { + return '\n\nPuoi creare fino a $foldersLimit cartelle.'; + } + + @override + String get clickToEditFolders => 'Fai clic per modificare le cartelle'; + + @override + String get all => 'All'; } diff --git a/packages/core/lib/src/generated/intl/S_ru.dart b/packages/core/lib/src/generated/intl/S_ru.dart index 67145fba..521d520e 100644 --- a/packages/core/lib/src/generated/intl/S_ru.dart +++ b/packages/core/lib/src/generated/intl/S_ru.dart @@ -297,4 +297,57 @@ class SRu extends S { @override String get getAllProjectsFromClipboard => 'Восстановить из буфера обмена'; + + @override + String get searchProjects => 'Искать проекты'; + + @override + String get addProjects => 'Добавить'; + + @override + String get create => 'Создать'; + + @override + String get edit => 'Править'; + + @override + String get folder => 'Папка'; + + @override + String get folderName => 'Имя папки'; + + @override + String get projects => 'Проекты'; + + @override + String get folders => 'Папки'; + + @override + String get save => 'Сохранить'; + + @override + String get limitReached => 'Лимит достигнут'; + + @override + String get createFolder => 'Создать папку'; + + @override + String get deleteFolder => 'Удалить папку?'; + + @override + String get folderDeletionWillNotDeleteProjects => '\nУдаление этой папки не удаляет никакую заметку или идею.'; + + @override + String get useFoldersForNotes => 'Используйте 🗂️ Папки для заметок и идей, чтобы быстро организовать их. '; + + @override + String youCanCreateUpTo(Object foldersLimit) { + return '\n\nВы можете создать до $foldersLimit папок.'; + } + + @override + String get clickToEditFolders => 'Редактировать папки'; + + @override + String get all => 'Все'; } diff --git a/packages/core/lib/src/l10n/intl_en.arb b/packages/core/lib/src/l10n/intl_en.arb index 7233e5f6..3e76dd0e 100644 --- a/packages/core/lib/src/l10n/intl_en.arb +++ b/packages/core/lib/src/l10n/intl_en.arb @@ -94,5 +94,22 @@ "restoreFromFile": "Restore from file", "saveToFile": "Save to file", "copyAllProjectsToClipboard": "Copy to clipboard", - "getAllProjectsFromClipboard": "Restore from clipboard" + "getAllProjectsFromClipboard": "Restore from clipboard", + "searchProjects": "Search projects", + "addProjects": "Add projects", + "create": "Create", + "edit": "Edit", + "folder": "Folder", + "folderName": "Folder name", + "projects": "Projects", + "folders": "Folders", + "save": "Save", + "limitReached": "Limit reached", + "createFolder": "Create folder", + "deleteFolder": "Delete folder?", + "folderDeletionWillNotDeleteProjects": "\nDeletion of this Folder doesn't delete any Note or Idea.", + "useFoldersForNotes": "Use 🗂️Folders for Notes and Ideas to quickly organize them.", + "youCanCreateUpTo": "\n\nYou can create up to {foldersLimit} Folders.", + "clickToEditFolders": "Click to edit Folders", + "all": "All" } diff --git a/packages/core/lib/src/l10n/intl_it.arb b/packages/core/lib/src/l10n/intl_it.arb index 127f466c..1f5a83ae 100644 --- a/packages/core/lib/src/l10n/intl_it.arb +++ b/packages/core/lib/src/l10n/intl_it.arb @@ -90,9 +90,26 @@ "rewardForAdThankYou": "🎉🎉🎉 Congratulazioni - ${days} giorni di Supporter Days sono stati aggiunti:) 🎉🎉🎉 Grazie per il tuo supporto!", "yourProjectWasCopiedToClipboard": "Your project was copied to clipboard 🎉", "allProjectsWereCopiedToClipboard": "All projects were copied to clipboard 🎉", - "applyTimestamp": "Apply timestamp", - "restoreFromFile": "Restore from file", - "saveToFile": "Save to file", + "applyTimestamp": "Applica timestamp", + "restoreFromFile": "Ripristina da file", + "saveToFile": "Salva su file", "copyAllProjectsToClipboard": "Copy to clipboard", - "getAllProjectsFromClipboard": "Restore from clipboard" + "getAllProjectsFromClipboard": "Restore from clipboard", + "searchProjects": "Search projects", + "addProjects": "Add projects", + "create": "Create", + "edit": "Edit", + "folder": "Folder", + "folderName": "Folder name", + "projects": "Projects", + "save": "Save", + "folders": "Folders", + "limitReached": "Limit reached", + "createFolder": "Create folder", + "deleteFolder": "Delete folder?", + "folderDeletionWillNotDeleteProjects": "\nL'eliminazione di questa cartella non elimina alcuna Nota o Idea.", + "useFoldersForNotes": "Usa 🗂️ Cartelle per Note e Idee per organizzarle rapidamente.", + "youCanCreateUpTo": "\n\nPuoi creare fino a {foldersLimit} cartelle.", + "clickToEditFolders": "Fai clic per modificare le cartelle", + "all": "All" } diff --git a/packages/core/lib/src/l10n/intl_ru.arb b/packages/core/lib/src/l10n/intl_ru.arb index 05db673a..b864b7c7 100644 --- a/packages/core/lib/src/l10n/intl_ru.arb +++ b/packages/core/lib/src/l10n/intl_ru.arb @@ -97,5 +97,22 @@ "restoreFromFile": "Восстановить из файла", "saveToFile": "Сохранить в файл", "copyAllProjectsToClipboard": "Скопировать в буфер обмена", - "getAllProjectsFromClipboard": "Восстановить из буфера обмена" + "getAllProjectsFromClipboard": "Восстановить из буфера обмена", + "searchProjects": "Искать проекты", + "addProjects": "Добавить", + "create": "Создать", + "edit": "Править", + "folder": "Папка", + "folderName": "Имя папки", + "projects": "Проекты", + "folders": "Папки", + "save": "Сохранить", + "limitReached": "Лимит достигнут", + "createFolder": "Создать папку", + "deleteFolder": "Удалить папку?", + "folderDeletionWillNotDeleteProjects": "\nУдаление этой папки не удаляет никакую заметку или идею.", + "useFoldersForNotes": "Используйте 🗂️ Папки для заметок и идей, чтобы быстро организовать их. ", + "youCanCreateUpTo": "\n\nВы можете создать до {foldersLimit} папок.", + "clickToEditFolders": "Редактировать папки", + "all": "Все" } From e25cf4f69cf22d1759d89fffd55718e92b8e7296 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Tue, 5 Mar 2024 02:59:03 +0200 Subject: [PATCH 02/20] fix: translation --- packages/core/lib/src/generated/intl/S_ru.dart | 2 +- packages/core/lib/src/l10n/intl_ru.arb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/lib/src/generated/intl/S_ru.dart b/packages/core/lib/src/generated/intl/S_ru.dart index 521d520e..0e505377 100644 --- a/packages/core/lib/src/generated/intl/S_ru.dart +++ b/packages/core/lib/src/generated/intl/S_ru.dart @@ -311,7 +311,7 @@ class SRu extends S { String get edit => 'Править'; @override - String get folder => 'Папка'; + String get folder => 'Папку'; @override String get folderName => 'Имя папки'; diff --git a/packages/core/lib/src/l10n/intl_ru.arb b/packages/core/lib/src/l10n/intl_ru.arb index b864b7c7..44ccd26a 100644 --- a/packages/core/lib/src/l10n/intl_ru.arb +++ b/packages/core/lib/src/l10n/intl_ru.arb @@ -102,7 +102,7 @@ "addProjects": "Добавить", "create": "Создать", "edit": "Править", - "folder": "Папка", + "folder": "Папку", "folderName": "Имя папки", "projects": "Проекты", "folders": "Папки", From 20c6d1e9cf25fea8d3551953b1b37b2298ab83c7 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Tue, 5 Mar 2024 03:25:07 +0200 Subject: [PATCH 03/20] docs: readme --- README.md | 11 ++++++++--- snap/snapcraft.yaml | 14 ++++++++++---- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index f15701ba..6880b69b 100644 --- a/README.md +++ b/README.md @@ -42,10 +42,15 @@ Then this app is for you. **FEATURES** -- Quick note - just write a simple note and share it. Useful for Instagram Creators, Bloggers -- Quick note limit - limit characters length by social network. +"Notes" - for bloggers and those who like to write in social networks: -- Idea note - start with an idea, choose questions and answers and share it. Useful for Product/Project managers, developers and anyone with ideas to develop something. You can become a super ninja if you use techniques as 'Five whys', 'PDSA', 'Six Sigma'. +- Write a note by adding a character limit for the chosen social network. +- Share it on social networks or messengers. + +"Ideas" - for developers and anyone with ideas to do something new: + +- start with an idea topic, pick questions and answers and share it. + P.s.: you can become a super ninja if you use techniques such as Five Why's, PDSA, Six Sigma. - Messanger style writing - from down to up, the same way as you write in any messanger - just try it and you will like it:) - Auto sorting - all projects just feels like "chats" in messanger, so what you write recent - is what you will see as first:) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 934c4744..7870dbcd 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -8,12 +8,18 @@ description: | Then this app is for you. **FEATURES** - - Quick note - just write a simple note and share it. Useful for Instagram Creators, Bloggers - - Quick note limit - limit characters length by social network. - - Idea note - start with an idea, choose questions and answers and share it. Useful for Product/Project managers, developers and anyone with ideas to develop something. You can become a super ninja if you use techniques as 'Five whys', 'PDSA', 'Six Sigma'. + "Notes" - for bloggers and those who like to write in social networks: - - Messanger style writing - from down to up, the same way as you write in any messanger - just try it and you will like it:) + - Write a note by adding a character limit for the chosen social network. + - Share it on social networks or messengers. + + "Ideas" - for developers and anyone with ideas to do something new: + + - start with an idea topic, pick questions and answers and share it. + P.s.: you can become a super ninja if you use techniques such as Five Why's, PDSA, Six Sigma. + + - Messanger style writing - from down to up, the same way as you write in any messanger - just try it and you will like it:) - Auto sorting - all projects just feels like "chats" in messanger, so what you write recent - is what you will see as first:) **NEW & EXPERIMENTAL**: From eabf2f5b8d7d261c7d7e6dac97ac3b3ac4aabb27 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Tue, 5 Mar 2024 03:28:47 +0200 Subject: [PATCH 04/20] docs: readme --- README.md | 14 +++++++++----- snap/snapcraft.yaml | 27 ++++++++++++++------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 6880b69b..f2141202 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,16 @@ ## Getting Started -You have a cool idea or you need to write a post/article for your blog. -You need to write it down as fast as possible. +Do you have a cool idea and need to get it down quickly? Or do you blog / write articles on social media? Then this app is for you. -**FEATURES** +In "ideas" answer the questions, write as many answers as you can to get a brief description of the idea and an understanding of how to implement it. +In "notes" write posts and articles. + +That's all ! :) + +FEATURES "Notes" - for bloggers and those who like to write in social networks: @@ -55,12 +59,12 @@ Then this app is for you. - Messanger style writing - from down to up, the same way as you write in any messanger - just try it and you will like it:) - Auto sorting - all projects just feels like "chats" in messanger, so what you write recent - is what you will see as first:) -**NEW & EXPERIMENTAL**: +NEW & EXPERIMENTAL - Folders - now you can organize your ideas and notes in folders. - Backup & Restore - now you can backup and restore data from/to files or from/to clipboard. You control your data. -**EXTRA FEATURES**: +EXTRA FEATURES - Unique & Custom app layout - primary goal is to achive most convenient writing & note orginizing experience. - Responsive layout - nice to you if you use it on full screen or in a small window. diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 7870dbcd..3210c336 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -2,12 +2,16 @@ name: last-answer version: 3.19.3+45 summary: Fast ideas brainstorming tool with quick notes description: | - You have a cool idea or you need to write a post/article for your blog. - You need to write it down as fast as possible. + Do you have a cool idea and need to get it down quickly? Or do you blog / write articles on social media? Then this app is for you. - **FEATURES** + In "ideas" answer the questions, write as many answers as you can to get a brief description of the idea and an understanding of how to implement it. + In "notes" write posts and articles. + + That's all ! :) + + FEATURES "Notes" - for bloggers and those who like to write in social networks: @@ -17,28 +21,25 @@ description: | "Ideas" - for developers and anyone with ideas to do something new: - start with an idea topic, pick questions and answers and share it. - P.s.: you can become a super ninja if you use techniques such as Five Why's, PDSA, Six Sigma. + P.s.: you can become a super ninja if you use techniques such as Five Why's, PDSA, Six Sigma. - Messanger style writing - from down to up, the same way as you write in any messanger - just try it and you will like it:) - Auto sorting - all projects just feels like "chats" in messanger, so what you write recent - is what you will see as first:) - **NEW & EXPERIMENTAL**: + NEW & EXPERIMENTAL + - Folders - now you can organize your ideas and notes in folders. - Backup & Restore - now you can backup and restore data from/to files or from/to clipboard. You control your data. - **EXTRA FEATURES**: + EXTRA FEATURES + - Unique & Custom app layout - primary goal is to achive most convenient writing & note orginizing experience. - Responsive layout - nice to you if you use it on full screen or in a small window. - Dark & Light themes - English, Italian, Russian languages - Hope this app will be useful for you :) - Thank you and have a nice day. - - ## Have an idea, improvements, or bugs? - - Join Discord https://discord.gg/y54DpJwmAn or send a message to idea@xsoulspace.dev - + I hope you find the application useful :) + Have a nice day! --- ## Support Development From eb971bf07096c71f8f29d0972b240032b1d24187 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 01:02:38 +0200 Subject: [PATCH 05/20] chore: flutter 3.19.2 --- .fvmrc | 2 +- .vscode/settings.json | 2 +- pubspec.lock | 4 ++-- pubspec.yaml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.fvmrc b/.fvmrc index 37f94f67..090816fb 100644 --- a/.fvmrc +++ b/.fvmrc @@ -1,3 +1,3 @@ { - "flutter": "3.19.0" + "flutter": "3.19.2" } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index f785ba54..9b9a4e2a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ 80 ] }, - "dart.flutterSdkPath": ".fvm/versions/3.19.0", + "dart.flutterSdkPath": ".fvm/versions/3.19.2", "search.exclude": { "**/.fvm": true }, diff --git a/pubspec.lock b/pubspec.lock index 9e835296..45452db2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2082,10 +2082,10 @@ packages: dependency: "direct main" description: name: wiredash - sha256: a611385e555c486b2ae2c92d9d18cbbdbaaca7a45664e2969b3901ee62afa235 + sha256: "904122419be015f6c0bd043b9b0d2ae763d96dff5cb179757093a934d1624dc8" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "2.1.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 754d097a..be0f6710 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -72,7 +72,7 @@ dependencies: universal_io: ^2.2.2 url_launcher: ^6.1.14 uuid: ^4.1.0 - wiredash: ^1.9.0 + wiredash: ^2.1.0 dev_dependencies: analyzer: ^6.3.0 From 7311e8572d7d4c4dd36eb73aaf9d50d2c21ddd74 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 01:14:36 +0200 Subject: [PATCH 06/20] fix: deprecations --- lib/home/project_widgets/project_text_field.dart | 10 ++++++---- lib/home/tags/tags_screen.dart | 1 + lib/settings/features/characters_limit.dart | 9 ++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/home/project_widgets/project_text_field.dart b/lib/home/project_widgets/project_text_field.dart index a188a04e..6a51f2c6 100644 --- a/lib/home/project_widgets/project_text_field.dart +++ b/lib/home/project_widgets/project_text_field.dart @@ -127,11 +127,13 @@ class _ProjectTextFieldState extends State { child: FocusBubbleContainer( onFocus: widget.onFocus, onUnfocus: widget.onUnfocus, - child: RawKeyboardListener( + child: KeyboardListener( focusNode: _keyboardFocusNode, - onKey: (final event) { - if (event.isKeyPressed(LogicalKeyboardKey.enter) && - (event.isMetaPressed || event.isControlPressed)) { + onKeyEvent: (final event) { + if ((HardwareKeyboard.instance.isMetaPressed || + HardwareKeyboard.instance.isControlPressed) && + HardwareKeyboard.instance + .isLogicalKeyPressed(LogicalKeyboardKey.enter)) { widget.onSubmit(); } }, diff --git a/lib/home/tags/tags_screen.dart b/lib/home/tags/tags_screen.dart index 93b394e3..eec0f7da 100644 --- a/lib/home/tags/tags_screen.dart +++ b/lib/home/tags/tags_screen.dart @@ -167,6 +167,7 @@ class _ManageTagView extends StatelessWidget { slivers: [ DialogTopBar( title: + // ignore: lines_longer_than_80_chars '${tagId.isEmpty ? l10n.create : l10n.edit} ${l10n.folder}', onClose: stateNotifier.onCloseTagManagement, isBottomBorderVisible: false, diff --git a/lib/settings/features/characters_limit.dart b/lib/settings/features/characters_limit.dart index f19b05ae..8aec9aa5 100644 --- a/lib/settings/features/characters_limit.dart +++ b/lib/settings/features/characters_limit.dart @@ -120,9 +120,12 @@ class CharactersLimitSetting extends HookWidget { child: twitterIcon.svg( width: 16, height: 16, - color: controller.isTwitterLimit - ? AppColors.twitterBlue - : theme.textTheme.bodyMedium?.color, + colorFilter: ColorFilter.mode( + controller.isTwitterLimit + ? AppColors.twitterBlue + : theme.textTheme.bodyMedium?.color ?? AppColors.twitterBlue, + BlendMode.src, + ), ), ), CharactersLimitButton( From 1bd0a3ec86c3396a407a11d2045bc5ef6fcc674b Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 01:42:07 +0200 Subject: [PATCH 07/20] fix: x logos --- lib/settings/features/characters_limit.dart | 45 ++++++----- .../features/characters_limit_state.dart | 4 +- .../core/assets/icons/twitter_logo_black.svg | 13 ---- .../core/assets/icons/twitter_logo_blue.svg | 16 ---- .../core/assets/icons/twitter_logo_white.svg | 16 ---- packages/core/assets/icons/x_logo_black.png | Bin 0 -> 102327 bytes packages/core/assets/icons/x_logo_white.png | Bin 0 -> 103016 bytes .../local_isar/collections/collections.g.dart | 70 ++++++++++++++++++ .../local_isar/collections/project.dart | 3 - .../core/lib/src/generated/assets.gen.dart | 27 +++---- packages/core/lib/src/theme/app_colors.dart | 3 - 11 files changed, 104 insertions(+), 93 deletions(-) delete mode 100644 packages/core/assets/icons/twitter_logo_black.svg delete mode 100644 packages/core/assets/icons/twitter_logo_blue.svg delete mode 100644 packages/core/assets/icons/twitter_logo_white.svg create mode 100644 packages/core/assets/icons/x_logo_black.png create mode 100644 packages/core/assets/icons/x_logo_white.png diff --git a/lib/settings/features/characters_limit.dart b/lib/settings/features/characters_limit.dart index 8aec9aa5..47bec754 100644 --- a/lib/settings/features/characters_limit.dart +++ b/lib/settings/features/characters_limit.dart @@ -76,12 +76,11 @@ class CharactersLimitSetting extends HookWidget { } // TODO(arenukvern): refactor to separate widget - SvgGenImage twitterIcon; - if (controller.isTwitterLimit) { - twitterIcon = Assets.icons.twitterLogoBlue; + AssetGenImage xIcon; + if (controller.isXLimit) { + xIcon = dark ? Assets.icons.xLogoBlack : Assets.icons.xLogoWhite; } else { - twitterIcon = - dark ? Assets.icons.twitterLogoWhite : Assets.icons.twitterLogoBlack; + xIcon = dark ? Assets.icons.xLogoWhite : Assets.icons.xLogoBlack; } // TODO(arenukvern): refactor to separate widget @@ -107,9 +106,10 @@ class CharactersLimitSetting extends HookWidget { children: [ CharactersLimitButton( onTap: controller.onSetInstagramLimit, - child: ImageGenIcon( - genImage: instagramIcon, - dimension: 18, + child: instagramIcon.image( + colorBlendMode: BlendMode.srcIn, + width: 18, + height: 18, color: controller.isInstagramLimit ? null : theme.textTheme.bodyMedium?.color, @@ -117,15 +117,9 @@ class CharactersLimitSetting extends HookWidget { ), CharactersLimitButton( onTap: controller.onSetTwitterLimit, - child: twitterIcon.svg( - width: 16, - height: 16, - colorFilter: ColorFilter.mode( - controller.isTwitterLimit - ? AppColors.twitterBlue - : theme.textTheme.bodyMedium?.color ?? AppColors.twitterBlue, - BlendMode.src, - ), + child: ImageGenIcon( + genImage: xIcon, + dimension: 18, ), ), CharactersLimitButton( @@ -165,14 +159,17 @@ class CharactersLimitButton extends StatelessWidget { final Widget child; @override - Widget build(final BuildContext context) => HoverableButton( - onPressed: onTap, - child: Padding( - padding: const EdgeInsets.symmetric( - vertical: 3, - horizontal: 3, + Widget build(final BuildContext context) => Card( + color: context.colorScheme.primaryContainer, + child: HoverableButton( + onPressed: onTap, + child: Padding( + padding: const EdgeInsets.symmetric( + vertical: 3, + horizontal: 3, + ), + child: child, ), - child: child, ), ); } diff --git a/lib/settings/features/characters_limit_state.dart b/lib/settings/features/characters_limit_state.dart index 3431d983..f351f56f 100644 --- a/lib/settings/features/characters_limit_state.dart +++ b/lib/settings/features/characters_limit_state.dart @@ -94,9 +94,9 @@ class CharactersLimitController extends ValueNotifier { static const int twitterLimit = 280; static const String twitterLimitStr = '$twitterLimit'; - bool get isTwitterLimit => limit == twitterLimitStr; + bool get isXLimit => limit == twitterLimitStr; void onSetTwitterLimit() { - final newLimit = isTwitterLimit ? 0 : twitterLimit; + final newLimit = isXLimit ? 0 : twitterLimit; setLimit(newLimit); } diff --git a/packages/core/assets/icons/twitter_logo_black.svg b/packages/core/assets/icons/twitter_logo_black.svg deleted file mode 100644 index a0cd1a4c..00000000 --- a/packages/core/assets/icons/twitter_logo_black.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - diff --git a/packages/core/assets/icons/twitter_logo_blue.svg b/packages/core/assets/icons/twitter_logo_blue.svg deleted file mode 100644 index b25ac935..00000000 --- a/packages/core/assets/icons/twitter_logo_blue.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/packages/core/assets/icons/twitter_logo_white.svg b/packages/core/assets/icons/twitter_logo_white.svg deleted file mode 100644 index d16b6a7d..00000000 --- a/packages/core/assets/icons/twitter_logo_white.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/packages/core/assets/icons/x_logo_black.png b/packages/core/assets/icons/x_logo_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2d7e863f1025b7f93b9ce481d6ecf3614290d8 GIT binary patch literal 102327 zcmZU*3tY_E|37}FyPAq6T|}&1Y??}KsZeOKODHupx=vEjMTw+z8Dv_OvWqEOgmjxq z<5KDV)+p?x&{gTC9Wl8i(pCLm=RMi|e1CtB$38y$S!d4sykF;ap0DTY`FfrAY3m(Z z6y-JK5kiW;{rbx;gk~|}p9^v_@LzuWF8V(F&#b^-cOOD%{*U+{%5S@V7=-^wIkaob zMs%ZI^9}qTDen#2Hz0H~QDM?u8c`Che*0yE-BHTh&Lznz-hUZSt;ySP!m`C=Zy%%8 zB(TT8hwxPCdHMRtL00>u%G?VZHq6tC-F(W1wbW5(z*uNjuVZcO98H>dZH zl--!v6XMl*WF+TP<<4~@s=qBNbXG(t@JRzLYC`A+&qt`G@iFHZB{OhMWSafZCc#Bc z63qo6*2zW1&I;s!fqg6a<&yec2LwA9kD~6B2ZVM8twV^|(C^e$SS}|XbKN)ePxm)e z{raz*0{-7qeMwOhoZB>2NrW`*8XhXA$Iiy%m@bED4cFc%WDaV#uirfJl9amy(5jao~QZh^G{gGXPr$K?vMNU&HO!+cecl2*xpQ4ryPRP>~*ln$j17l10 zhKA&*ExEp-EkR}kW5lUa>DbYWWsnXj3lfu7eA69=gzZ7}AD|D9M z^3r1JWmQyH(7I*6QDB&%`sF{;u*)D;x^+L#qIOWl>S}|2_^`R==_(C^yL#N>7yM@7 zZ}+fO=a1uoNWbudVJcsu@3T6)po_iqlY>h1gxwqoM0^;w*+g!Le&HJ08cHp9B2J?+ zOeLWyr(v?HY);ZvFvCq<{swXu)TkdW-B_}a@9^MdfwtU8^I-FI5$PUhwKw7sto=<^ z)y0%dUPq9gW?V!5;uj+;*gSY2kKyX-?mfObco4xY1&{HTh^O-%*7UY%9znTNPnxyL zb+LyeI^B>aXX1+-FW2ZuSlx@LnKk-CzB=NAlWVcFGIqr=P6$m;f}EJaDDs6HJX&?_(r^^pizsJLvpPCf7ZnDYM-A=C2 zg@&Hez2?4>V8fB|850-_EF7oQ@ex?#PTO8W@pY?s9#tVc3{QygHdwpV0-ywTdC0$T za;29nQ=VPW^1_D7%ps4ft=JL$PTUaw_V2s5BwRZY*qzSF#by-EfCA&j4dHXWX^Fma zpOSeY^1dHd$nv;*gr1W&(ukGV+@ak{dIxW<(Q=*&GtZnqNY`rVvay@}{#f@=sW1$d zbF#j;+&6R%UJgrmcft1E`ls5D4yOS^EZAboqL2SC6nXgT<8eG{h-0Oa{;8GfBH4?l z)AJU;$Pz=59)FyP2e3@bo(Jg>^A0@t(D+t!SSF9eAM^Z~&1ZHMIW7X@9T2Q`Ka${q zazB$tFKq^;l5^p`*O>82|LMS-0q6q4E}t2R=74!9VJ)iaunQ)b_hqC z7JS8T8tzvnw8sO`t3Dg5+r4??$ypaG`nYiVii9qJdddu@puqWW< z&wD?+wnoIH)$= z^e9cI{x{|S>oR#KH7d=tn0b}Lt#{mXp5>&LAA33%LQ&e#V!knnIjnQm-sf?QaMG>W z)*4r+B*_qNo;*uI#Dh|*tS0%02k&+WhLLS{`#p1=mQpISIjnF2*vtG#p-_von~C{q zrz1EB2y%J*rvDgz`Y+DB7!B`x0MkChL@OdE#`ESn(+4CYo)zYdZQ z+L9p%^p0AFL%@MkXLvgn@cy3Qv_4%5E7lrt{1zdJ&!rr1T0g+#g_Et-wTxl_HqvO} zTh}ec0S^9T+Ak=$d?!^|-@ZHO$NHhwf0uqUa9Ys}W)XLA1lPAu>!nsHFA&5l=!Ket#ce%{{6mLwSMs!j*C(6_0sWeb-<(PI8KTI9Nx;!+2bc%Jy0M zr>1?zEZmpo`vT51?2&^tn}5;fYj`XiBInZf8E8(2?LOmPd#0!!c5_`oNmq~=%vE{l z-?-HiSjt&`P+8gbZud}d+rC3;WYF51y&KFN8N7yJ{VhDWpZKc?i`CdIB4Av?jR?bYCow~c>)9f zo`h3wbyrUWreQE1{aK9ZgjB%8IysP8YAvE$iRb1)ii4s=stJ&&f(WbBufHfaD1Mo^pW@+wo zTL#EcKe!0aaT+PL2H`bYfAt~zH%|3M&S2lbCr1Q)F^aObw-&DTHC1Ki`CJ(-AheP_ zqbJ_o;FoxUN9$d-BzT&TYLunF0Y}vNvq}7w@w@K{p2TeOdV#wzikHK zXzs6v#{%-7!vTx+le2HA<|sAGAj;_AQFv|QL6Oq|Y5bfvsp;P_7#yIw9h5s%0AS#f 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 literal 0 HcmV?d00001 diff --git a/packages/core/assets/icons/x_logo_white.png b/packages/core/assets/icons/x_logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..2609e580066db45110ceebdb05c7913e83cc09fd GIT binary patch literal 103016 zcmZ6z2{@GP7eD@teP1GkY`qDINl1mr(t=VE$}%MtqEbQzPZ5bySw>__i%?4(s zXp^!{Wl+RK+2w!khrYkx@Bd!cdv(>^b1&yU%jbN~xhL9o`(|MQSpf{ggtu-n--TiP z6!<@pj|cu`>!OHf@CX0#ElwvfOlmp$pR{$?e{A?i(#c($H(?K6%YTQza2+{fGAyFk)l=dk^^Ei_(cqqzxRijWfL22S}JA#qH+?J{-&4_b!9KfR8FW@2Fw!VH1zP8Qw7DCWZ}r6@St# zO^__8#iq($PhT3%EDO(=jhZw&ozbWXGNOHM)88M$PmJxd_(-*%l1jm*&b$o16vWmF zosOHUFc&YgDJ{*(~ykW!F&SwF*q?Hl?T_dkBTrME}~!SvVN#f|&3SI$}8AHo)x~1UuJ#ifwg-d_&V%W^S$um7L68>xZbf|b; zJxd>#Z4C-26fl0Ky_T|g(%m7ne>?0X@Sb(dtP7eHMC+@cY7^h+ZX8AW4J(FMmXPvh zS`rm2RFNo#M##m)&akdqNFgfuY{RE7?qIj?`%5d=p4tIg75MYN7_Po~UDY1ose#R{ z|J?F%RK4pxZZ9t{Z}{)Rhpbki1+ma38yF+|ncCZVe7SL3stR95vq;Ika@A_2$jK@#bhPp1Eq+%+i5HK5mozvYXhn zwIhvguj-~p`u*X>*xxT!bm?4OBy^`TJ7Qb!Bh3h-AfGrRkeQ;N5!AKeVNF**-0!w% zl~eb?ihpU_7&j7gCFe99+P$dc5b3x5l%KBK&nz!t$IiKvAJOqnr*lUlgT*jw>sHG~ z-rPRY`{TKjUK{OWl&FV}DuJpv$RWLg-SK}qsvp)f;(+Ppk6zxtc<^?Lcto=~VK*rY zI%oY1RHcEXfy=@=r9UL-7iW}LedE+dS9||p@kYYCFt+$0F>{3v7nE7t0n9I#aHsy&33SbBo7 z7@y6?ro7zSsULWPhaU&7a2fCPgl`w5ohs}^(_q2ggDoFl$yHM78% zEN}?;$D~d*Uo;A@X*|=XBdwUeX{lh7L+yy~zvGD-^^m+2&=8FC(Wj%Y{YnKgBV#Hy zu*Y@D!|O?T#NjvUO3d4xkW;IHRZr$2@f`R2lU~VPA?SwRteP`MeU&och+fT{4uAO~jl&$Cl6c{GtOu|pPQZu*AGZEwUfsyRV+99A%$$d6HR2GOun zkXnIHJmPCMy7+xdWN1pwG@U2^E0f7or^Uc0uH_v^^*0kTqW2Xg1znFhqx$<}@0yJU z21mk8r|Eo8X(M${VwG=zA7k%IZ9cKqNQ#(oxF=*zhh~rI$p_TN$~+NG!~Z<>G}cN4 zHSbQLCe6Y0->P6!AjSG0OYFk@T!YjwHS}&+}6rPrk|=>3eB3rx3VFmb^-ZjnZL*=X+x@;I4Wonx`aoEhE(hYc8bDv`GgX)s(r=Q!K; zgMaIf=J2iU)39XNOykD)^Gddxu0R}+DSfKRVR>{e=ucGso96I(Idjf=-(Hp1)aN)K zm)LG2U6s}q8u0}Xe7(#<(qA82Eq`}%Vl(K*Tx(A;aY6Xp>G^>Ah=1{v$dCcWsV4+B|bZS#KVg zk!F!pm^AyTm>hkZ>d!gWNg3qe0)qPY5gyKD#c*3A9uFYO@$k~n#q0(OL@>Zw

iT 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 literal 0 HcmV?d00001 diff --git a/packages/core/lib/src/data_sources/local_isar/collections/collections.g.dart b/packages/core/lib/src/data_sources/local_isar/collections/collections.g.dart index 3d9468aa..d25f59b6 100644 --- a/packages/core/lib/src/data_sources/local_isar/collections/collections.g.dart +++ b/packages/core/lib/src/data_sources/local_isar/collections/collections.g.dart @@ -41,6 +41,10 @@ const ProjectIsarCollectionSchema = IsarGeneratedSchema( name: 'modelIdStr', type: IsarType.string, ), + IsarPropertySchema( + name: 'jsonMap', + type: IsarType.json, + ), ], indexes: [], ), @@ -68,6 +72,7 @@ int serializeProjectIsarCollection( IsarCore.writeString(writer, 3, object.type); IsarCore.writeString(writer, 4, object.jsonContent); IsarCore.writeString(writer, 5, object.modelIdStr); + IsarCore.writeString(writer, 6, isarJsonEncode(object.jsonMap)); return Isar.fastHash(object.modelIdStr); } @@ -141,6 +146,15 @@ dynamic deserializeProjectIsarCollectionProp(IsarReader reader, int property) { return IsarCore.readString(reader, 4) ?? ''; case 5: return IsarCore.readString(reader, 5) ?? ''; + case 6: + { + final json = isarJsonDecode(IsarCore.readString(reader, 6) ?? 'null'); + if (json is Map) { + return json; + } else { + return const {}; + } + } default: throw ArgumentError('Unknown property: $property'); } @@ -1216,6 +1230,20 @@ extension ProjectIsarCollectionQuerySortBy ); }); } + + QueryBuilder + sortByJsonMap() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(6); + }); + } + + QueryBuilder + sortByJsonMapDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(6, sort: Sort.desc); + }); + } } extension ProjectIsarCollectionQuerySortThenBy @@ -1275,6 +1303,20 @@ extension ProjectIsarCollectionQuerySortThenBy return query.addSortBy(5, sort: Sort.desc, caseSensitive: caseSensitive); }); } + + QueryBuilder + thenByJsonMap() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(6); + }); + } + + QueryBuilder + thenByJsonMapDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(6, sort: Sort.desc); + }); + } } extension ProjectIsarCollectionQueryWhereDistinct @@ -1306,6 +1348,13 @@ extension ProjectIsarCollectionQueryWhereDistinct return query.addDistinctBy(4, caseSensitive: caseSensitive); }); } + + QueryBuilder + distinctByJsonMap() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(6); + }); + } } extension ProjectIsarCollectionQueryProperty1 @@ -1343,6 +1392,13 @@ extension ProjectIsarCollectionQueryProperty1 return query.addProperty(5); }); } + + QueryBuilder, QAfterProperty> + jsonMapProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(6); + }); + } } extension ProjectIsarCollectionQueryProperty2 @@ -1381,6 +1437,13 @@ extension ProjectIsarCollectionQueryProperty2 return query.addProperty(5); }); } + + QueryBuilder), QAfterProperty> + jsonMapProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(6); + }); + } } extension ProjectIsarCollectionQueryProperty3 @@ -1419,4 +1482,11 @@ extension ProjectIsarCollectionQueryProperty3 return query.addProperty(5); }); } + + QueryBuilder), + QOperations> jsonMapProperty() { + return QueryBuilder.apply(this, (query) { + return query.addProperty(6); + }); + } } diff --git a/packages/core/lib/src/data_sources/local_isar/collections/project.dart b/packages/core/lib/src/data_sources/local_isar/collections/project.dart index c3e4bb37..80733142 100644 --- a/packages/core/lib/src/data_sources/local_isar/collections/project.dart +++ b/packages/core/lib/src/data_sources/local_isar/collections/project.dart @@ -5,7 +5,4 @@ class ProjectIsarCollection with IsarEquatableMixin { DateTime? updatedAt; List tags = []; String type = ProjectTypes.note.name; - - @Index() - List get contentWords => jsonContent.split(' '); } diff --git a/packages/core/lib/src/generated/assets.gen.dart b/packages/core/lib/src/generated/assets.gen.dart index 7b4eacd3..bdb2cb27 100644 --- a/packages/core/lib/src/generated/assets.gen.dart +++ b/packages/core/lib/src/generated/assets.gen.dart @@ -194,18 +194,6 @@ class $AssetsIconsGen { /// File path: assets/icons/logo_64.png AssetGenImage get logo64 => const AssetGenImage('assets/icons/logo_64.png'); - /// File path: assets/icons/twitter_logo_black.svg - SvgGenImage get twitterLogoBlack => - const SvgGenImage('assets/icons/twitter_logo_black.svg'); - - /// File path: assets/icons/twitter_logo_blue.svg - SvgGenImage get twitterLogoBlue => - const SvgGenImage('assets/icons/twitter_logo_blue.svg'); - - /// File path: assets/icons/twitter_logo_white.svg - SvgGenImage get twitterLogoWhite => - const SvgGenImage('assets/icons/twitter_logo_white.svg'); - /// File path: assets/icons/vk_logo_black.svg SvgGenImage get vkLogoBlack => const SvgGenImage('assets/icons/vk_logo_black.svg'); @@ -218,6 +206,14 @@ class $AssetsIconsGen { SvgGenImage get vkLogoWhite => const SvgGenImage('assets/icons/vk_logo_white.svg'); + /// File path: assets/icons/x_logo_black.png + AssetGenImage get xLogoBlack => + const AssetGenImage('assets/icons/x_logo_black.png'); + + /// File path: assets/icons/x_logo_white.png + AssetGenImage get xLogoWhite => + const AssetGenImage('assets/icons/x_logo_white.png'); + /// List of all assets List get values => [ discordLogoBlack, @@ -242,12 +238,11 @@ class $AssetsIconsGen { logo48, logo512, logo64, - twitterLogoBlack, - twitterLogoBlue, - twitterLogoWhite, vkLogoBlack, vkLogoBlue, - vkLogoWhite + vkLogoWhite, + xLogoBlack, + xLogoWhite ]; } diff --git a/packages/core/lib/src/theme/app_colors.dart b/packages/core/lib/src/theme/app_colors.dart index a16219b1..f1d3e5c0 100644 --- a/packages/core/lib/src/theme/app_colors.dart +++ b/packages/core/lib/src/theme/app_colors.dart @@ -62,7 +62,4 @@ class AppColors { /// #FFBFBD static const accent5 = Color(0xFFFFBFBD); - - /// #1D9BF0 - static const twitterBlue = Color(0xFF1D9BF0); } From 4f609f296dffd7047ac110cceda7be62626644c5 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 02:32:05 +0200 Subject: [PATCH 08/20] feat: snapstore workflow --- .github/wip/release_snapstore.workflow.yml | 13 ----- .../workflows/release_snapstore.workflow.yml | 51 +++++++++++++++++++ 2 files changed, 51 insertions(+), 13 deletions(-) delete mode 100644 .github/wip/release_snapstore.workflow.yml create mode 100644 .github/workflows/release_snapstore.workflow.yml diff --git a/.github/wip/release_snapstore.workflow.yml b/.github/wip/release_snapstore.workflow.yml deleted file mode 100644 index 547fa539..00000000 --- a/.github/wip/release_snapstore.workflow.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Snapstore Build -on: - release: - types: [created] - push: - branches: - - master -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: snapcore/action-build@v1 diff --git a/.github/workflows/release_snapstore.workflow.yml b/.github/workflows/release_snapstore.workflow.yml new file mode 100644 index 00000000..6459eb10 --- /dev/null +++ b/.github/workflows/release_snapstore.workflow.yml @@ -0,0 +1,51 @@ +name: Snapstore Build +on: + release: + types: [created] + push: + branches: + - release/snapstore + workflow_dispatch: + workflow_call: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Install Flutter + uses: subosito/flutter-action@v2 + with: + channel: "stable" + - name: Install Snapcraft + uses: samuelmeuli/action-snapcraft@v2 + - name: Building snap + run: | + snapcraft + # Make sure the snap is installable + - name: Test snap installation + run: | + sudo snap install ./last-answer.snap –dangerous + - name: Save snap for reuse + uses: actions/upload-artifact@v4 + with: + name: last-answer-snap + path: ./last-answer.snap + + publish: + # if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + needs: build + steps: + - name: Download snap + uses: actions/download-artifact@v3 + with: + name: last-answer-snap + path: . + - name: Publish to Snapstore Edge + uses: snapcore/action-publish@v1 + env: + SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} + with: + snap: ./last-answer.snap + release: edge From 6cb2c7db675546042be59a46832cc384507e815c Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 02:45:23 +0200 Subject: [PATCH 09/20] fix: flow --- snap/snapcraft.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 3210c336..9f551301 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -51,7 +51,7 @@ icon: snap/gui/last-answer.png # new template - https://snapcraft.io/docs/flutter-applications confinement: strict # https://snapcraft.io/docs/base-snaps -base: core18 +base: core22 grade: stable slots: @@ -66,7 +66,7 @@ apps: # snap22 not yet supported by flutter extension, # only via plugin (see below) # https://snapcraft.io/docs/flutter-extension - extensions: [flutter-stable] # Where "master" defines which Flutter channel to use for the build + extensions: [gnome] # Where "master" defines which Flutter channel to use for the build # using dev as it is the one channel that supports linux # extensions: [gnome] plugs: From fdf8dd1fa054a1581b6a3300b37debe23ef9859f Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 02:55:48 +0200 Subject: [PATCH 10/20] fix: flow --- .github/workflows/release_snapstore.workflow.yml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release_snapstore.workflow.yml b/.github/workflows/release_snapstore.workflow.yml index 6459eb10..3483c481 100644 --- a/.github/workflows/release_snapstore.workflow.yml +++ b/.github/workflows/release_snapstore.workflow.yml @@ -17,20 +17,14 @@ jobs: uses: subosito/flutter-action@v2 with: channel: "stable" - - name: Install Snapcraft - uses: samuelmeuli/action-snapcraft@v2 - - name: Building snap - run: | - snapcraft + - uses: snapcore/action-build@v1 + id: snapcraft # Make sure the snap is installable - - name: Test snap installation - run: | - sudo snap install ./last-answer.snap –dangerous - name: Save snap for reuse uses: actions/upload-artifact@v4 with: name: last-answer-snap - path: ./last-answer.snap + path: ${{ steps.snapcraft.outputs.snap }} publish: # if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') From 418a3b6ee50bf8e4ec3aa04334af222f1e4ed4ff Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 03:13:54 +0200 Subject: [PATCH 11/20] fix: flow --- .../workflows/release_snapstore.workflow.yml | 19 +------------------ snap/snapcraft.yaml | 5 +++-- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/.github/workflows/release_snapstore.workflow.yml b/.github/workflows/release_snapstore.workflow.yml index 3483c481..e85ce871 100644 --- a/.github/workflows/release_snapstore.workflow.yml +++ b/.github/workflows/release_snapstore.workflow.yml @@ -19,27 +19,10 @@ jobs: channel: "stable" - uses: snapcore/action-build@v1 id: snapcraft - # Make sure the snap is installable - - name: Save snap for reuse - uses: actions/upload-artifact@v4 - with: - name: last-answer-snap - path: ${{ steps.snapcraft.outputs.snap }} - - publish: - # if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') - runs-on: ubuntu-latest - needs: build - steps: - - name: Download snap - uses: actions/download-artifact@v3 - with: - name: last-answer-snap - path: . - name: Publish to Snapstore Edge uses: snapcore/action-publish@v1 env: SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_LOGIN }} with: - snap: ./last-answer.snap + snap: ${{ steps.snapcraft.outputs.snap }} release: edge diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 9f551301..35ff08e3 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -78,9 +78,10 @@ apps: - dbus-last-answer # https://forum.snapcraft.io/t/failed-to-install-or-refresh-a-snap-flutter-does-not-exist/25623 +# https://snapcraft.io/docs/architectures architectures: - - build-on: amd64 - - build-on: arm64 + - build-on: [amd64] + - build-on: [arm64] parts: last-answer: From bf9d56699710f8380f0a1fc8e4170f08c5601328 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 03:59:47 +0200 Subject: [PATCH 12/20] chore: 3.19.4+46 --- .../workflows/release_snapstore.workflow.yml | 17 +++++- .../projects_paged_requests_builder.dart | 6 +++ .../core/lib/src/state/state.freezed.dart | 52 +++++++++++++++---- pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release_snapstore.workflow.yml b/.github/workflows/release_snapstore.workflow.yml index e85ce871..d1ff464c 100644 --- a/.github/workflows/release_snapstore.workflow.yml +++ b/.github/workflows/release_snapstore.workflow.yml @@ -11,14 +11,29 @@ on: jobs: build: runs-on: ubuntu-latest + strategy: + matrix: + platform: + - amd64 + - arm64 steps: - uses: actions/checkout@v4 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" - - uses: snapcore/action-build@v1 + # - uses: snapcore/action-build@v1 + # id: snapcraft + - uses: diddlesnaps/snapcraft-multiarch-action@v1 id: snapcraft + with: + architecture: ${{ matrix.platform }} + environment: | + WIREDASH_PROJECT_ID=${{ secrets.WIREDASH_PROJECT_ID }} + WIREDASH_PROJECT_SECRET=${{ secrets.WIREDASH_PROJECT_SECRET }}}} + - name: Test installation + run: | + sudo snap install --dangerous ${{ steps.snapcraft.outputs.snap }} - name: Publish to Snapstore Edge uses: snapcore/action-publish@v1 env: diff --git a/packages/core/lib/src/state/projects_paged_requests_builder.dart b/packages/core/lib/src/state/projects_paged_requests_builder.dart index ef6d6c44..ce028b09 100644 --- a/packages/core/lib/src/state/projects_paged_requests_builder.dart +++ b/packages/core/lib/src/state/projects_paged_requests_builder.dart @@ -7,9 +7,15 @@ class RequestProjectsDto with _$RequestProjectsDto { @Default([]) final List types, @Default(false) final bool isReversed, @Default(ProjectTagModelId.empty) final ProjectTagModelId tagId, + + /// Enabled to include changelog and other system "notes" + @Default(false) final bool shouldAddChangelog, }) = _RequestProjectsDto; const RequestProjectsDto._(); static const empty = RequestProjectsDto(); + static const emptyForHome = RequestProjectsDto( + shouldAddChangelog: true, + ); bool get isEmpty => search.isEmpty && types.isEmpty && tagId.isEmpty; } diff --git a/packages/core/lib/src/state/state.freezed.dart b/packages/core/lib/src/state/state.freezed.dart index c11d4a37..bd5cebd8 100644 --- a/packages/core/lib/src/state/state.freezed.dart +++ b/packages/core/lib/src/state/state.freezed.dart @@ -633,6 +633,9 @@ mixin _$RequestProjectsDto { bool get isReversed => throw _privateConstructorUsedError; ProjectTagModelId get tagId => throw _privateConstructorUsedError; + /// Enabled to include changelog and other system "notes" + bool get shouldAddChangelog => throw _privateConstructorUsedError; + @JsonKey(ignore: true) $RequestProjectsDtoCopyWith get copyWith => throw _privateConstructorUsedError; @@ -648,7 +651,8 @@ abstract class $RequestProjectsDtoCopyWith<$Res> { {String search, List types, bool isReversed, - ProjectTagModelId tagId}); + ProjectTagModelId tagId, + bool shouldAddChangelog}); } /// @nodoc @@ -668,6 +672,7 @@ class _$RequestProjectsDtoCopyWithImpl<$Res, $Val extends RequestProjectsDto> Object? types = null, Object? isReversed = null, Object? tagId = null, + Object? shouldAddChangelog = null, }) { return _then(_value.copyWith( search: null == search @@ -686,6 +691,10 @@ class _$RequestProjectsDtoCopyWithImpl<$Res, $Val extends RequestProjectsDto> ? _value.tagId : tagId // ignore: cast_nullable_to_non_nullable as ProjectTagModelId, + shouldAddChangelog: null == shouldAddChangelog + ? _value.shouldAddChangelog + : shouldAddChangelog // ignore: cast_nullable_to_non_nullable + as bool, ) as $Val); } } @@ -702,7 +711,8 @@ abstract class _$$RequestProjectsDtoImplCopyWith<$Res> {String search, List types, bool isReversed, - ProjectTagModelId tagId}); + ProjectTagModelId tagId, + bool shouldAddChangelog}); } /// @nodoc @@ -720,6 +730,7 @@ class __$$RequestProjectsDtoImplCopyWithImpl<$Res> Object? types = null, Object? isReversed = null, Object? tagId = null, + Object? shouldAddChangelog = null, }) { return _then(_$RequestProjectsDtoImpl( search: null == search @@ -738,6 +749,10 @@ class __$$RequestProjectsDtoImplCopyWithImpl<$Res> ? _value.tagId : tagId // ignore: cast_nullable_to_non_nullable as ProjectTagModelId, + shouldAddChangelog: null == shouldAddChangelog + ? _value.shouldAddChangelog + : shouldAddChangelog // ignore: cast_nullable_to_non_nullable + as bool, )); } } @@ -750,7 +765,8 @@ class _$RequestProjectsDtoImpl extends _RequestProjectsDto {this.search = '', final List types = const [], this.isReversed = false, - this.tagId = ProjectTagModelId.empty}) + this.tagId = ProjectTagModelId.empty, + this.shouldAddChangelog = false}) : _types = types, super._(); @@ -773,9 +789,14 @@ class _$RequestProjectsDtoImpl extends _RequestProjectsDto @JsonKey() final ProjectTagModelId tagId; + /// Enabled to include changelog and other system "notes" + @override + @JsonKey() + final bool shouldAddChangelog; + @override String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) { - return 'RequestProjectsDto(search: $search, types: $types, isReversed: $isReversed, tagId: $tagId)'; + return 'RequestProjectsDto(search: $search, types: $types, isReversed: $isReversed, tagId: $tagId, shouldAddChangelog: $shouldAddChangelog)'; } @override @@ -786,7 +807,8 @@ class _$RequestProjectsDtoImpl extends _RequestProjectsDto ..add(DiagnosticsProperty('search', search)) ..add(DiagnosticsProperty('types', types)) ..add(DiagnosticsProperty('isReversed', isReversed)) - ..add(DiagnosticsProperty('tagId', tagId)); + ..add(DiagnosticsProperty('tagId', tagId)) + ..add(DiagnosticsProperty('shouldAddChangelog', shouldAddChangelog)); } @override @@ -798,12 +820,19 @@ class _$RequestProjectsDtoImpl extends _RequestProjectsDto const DeepCollectionEquality().equals(other._types, _types) && (identical(other.isReversed, isReversed) || other.isReversed == isReversed) && - (identical(other.tagId, tagId) || other.tagId == tagId)); + (identical(other.tagId, tagId) || other.tagId == tagId) && + (identical(other.shouldAddChangelog, shouldAddChangelog) || + other.shouldAddChangelog == shouldAddChangelog)); } @override - int get hashCode => Object.hash(runtimeType, search, - const DeepCollectionEquality().hash(_types), isReversed, tagId); + int get hashCode => Object.hash( + runtimeType, + search, + const DeepCollectionEquality().hash(_types), + isReversed, + tagId, + shouldAddChangelog); @JsonKey(ignore: true) @override @@ -818,7 +847,8 @@ abstract class _RequestProjectsDto extends RequestProjectsDto { {final String search, final List types, final bool isReversed, - final ProjectTagModelId tagId}) = _$RequestProjectsDtoImpl; + final ProjectTagModelId tagId, + final bool shouldAddChangelog}) = _$RequestProjectsDtoImpl; const _RequestProjectsDto._() : super._(); @override @@ -830,6 +860,10 @@ abstract class _RequestProjectsDto extends RequestProjectsDto { @override ProjectTagModelId get tagId; @override + + /// Enabled to include changelog and other system "notes" + bool get shouldAddChangelog; + @override @JsonKey(ignore: true) _$$RequestProjectsDtoImplCopyWith<_$RequestProjectsDtoImpl> get copyWith => throw _privateConstructorUsedError; diff --git a/pubspec.yaml b/pubspec.yaml index be0f6710..5e98feac 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 3.19.3+45 +version: 3.19.4+46 environment: sdk: ">=3.3.0 <4.0.0" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 35ff08e3..9d5cd596 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: last-answer -version: 3.19.3+45 +version: 3.19.4+46 summary: Fast ideas brainstorming tool with quick notes description: | Do you have a cool idea and need to get it down quickly? Or do you blog / write articles on social media? From f491fa630661b073e7b2eb621e0998321743808d Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 04:41:44 +0200 Subject: [PATCH 13/20] fix: flow for amd --- .../workflows/release_snapstore.workflow.yml | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/release_snapstore.workflow.yml b/.github/workflows/release_snapstore.workflow.yml index d1ff464c..2d5f2cd0 100644 --- a/.github/workflows/release_snapstore.workflow.yml +++ b/.github/workflows/release_snapstore.workflow.yml @@ -1,4 +1,4 @@ -name: Snapstore Build +name: snap amd64 on: release: types: [created] @@ -11,26 +11,27 @@ on: jobs: build: runs-on: ubuntu-latest - strategy: - matrix: - platform: - - amd64 - - arm64 + # strategy: + # matrix: + # platform: + # - amd64 + # - arm64 + env: + WIREDASH_PROJECT_ID: ${{ secrets.WIREDASH_PROJECT_ID }} + WIREDASH_PROJECT_SECRET: ${{ secrets.WIREDASH_PROJECT_SECRET }} steps: - uses: actions/checkout@v4 - name: Install Flutter uses: subosito/flutter-action@v2 with: channel: "stable" - # - uses: snapcore/action-build@v1 - # id: snapcraft - - uses: diddlesnaps/snapcraft-multiarch-action@v1 + - uses: snapcore/action-build@v1 id: snapcraft - with: - architecture: ${{ matrix.platform }} - environment: | - WIREDASH_PROJECT_ID=${{ secrets.WIREDASH_PROJECT_ID }} - WIREDASH_PROJECT_SECRET=${{ secrets.WIREDASH_PROJECT_SECRET }}}} + # - uses: diddlesnaps/snapcraft-multiarch-action@v1 + # id: snapcraft + # with: + # architecture: ${{ matrix.platform }} + # environment: | - name: Test installation run: | sudo snap install --dangerous ${{ steps.snapcraft.outputs.snap }} From 9ddce751f2dd11404a4f54eb545178f74d08682f Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 05:45:14 +0200 Subject: [PATCH 14/20] wip: changelog as note --- Makefile | 5 + lib/home/home_screen.dart | 2 +- lib/home/project_view.dart | 3 + lib/home/tags/tags_screen.dart | 4 +- lib/home/widgets/project_tile.dart | 12 +- lib/note/note_view_bloc.dart | 2 +- .../src/data_models/data_models.freezed.dart | 426 +++++++++++++++++- .../lib/src/data_models/data_models.g.dart | 33 ++ .../core/lib/src/data_models/project.dart | 38 +- .../projects_repository.dart | 9 +- .../local_hive/hive_models.g.dart | 1 + packages/core/lib/src/router_paths.dart | 1 + .../src/state/opened_project_notifier.dart | 4 + 13 files changed, 521 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index a67bde5d..37798d1a 100644 --- a/Makefile +++ b/Makefile @@ -43,3 +43,8 @@ build-google-play: fvm flutter build appbundle --dart-define-from-file=configs/envs/prod.json --dart-define=STORE=googlePlay -t lib/main_prod.dart build-rustore: fvm flutter build apk --dart-define-from-file=configs/envs/prod.json --dart-define=STORE=rustore -t lib/main_prod.dart +# pass +# as argument: make v="3.19." run +# or be defined as environment: wid="" wis="" v="3.19." make run build-snap +deploy-snap: + snapcraft upload --release=edge last-answer_$(v)_arm64.snap \ No newline at end of file diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index 04c415ec..7269a249 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -233,7 +233,7 @@ class _ProjectsListView extends StatelessWidget { onRemove: (final _) async { final shouldProceed = await showRemoveTitleDialog( context: context, - title: item.title, + title: item.getTitle(context), ); if (shouldProceed) { projectsNotifier.deleteProject(item); diff --git a/lib/home/project_view.dart b/lib/home/project_view.dart index 4924394e..f87c995d 100644 --- a/lib/home/project_view.dart +++ b/lib/home/project_view.dart @@ -3,6 +3,7 @@ import 'package:lastanswer/common_imports.dart'; import 'package:lastanswer/home/project_widgets/project_widgets.dart'; import 'package:lastanswer/idea/idea_view.dart'; import 'package:lastanswer/note/note_view.dart'; +import 'package:lastanswer/settings/views/changelog_view.dart'; class ProjectView extends StatelessWidget { const ProjectView({super.key}); @@ -27,6 +28,8 @@ class ProjectView extends StatelessWidget { Expanded(child: NoteView(note: note, key: ValueKey(id))), ], ), + // TODO(arenukvern): description, + changelog: (final changelog) => const ChangelogView(), ); } } diff --git a/lib/home/tags/tags_screen.dart b/lib/home/tags/tags_screen.dart index eec0f7da..e4090494 100644 --- a/lib/home/tags/tags_screen.dart +++ b/lib/home/tags/tags_screen.dart @@ -268,7 +268,7 @@ class SelectableProjectListTile extends StatelessWidget { final void Function(bool isSelected, ProjectModel project) onTap; @override Widget build(final BuildContext context) => ListTile( - title: Text(project.title), + title: Text(project.getTitle(context)), selected: selected, trailing: Icon( Icons.check, @@ -290,7 +290,7 @@ class ClosableProjectListTile extends StatelessWidget { final ValueChanged onDelete; @override Widget build(final BuildContext context) => ListTile( - title: Text(project.title, maxLines: 2), + title: Text(project.getTitle(context), maxLines: 2), trailing: IconButton( iconSize: 16, onPressed: () => onDelete(project), diff --git a/lib/home/widgets/project_tile.dart b/lib/home/widgets/project_tile.dart index 6641b991..06858eb8 100644 --- a/lib/home/widgets/project_tile.dart +++ b/lib/home/widgets/project_tile.dart @@ -19,7 +19,7 @@ class ProjectTile extends StatelessWidget { final ValueChanged onTap; final ValueChanged onRemove; - String createTitle() => project.title; + String createTitle(final BuildContext context) => project.getTitle(context); @override Widget build(final BuildContext context) { @@ -34,6 +34,14 @@ class ProjectTile extends StatelessWidget { color: theme.colorScheme.primary.withOpacity(0.5), ), ), + changelog: (final changelog) => SizedBox.square( + dimension: 14, + child: Icon( + Icons.newspaper, + size: 12.5, + color: theme.colorScheme.primary.withOpacity(0.5), + ), + ), note: (final note) => SizedBox.square( dimension: 14, child: Icon( @@ -64,7 +72,7 @@ class ProjectTile extends StatelessWidget { id: project.id.value, type: HeroIdTypes.projectTitle, child: Text( - ' ${createTitle()}', + ' ${createTitle(context)}', overflow: TextOverflow.ellipsis, maxLines: 4, ), diff --git a/lib/note/note_view_bloc.dart b/lib/note/note_view_bloc.dart index 5b14fb7b..27cb76a5 100644 --- a/lib/note/note_view_bloc.dart +++ b/lib/note/note_view_bloc.dart @@ -55,7 +55,7 @@ class NoteViewBloc extends ValueNotifier { Future onRemove(final BuildContext context) async { final remove = await showRemoveTitleDialog( - title: note.title, + title: note.getTitle(context), context: context, ); if (!remove) return; diff --git a/packages/core/lib/src/data_models/data_models.freezed.dart b/packages/core/lib/src/data_models/data_models.freezed.dart index de21f671..f88e107d 100644 --- a/packages/core/lib/src/data_models/data_models.freezed.dart +++ b/packages/core/lib/src/data_models/data_models.freezed.dart @@ -250,6 +250,8 @@ ProjectModel _$ProjectModelFromJson(Map json) { return ProjectModelIdea.fromJson(json); case 'note': return ProjectModelNote.fromJson(json); + case 'changelog': + return ProjectModelChangelog.fromJson(json); default: throw CheckedFromJsonException(json, 'runtimeType', 'ProjectModel', @@ -263,7 +265,6 @@ mixin _$ProjectModel { DateTime get createdAt => throw _privateConstructorUsedError; DateTime get updatedAt => throw _privateConstructorUsedError; ProjectTypes get type => throw _privateConstructorUsedError; - DateTime? get archivedAt => throw _privateConstructorUsedError; List get tagsIds => throw _privateConstructorUsedError; @optionalTypeArgs TResult when({ @@ -288,6 +289,14 @@ mixin _$ProjectModel { DateTime? archivedAt, List tagsIds) note, + required TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds) + changelog, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -313,6 +322,14 @@ mixin _$ProjectModel { DateTime? archivedAt, List tagsIds)? note, + TResult? Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, }) => throw _privateConstructorUsedError; @optionalTypeArgs @@ -338,6 +355,14 @@ mixin _$ProjectModel { DateTime? archivedAt, List tagsIds)? note, + TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -345,18 +370,21 @@ mixin _$ProjectModel { TResult map({ required TResult Function(ProjectModelIdea value) idea, required TResult Function(ProjectModelNote value) note, + required TResult Function(ProjectModelChangelog value) changelog, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult? mapOrNull({ TResult? Function(ProjectModelIdea value)? idea, TResult? Function(ProjectModelNote value)? note, + TResult? Function(ProjectModelChangelog value)? changelog, }) => throw _privateConstructorUsedError; @optionalTypeArgs TResult maybeMap({ TResult Function(ProjectModelIdea value)? idea, TResult Function(ProjectModelNote value)? note, + TResult Function(ProjectModelChangelog value)? changelog, required TResult orElse(), }) => throw _privateConstructorUsedError; @@ -377,7 +405,6 @@ abstract class $ProjectModelCopyWith<$Res> { DateTime createdAt, DateTime updatedAt, ProjectTypes type, - DateTime? archivedAt, List tagsIds}); } @@ -398,7 +425,6 @@ class _$ProjectModelCopyWithImpl<$Res, $Val extends ProjectModel> Object? createdAt = null, Object? updatedAt = null, Object? type = null, - Object? archivedAt = freezed, Object? tagsIds = null, }) { return _then(_value.copyWith( @@ -418,10 +444,6 @@ class _$ProjectModelCopyWithImpl<$Res, $Val extends ProjectModel> ? _value.type : type // ignore: cast_nullable_to_non_nullable as ProjectTypes, - archivedAt: freezed == archivedAt - ? _value.archivedAt - : archivedAt // ignore: cast_nullable_to_non_nullable - as DateTime?, tagsIds: null == tagsIds ? _value.tagsIds : tagsIds // ignore: cast_nullable_to_non_nullable @@ -655,6 +677,14 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { DateTime? archivedAt, List tagsIds) note, + required TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds) + changelog, }) { return idea(id, createdAt, updatedAt, title, type, archivedAt, answers, draftAnswer, tagsIds); @@ -684,6 +714,14 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { DateTime? archivedAt, List tagsIds)? note, + TResult? Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, }) { return idea?.call(id, createdAt, updatedAt, title, type, archivedAt, answers, draftAnswer, tagsIds); @@ -713,6 +751,14 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { DateTime? archivedAt, List tagsIds)? note, + TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, required TResult orElse(), }) { if (idea != null) { @@ -727,6 +773,7 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { TResult map({ required TResult Function(ProjectModelIdea value) idea, required TResult Function(ProjectModelNote value) note, + required TResult Function(ProjectModelChangelog value) changelog, }) { return idea(this); } @@ -736,6 +783,7 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { TResult? mapOrNull({ TResult? Function(ProjectModelIdea value)? idea, TResult? Function(ProjectModelNote value)? note, + TResult? Function(ProjectModelChangelog value)? changelog, }) { return idea?.call(this); } @@ -745,6 +793,7 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { TResult maybeMap({ TResult Function(ProjectModelIdea value)? idea, TResult Function(ProjectModelNote value)? note, + TResult Function(ProjectModelChangelog value)? changelog, required TResult orElse(), }) { if (idea != null) { @@ -787,7 +836,6 @@ abstract class ProjectModelIdea extends ProjectModel String get title; @override ProjectTypes get type; - @override DateTime? get archivedAt; List get answers; IdeaProjectAnswerModel? get draftAnswer; @@ -992,6 +1040,14 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { DateTime? archivedAt, List tagsIds) note, + required TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds) + changelog, }) { return note(id, createdAt, updatedAt, this.note, type, charactersLimit, archivedAt, tagsIds); @@ -1021,6 +1077,14 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { DateTime? archivedAt, List tagsIds)? note, + TResult? Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, }) { return note?.call(id, createdAt, updatedAt, this.note, type, charactersLimit, archivedAt, tagsIds); @@ -1050,6 +1114,14 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { DateTime? archivedAt, List tagsIds)? note, + TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, required TResult orElse(), }) { if (note != null) { @@ -1064,6 +1136,7 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { TResult map({ required TResult Function(ProjectModelIdea value) idea, required TResult Function(ProjectModelNote value) note, + required TResult Function(ProjectModelChangelog value) changelog, }) { return note(this); } @@ -1073,6 +1146,7 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { TResult? mapOrNull({ TResult? Function(ProjectModelIdea value)? idea, TResult? Function(ProjectModelNote value)? note, + TResult? Function(ProjectModelChangelog value)? changelog, }) { return note?.call(this); } @@ -1082,6 +1156,7 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { TResult maybeMap({ TResult Function(ProjectModelIdea value)? idea, TResult Function(ProjectModelNote value)? note, + TResult Function(ProjectModelChangelog value)? changelog, required TResult orElse(), }) { if (note != null) { @@ -1124,7 +1199,6 @@ abstract class ProjectModelNote extends ProjectModel @override ProjectTypes get type; int get charactersLimit; - @override DateTime? get archivedAt; @override List get tagsIds; @@ -1134,6 +1208,340 @@ abstract class ProjectModelNote extends ProjectModel throw _privateConstructorUsedError; } +/// @nodoc +abstract class _$$ProjectModelChangelogImplCopyWith<$Res> + implements $ProjectModelCopyWith<$Res> { + factory _$$ProjectModelChangelogImplCopyWith( + _$ProjectModelChangelogImpl value, + $Res Function(_$ProjectModelChangelogImpl) then) = + __$$ProjectModelChangelogImplCopyWithImpl<$Res>; + @override + @useResult + $Res call( + {DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds}); + + $LocalizedTextModelCopyWith<$Res> get title; +} + +/// @nodoc +class __$$ProjectModelChangelogImplCopyWithImpl<$Res> + extends _$ProjectModelCopyWithImpl<$Res, _$ProjectModelChangelogImpl> + implements _$$ProjectModelChangelogImplCopyWith<$Res> { + __$$ProjectModelChangelogImplCopyWithImpl(_$ProjectModelChangelogImpl _value, + $Res Function(_$ProjectModelChangelogImpl) _then) + : super(_value, _then); + + @pragma('vm:prefer-inline') + @override + $Res call({ + Object? createdAt = null, + Object? updatedAt = null, + Object? title = null, + Object? id = null, + Object? type = null, + Object? tagsIds = null, + }) { + return _then(_$ProjectModelChangelogImpl( + createdAt: null == createdAt + ? _value.createdAt + : createdAt // ignore: cast_nullable_to_non_nullable + as DateTime, + updatedAt: null == updatedAt + ? _value.updatedAt + : updatedAt // ignore: cast_nullable_to_non_nullable + as DateTime, + title: null == title + ? _value.title + : title // ignore: cast_nullable_to_non_nullable + as LocalizedTextModel, + id: null == id + ? _value.id + : id // ignore: cast_nullable_to_non_nullable + as ProjectModelId, + type: null == type + ? _value.type + : type // ignore: cast_nullable_to_non_nullable + as ProjectTypes, + tagsIds: null == tagsIds + ? _value._tagsIds + : tagsIds // ignore: cast_nullable_to_non_nullable + as List, + )); + } + + @override + @pragma('vm:prefer-inline') + $LocalizedTextModelCopyWith<$Res> get title { + return $LocalizedTextModelCopyWith<$Res>(_value.title, (value) { + return _then(_value.copyWith(title: value)); + }); + } +} + +/// @nodoc +@JsonSerializable() +class _$ProjectModelChangelogImpl extends ProjectModelChangelog { + const _$ProjectModelChangelogImpl( + {required this.createdAt, + required this.updatedAt, + this.title = LocalizedTextModel.empty, + this.id = ProjectModelId.systemChangelog, + this.type = ProjectTypes.systemChangelog, + final List tagsIds = const [], + final String? $type}) + : _tagsIds = tagsIds, + $type = $type ?? 'changelog', + super._(); + + factory _$ProjectModelChangelogImpl.fromJson(Map json) => + _$$ProjectModelChangelogImplFromJson(json); + + @override + final DateTime createdAt; + @override + final DateTime updatedAt; + @override + @JsonKey() + final LocalizedTextModel title; + @override + @JsonKey() + final ProjectModelId id; + @override + @JsonKey() + final ProjectTypes type; + final List _tagsIds; + @override + @JsonKey() + List get tagsIds { + if (_tagsIds is EqualUnmodifiableListView) return _tagsIds; + // ignore: implicit_dynamic_type + return EqualUnmodifiableListView(_tagsIds); + } + + @JsonKey(name: 'runtimeType') + final String $type; + + @override + String toString() { + return 'ProjectModel.changelog(createdAt: $createdAt, updatedAt: $updatedAt, title: $title, id: $id, type: $type, tagsIds: $tagsIds)'; + } + + @override + bool operator ==(dynamic other) { + return identical(this, other) || + (other.runtimeType == runtimeType && + other is _$ProjectModelChangelogImpl && + (identical(other.createdAt, createdAt) || + other.createdAt == createdAt) && + (identical(other.updatedAt, updatedAt) || + other.updatedAt == updatedAt) && + (identical(other.title, title) || other.title == title) && + (identical(other.id, id) || other.id == id) && + (identical(other.type, type) || other.type == type) && + const DeepCollectionEquality().equals(other._tagsIds, _tagsIds)); + } + + @JsonKey(ignore: true) + @override + int get hashCode => Object.hash(runtimeType, createdAt, updatedAt, title, id, + type, const DeepCollectionEquality().hash(_tagsIds)); + + @JsonKey(ignore: true) + @override + @pragma('vm:prefer-inline') + _$$ProjectModelChangelogImplCopyWith<_$ProjectModelChangelogImpl> + get copyWith => __$$ProjectModelChangelogImplCopyWithImpl< + _$ProjectModelChangelogImpl>(this, _$identity); + + @override + @optionalTypeArgs + TResult when({ + required TResult Function( + ProjectModelId id, + DateTime createdAt, + DateTime updatedAt, + String title, + ProjectTypes type, + DateTime? archivedAt, + List answers, + IdeaProjectAnswerModel? draftAnswer, + List tagsIds) + idea, + required TResult Function( + ProjectModelId id, + DateTime createdAt, + DateTime updatedAt, + String note, + ProjectTypes type, + int charactersLimit, + DateTime? archivedAt, + List tagsIds) + note, + required TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds) + changelog, + }) { + return changelog(createdAt, updatedAt, title, id, type, tagsIds); + } + + @override + @optionalTypeArgs + TResult? whenOrNull({ + TResult? Function( + ProjectModelId id, + DateTime createdAt, + DateTime updatedAt, + String title, + ProjectTypes type, + DateTime? archivedAt, + List answers, + IdeaProjectAnswerModel? draftAnswer, + List tagsIds)? + idea, + TResult? Function( + ProjectModelId id, + DateTime createdAt, + DateTime updatedAt, + String note, + ProjectTypes type, + int charactersLimit, + DateTime? archivedAt, + List tagsIds)? + note, + TResult? Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, + }) { + return changelog?.call(createdAt, updatedAt, title, id, type, tagsIds); + } + + @override + @optionalTypeArgs + TResult maybeWhen({ + TResult Function( + ProjectModelId id, + DateTime createdAt, + DateTime updatedAt, + String title, + ProjectTypes type, + DateTime? archivedAt, + List answers, + IdeaProjectAnswerModel? draftAnswer, + List tagsIds)? + idea, + TResult Function( + ProjectModelId id, + DateTime createdAt, + DateTime updatedAt, + String note, + ProjectTypes type, + int charactersLimit, + DateTime? archivedAt, + List tagsIds)? + note, + TResult Function( + DateTime createdAt, + DateTime updatedAt, + LocalizedTextModel title, + ProjectModelId id, + ProjectTypes type, + List tagsIds)? + changelog, + required TResult orElse(), + }) { + if (changelog != null) { + return changelog(createdAt, updatedAt, title, id, type, tagsIds); + } + return orElse(); + } + + @override + @optionalTypeArgs + TResult map({ + required TResult Function(ProjectModelIdea value) idea, + required TResult Function(ProjectModelNote value) note, + required TResult Function(ProjectModelChangelog value) changelog, + }) { + return changelog(this); + } + + @override + @optionalTypeArgs + TResult? mapOrNull({ + TResult? Function(ProjectModelIdea value)? idea, + TResult? Function(ProjectModelNote value)? note, + TResult? Function(ProjectModelChangelog value)? changelog, + }) { + return changelog?.call(this); + } + + @override + @optionalTypeArgs + TResult maybeMap({ + TResult Function(ProjectModelIdea value)? idea, + TResult Function(ProjectModelNote value)? note, + TResult Function(ProjectModelChangelog value)? changelog, + required TResult orElse(), + }) { + if (changelog != null) { + return changelog(this); + } + return orElse(); + } + + @override + Map toJson() { + return _$$ProjectModelChangelogImplToJson( + this, + ); + } +} + +abstract class ProjectModelChangelog extends ProjectModel implements Sharable { + const factory ProjectModelChangelog( + {required final DateTime createdAt, + required final DateTime updatedAt, + final LocalizedTextModel title, + final ProjectModelId id, + final ProjectTypes type, + final List tagsIds}) = _$ProjectModelChangelogImpl; + const ProjectModelChangelog._() : super._(); + + factory ProjectModelChangelog.fromJson(Map json) = + _$ProjectModelChangelogImpl.fromJson; + + @override + DateTime get createdAt; + @override + DateTime get updatedAt; + LocalizedTextModel get title; + @override + ProjectModelId get id; + @override + ProjectTypes get type; + @override + List get tagsIds; + @override + @JsonKey(ignore: true) + _$$ProjectModelChangelogImplCopyWith<_$ProjectModelChangelogImpl> + get copyWith => throw _privateConstructorUsedError; +} + IdeaProjectAnswerModel _$IdeaProjectAnswerModelFromJson( Map json) { return _IdeaProjectAnswerModel.fromJson(json); diff --git a/packages/core/lib/src/data_models/data_models.g.dart b/packages/core/lib/src/data_models/data_models.g.dart index 2854ed0a..e63d2d00 100644 --- a/packages/core/lib/src/data_models/data_models.g.dart +++ b/packages/core/lib/src/data_models/data_models.g.dart @@ -71,6 +71,7 @@ Map _$$ProjectModelIdeaImplToJson( const _$ProjectTypesEnumMap = { ProjectTypes.idea: 'idea', ProjectTypes.note: 'note', + ProjectTypes.systemChangelog: 'systemChangelog', }; _$ProjectModelNoteImpl _$$ProjectModelNoteImplFromJson( @@ -107,6 +108,38 @@ Map _$$ProjectModelNoteImplToJson( 'runtimeType': instance.$type, }; +_$ProjectModelChangelogImpl _$$ProjectModelChangelogImplFromJson( + Map json) => + _$ProjectModelChangelogImpl( + createdAt: DateTime.parse(json['createdAt'] as String), + updatedAt: DateTime.parse(json['updatedAt'] as String), + title: json['title'] == null + ? LocalizedTextModel.empty + : LocalizedTextModel.fromJson(json['title'] as Map), + id: json['id'] == null + ? ProjectModelId.systemChangelog + : ProjectModelId.fromJson(json['id'] as String), + type: $enumDecodeNullable(_$ProjectTypesEnumMap, json['type']) ?? + ProjectTypes.systemChangelog, + tagsIds: (json['tagsIds'] as List?) + ?.map((e) => ProjectTagModelId.fromJson(e as String)) + .toList() ?? + const [], + $type: json['runtimeType'] as String?, + ); + +Map _$$ProjectModelChangelogImplToJson( + _$ProjectModelChangelogImpl instance) => + { + 'createdAt': instance.createdAt.toIso8601String(), + 'updatedAt': instance.updatedAt.toIso8601String(), + 'title': instance.title, + 'id': instance.id, + 'type': _$ProjectTypesEnumMap[instance.type]!, + 'tagsIds': instance.tagsIds, + 'runtimeType': instance.$type, + }; + _$IdeaProjectAnswerModelImpl _$$IdeaProjectAnswerModelImplFromJson( Map json) => _$IdeaProjectAnswerModelImpl( diff --git a/packages/core/lib/src/data_models/project.dart b/packages/core/lib/src/data_models/project.dart index c31a5a39..3033f69f 100644 --- a/packages/core/lib/src/data_models/project.dart +++ b/packages/core/lib/src/data_models/project.dart @@ -4,6 +4,7 @@ extension type const ProjectModelId(String value) { factory ProjectModelId.fromJson(final String value) => ProjectModelId(value); factory ProjectModelId.generate() => ProjectModelId(createId()); static const empty = ProjectModelId(''); + static const systemChangelog = ProjectModelId('changelog'); bool get isEmpty => value.isEmpty; String toJson() => value; } @@ -11,6 +12,7 @@ extension type const ProjectModelId(String value) { enum ProjectTypes { idea, note, + systemChangelog, } @freezed @@ -40,13 +42,42 @@ sealed class ProjectModel with _$ProjectModel implements Sharable, Archivable { final DateTime? archivedAt, @Default([]) final List tagsIds, }) = ProjectModelNote; + + /// keeps only position of system changelog whithout any content + @Implements() + const factory ProjectModel.changelog({ + required final DateTime createdAt, + required final DateTime updatedAt, + @Default(LocalizedTextModel.empty) final LocalizedTextModel title, + @Default(ProjectModelId.systemChangelog) final ProjectModelId id, + @Default(ProjectTypes.systemChangelog) final ProjectTypes type, + @Default([]) final List tagsIds, + }) = ProjectModelChangelog; factory ProjectModel.fromJson(final dynamic json) => _$ProjectModelFromJson(json as Map); const ProjectModel._(); + static ProjectModelChangelog getSystemChangelogFromNotifications({ + required final ProjectModelChangelog project, + required final List notifications, + }) { + final newest = notifications.first; + final oldest = notifications.last; + + return ProjectModelChangelog( + createdAt: oldest.created, + title: newest.title, + updatedAt: project.updatedAt.isAfter(newest.created) + ? project.updatedAt + : newest.created, + ); + } + static const titleLimit = 90; - String get title => switch (this) { + String getTitle(final BuildContext context) => switch (this) { ProjectModelIdea(title: final titleStr) => titleStr, ProjectModelNote(:final note) => _getTitle(note), + ProjectModelChangelog(:final title) => + _getTitle(title.localize(context)), }; @override @@ -54,10 +85,13 @@ sealed class ProjectModel with _$ProjectModel implements Sharable, Archivable { idea: (final value) => ideaProjectToShareString(context: context, projectIdea: value), note: (final value) => value.note, + + /// maybe share newest changelog, but not sure + changelog: (final value) => '', ); @override - String toSharableTitle(final BuildContext context) => title; + String toSharableTitle(final BuildContext context) => getTitle(context); static final emptyNote = ProjectModelNote( id: ProjectModelId.empty, diff --git a/packages/core/lib/src/data_repositories/projects_repository.dart b/packages/core/lib/src/data_repositories/projects_repository.dart index 0edd8dbf..877492e3 100644 --- a/packages/core/lib/src/data_repositories/projects_repository.dart +++ b/packages/core/lib/src/data_repositories/projects_repository.dart @@ -28,8 +28,13 @@ class ProjectsRepository { Future> getPaginated({ required final PaginatedPageRequestModel request, - }) async => - _datasource.getPaginated(dto: request); + }) async { + final response = _datasource.getPaginated(dto: request); + + /// hack to inject changelog + if (request.data?.shouldAddChangelog == true) {} + return response; + } } final class TagsRepository diff --git a/packages/core/lib/src/data_sources/local_hive/hive_models.g.dart b/packages/core/lib/src/data_sources/local_hive/hive_models.g.dart index 686cbcc1..f884d091 100644 --- a/packages/core/lib/src/data_sources/local_hive/hive_models.g.dart +++ b/packages/core/lib/src/data_sources/local_hive/hive_models.g.dart @@ -270,4 +270,5 @@ Map _$SerializableProjectIdToJson( const _$ProjectTypesEnumMap = { ProjectTypes.idea: 'idea', ProjectTypes.note: 'note', + ProjectTypes.systemChangelog: 'systemChangelog', }; diff --git a/packages/core/lib/src/router_paths.dart b/packages/core/lib/src/router_paths.dart index 45601701..537f0638 100644 --- a/packages/core/lib/src/router_paths.dart +++ b/packages/core/lib/src/router_paths.dart @@ -5,6 +5,7 @@ class ScreenPaths { static const bootstrap = '/'; static const home = '/home'; static const intro = '/intro'; + static const changelog = '$home/changelog'; static String idea({required final ProjectModelId ideaId}) => '$home/i/${ideaId.value}'; static String ideaAnswer({ diff --git a/packages/core/lib/src/state/opened_project_notifier.dart b/packages/core/lib/src/state/opened_project_notifier.dart index 9702cdfd..eb19103a 100644 --- a/packages/core/lib/src/state/opened_project_notifier.dart +++ b/packages/core/lib/src/state/opened_project_notifier.dart @@ -26,6 +26,7 @@ class OpenedProjectNotifier final path = switch (project.type) { ProjectTypes.note => ScreenPaths.note(noteId: project.id), ProjectTypes.idea => ScreenPaths.idea(ideaId: project.id), + ProjectTypes.systemChangelog => ScreenPaths.changelog, }; unawaited(context.push(path)); } @@ -43,6 +44,9 @@ class OpenedProjectNotifier if (note.note.isNotEmpty) return; dto.projectsNotifier.deleteProject(note); }, + changelog: (final value) { + // noop + }, ); } From d198028556687a781286b87d315681e71b7f158d Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 22:45:47 +0200 Subject: [PATCH 15/20] feat: updates now visible in projects fix: characters limit layout --- CHANGELOG.md | 8 ++ lib/home/home_screen.dart | 2 +- lib/home/project_view.dart | 56 +++++++++++-- .../project_widgets/project_view_app_bar.dart | 13 --- lib/home/project_widgets/project_widgets.dart | 1 - lib/note/widgets/desktop_note_settings.dart | 20 +++-- lib/router.dart | 4 + lib/settings/features/characters_limit.dart | 46 +++++------ lib/settings/settings_screen.dart | 2 - lib/settings/views/changelog_view.dart | 1 + macos/Podfile.lock | 2 +- .../assets/json/updates_notifications.json | 6 +- .../src/data_models/data_models.freezed.dart | 82 ++++++++++++++----- .../lib/src/data_models/data_models.g.dart | 4 + .../core/lib/src/data_models/project.dart | 9 +- .../lib/src/state/notifications_notifier.dart | 20 +++-- 16 files changed, 182 insertions(+), 94 deletions(-) delete mode 100644 lib/home/project_widgets/project_view_app_bar.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index b51d53a1..ba8a64d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.20 (next) + +🧩 Puzzle update 🧩 + +- feat: app updates now visible in projects + +- fix: characters limit layout made more compact and cozy + ## 3.19 🪄 Scourgify update!:) diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index 7269a249..cba8ec3d 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -178,7 +178,7 @@ class _TagListTile extends StatelessWidget { Text(tag.isEmpty ? l10n.all : tag.title, textAlign: TextAlign.center), // ignore: avoid_bool_literals_in_conditional_expressions selected: - tag.isEmpty && selectedTagId.isEmpty ? true : tag.id == selectedTagId, + (tag.isEmpty && selectedTagId.isEmpty) || tag.id == selectedTagId, onTap: onTap, ); } diff --git a/lib/home/project_view.dart b/lib/home/project_view.dart index f87c995d..d0df4f93 100644 --- a/lib/home/project_view.dart +++ b/lib/home/project_view.dart @@ -1,6 +1,5 @@ import 'package:lastanswer/_library/widgets/widgets.dart'; import 'package:lastanswer/common_imports.dart'; -import 'package:lastanswer/home/project_widgets/project_widgets.dart'; import 'package:lastanswer/idea/idea_view.dart'; import 'package:lastanswer/note/note_view.dart'; import 'package:lastanswer/settings/views/changelog_view.dart'; @@ -19,17 +18,56 @@ class ProjectView extends StatelessWidget { } final id = projectContainer.value.id; - final screenLayout = ScreenLayout.of(context); return projectContainer.value.map( idea: (final idea) => IdeaView(idea: idea, key: ValueKey(id)), - note: (final note) => Column( - children: [ - if (screenLayout.small) const ProjectViewAppBar() else const Gap(42), - Expanded(child: NoteView(note: note, key: ValueKey(id))), - ], + note: (final note) => _AdaptiveView( + appBar: const _ProjectViewAppBar(), + child: NoteView(note: note, key: ValueKey(id)), + ), + changelog: (final changelog) => const _AdaptiveView( + appBar: _ChangelogViewAppBar(), + child: ChangelogView(), ), - // TODO(arenukvern): description, - changelog: (final changelog) => const ChangelogView(), ); } } + +class _AdaptiveView extends StatelessWidget { + const _AdaptiveView({required this.child, required this.appBar, super.key}); + final Widget appBar; + final Widget child; + + @override + Widget build(final BuildContext context) { + final screenLayout = ScreenLayout.of(context); + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (screenLayout.small) appBar else const Gap(42), + Expanded(child: child), + ], + ); + } +} + +class _ProjectViewAppBar extends StatelessWidget { + const _ProjectViewAppBar({super.key}); + + @override + Widget build(final BuildContext context) => BackTextUniversalAppBar( + onBack: () => context.go(ScreenPaths.home), + titleStr: '', + useBackButton: true, + ); +} + +class _ChangelogViewAppBar extends StatelessWidget { + const _ChangelogViewAppBar({super.key}); + + @override + Widget build(final BuildContext context) => BackTextUniversalAppBar( + onBack: () => context.go(ScreenPaths.home), + titleStr: context.l10n.changeLog, + useBackButton: true, + ); +} diff --git a/lib/home/project_widgets/project_view_app_bar.dart b/lib/home/project_widgets/project_view_app_bar.dart deleted file mode 100644 index c1de4b2b..00000000 --- a/lib/home/project_widgets/project_view_app_bar.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:lastanswer/_library/widgets/widgets.dart'; -import 'package:lastanswer/common_imports.dart'; - -class ProjectViewAppBar extends StatelessWidget { - const ProjectViewAppBar({super.key}); - - @override - Widget build(final BuildContext context) => BackTextUniversalAppBar( - onBack: () => context.go(ScreenPaths.home), - titleStr: '', - useBackButton: true, - ); -} diff --git a/lib/home/project_widgets/project_widgets.dart b/lib/home/project_widgets/project_widgets.dart index cd4a72df..6375f883 100644 --- a/lib/home/project_widgets/project_widgets.dart +++ b/lib/home/project_widgets/project_widgets.dart @@ -1,3 +1,2 @@ export 'project_text_field.dart'; export 'project_title_field.dart'; -export 'project_view_app_bar.dart'; diff --git a/lib/note/widgets/desktop_note_settings.dart b/lib/note/widgets/desktop_note_settings.dart index e30e3b5d..09dab2f3 100644 --- a/lib/note/widgets/desktop_note_settings.dart +++ b/lib/note/widgets/desktop_note_settings.dart @@ -23,6 +23,7 @@ class DesktopNoteSettingsMenu extends HookWidget { ); return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: borderPadding), HovarableListTile( @@ -38,8 +39,8 @@ class DesktopNoteSettingsMenu extends HookWidget { ), ), ), - const SizedBox(height: borderPadding * 2), - divider, + const Gap(borderPadding * 2), + const Divider(height: 4, thickness: 4), Expanded( child: HoverableArea( clickable: false, @@ -48,25 +49,26 @@ class DesktopNoteSettingsMenu extends HookWidget { child: Padding( padding: const EdgeInsets.symmetric(horizontal: borderPadding), child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ const SizedBox(height: borderPadding * 2), Row( - mainAxisAlignment: MainAxisAlignment.center, children: [ - Text( - '${context.l10n.charactersLimit}:', - textAlign: TextAlign.center, - style: theme.textTheme.titleLarge, + Flexible( + child: Text( + '${context.l10n.charactersLimit}:', + textAlign: TextAlign.left, + style: theme.textTheme.titleMedium, + ), ), ], ), - const Divider(), + const Gap(2), Expanded( child: CharactersLimitSetting( controller: characterLimitController, ), ), - const Divider(), ], ), ), diff --git a/lib/router.dart b/lib/router.dart index e0344407..9e581029 100644 --- a/lib/router.dart +++ b/lib/router.dart @@ -40,6 +40,10 @@ final appRouter = GoRouter( '/home/i/:ideaId', (final _) => const ProjectView(), ), + AppRoute( + ScreenPaths.changelog, + (final _) => const ProjectView(), + ), ], ), ], diff --git a/lib/settings/features/characters_limit.dart b/lib/settings/features/characters_limit.dart index 47bec754..74e633c1 100644 --- a/lib/settings/features/characters_limit.dart +++ b/lib/settings/features/characters_limit.dart @@ -22,23 +22,24 @@ class CharactersLimitSetting extends HookWidget { otherButton = Row( mainAxisSize: MainAxisSize.min, children: [ - const Gap(12), - UiTextField( - value: controller.limit, - focusNode: controller.focusNode, - onChanged: controller.onLimitChanged, - keyboardType: TextInputType.number, - autocorrect: false, - enableSuggestions: false, - inputFormatters: [FilteringTextInputFormatter.digitsOnly], - decoration: const InputDecoration() - .applyDefaults(theme.inputDecorationTheme) - .copyWith( - hintText: context.l10n.charactersUnlimited, - constraints: const BoxConstraints(maxWidth: 60), - ), + Flexible( + child: UiTextField( + value: controller.limit, + focusNode: controller.focusNode, + onChanged: controller.onLimitChanged, + keyboardType: TextInputType.number, + autocorrect: false, + enableSuggestions: false, + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + decoration: const InputDecoration() + .applyDefaults(theme.inputDecorationTheme) + .copyWith( + isDense: true, + hintText: context.l10n.charactersUnlimited, + constraints: const BoxConstraints(maxWidth: 60), + ), + ), ), - const Gap(2), HoverableButton( onPressed: controller.isEditing ? controller.onClearLimit : null, child: const Icon( @@ -49,12 +50,9 @@ class CharactersLimitSetting extends HookWidget { ], ); } else { - otherButton = Padding( - padding: const EdgeInsets.only(right: 8), - child: HoverableButton( - onPressed: () => controller.setIsEditing(true), - child: Text(context.l10n.charactersUnlimited), - ), + otherButton = HoverableButton( + onPressed: () => controller.setIsEditing(true), + child: Text(context.l10n.charactersUnlimited), ); } // TODO(arenukvern): refactor to separate widget @@ -100,8 +98,8 @@ class CharactersLimitSetting extends HookWidget { } return Wrap( - spacing: 14, - runSpacing: 14, + spacing: 8, + runSpacing: 8, crossAxisAlignment: WrapCrossAlignment.center, children: [ CharactersLimitButton( diff --git a/lib/settings/settings_screen.dart b/lib/settings/settings_screen.dart index 89f9ec32..b97e2f69 100644 --- a/lib/settings/settings_screen.dart +++ b/lib/settings/settings_screen.dart @@ -22,7 +22,6 @@ class SettingsScreen extends HookWidget { const MyAccountViewRemoteImpl() else const MyAccountViewLocalImpl(), - const ChangelogView(), ]; Widget child = TabBarView( physics: const SpeedyPageViewScrollPhysics(), @@ -37,7 +36,6 @@ class SettingsScreen extends HookWidget { tabs: [ Tab(text: context.l10n.generalSettingsShortTitle), if (isAccountViewVisible) Tab(text: context.l10n.myAccount), - Tab(text: context.l10n.changeLog), ], ), ); diff --git a/lib/settings/views/changelog_view.dart b/lib/settings/views/changelog_view.dart index f0247234..e7e2cfa5 100644 --- a/lib/settings/views/changelog_view.dart +++ b/lib/settings/views/changelog_view.dart @@ -16,6 +16,7 @@ class ChangelogView extends StatelessWidget { return Column( mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Padding( padding: EdgeInsets.only(top: i == 0 ? 0 : 32, bottom: 24), diff --git a/macos/Podfile.lock b/macos/Podfile.lock index a46ecc89..6cd83a18 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -290,4 +290,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 329c3f477c2913a5855e69d5463fbe341bc4695e -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.2 diff --git a/packages/core/assets/json/updates_notifications.json b/packages/core/assets/json/updates_notifications.json index 0c7128fa..6cd9642b 100644 --- a/packages/core/assets/json/updates_notifications.json +++ b/packages/core/assets/json/updates_notifications.json @@ -2,9 +2,9 @@ { "id": "5", "message": { - "ru": "- feat(🗂️): новая опция группировки проектов в папки (экспериментальная)\n- feat(💾): множество вариантов резервного копирования и восстановления данных (экспериментальная)\nfix: обновление проекта просто кликнув по нему", - "en": "- feat(🗂️): new option to group projects into folders (experimental)\n- feat(💾): many options to backup and restore data (experimental)\n - fix: update project just for clicking to it", - "it": "- feat(🗂️): nuova opzione per raggruppare i progetti in cartelle (sperimentale)\n- feat(💾): molte opzioni per eseguire il backup e ripristinare i dati (sperimentale)\nfix: aggiornare il progetto semplicemente cliccandoci sopra", + "ru": "- feat(🗂️): новая опция группировки проектов в папки (экспериментальная)\n- feat(💾): множество вариантов резервного копирования и восстановления данных (экспериментальная)\n- fix: обновление проекта просто кликнув по нему. \n\nПотрясающих идей и настроения 🏞️\nАнтон", + "en": "- feat(🗂️): new option to group projects into folders (experimental)\n- feat(💾): many options to backup and restore data (experimental)\n- fix: update project just for clicking to it. \n\nHave great ideas and mood 🏞️\nAnton", + "it": "- feat(🗂️): nuova opzione per raggruppare i progetti in cartelle (sperimentale)\n- feat(💾): molte opzioni per eseguire il backup e ripristinare i dati (sperimentale)\n- fix: aggiornare il progetto semplicemente cliccandoci sopra \n\nHai delle ottime idee e umore 🏞️\nAnton", "ga": "" }, "title": { diff --git a/packages/core/lib/src/data_models/data_models.freezed.dart b/packages/core/lib/src/data_models/data_models.freezed.dart index f88e107d..43e29663 100644 --- a/packages/core/lib/src/data_models/data_models.freezed.dart +++ b/packages/core/lib/src/data_models/data_models.freezed.dart @@ -265,6 +265,7 @@ mixin _$ProjectModel { DateTime get createdAt => throw _privateConstructorUsedError; DateTime get updatedAt => throw _privateConstructorUsedError; ProjectTypes get type => throw _privateConstructorUsedError; + DateTime? get archivedAt => throw _privateConstructorUsedError; List get tagsIds => throw _privateConstructorUsedError; @optionalTypeArgs TResult when({ @@ -295,7 +296,8 @@ mixin _$ProjectModel { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds) + List tagsIds, + DateTime? archivedAt) changelog, }) => throw _privateConstructorUsedError; @@ -328,7 +330,8 @@ mixin _$ProjectModel { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, }) => throw _privateConstructorUsedError; @@ -361,7 +364,8 @@ mixin _$ProjectModel { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, required TResult orElse(), }) => @@ -405,6 +409,7 @@ abstract class $ProjectModelCopyWith<$Res> { DateTime createdAt, DateTime updatedAt, ProjectTypes type, + DateTime? archivedAt, List tagsIds}); } @@ -425,6 +430,7 @@ class _$ProjectModelCopyWithImpl<$Res, $Val extends ProjectModel> Object? createdAt = null, Object? updatedAt = null, Object? type = null, + Object? archivedAt = freezed, Object? tagsIds = null, }) { return _then(_value.copyWith( @@ -444,6 +450,10 @@ class _$ProjectModelCopyWithImpl<$Res, $Val extends ProjectModel> ? _value.type : type // ignore: cast_nullable_to_non_nullable as ProjectTypes, + archivedAt: freezed == archivedAt + ? _value.archivedAt + : archivedAt // ignore: cast_nullable_to_non_nullable + as DateTime?, tagsIds: null == tagsIds ? _value.tagsIds : tagsIds // ignore: cast_nullable_to_non_nullable @@ -683,7 +693,8 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds) + List tagsIds, + DateTime? archivedAt) changelog, }) { return idea(id, createdAt, updatedAt, title, type, archivedAt, answers, @@ -720,7 +731,8 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, }) { return idea?.call(id, createdAt, updatedAt, title, type, archivedAt, @@ -757,7 +769,8 @@ class _$ProjectModelIdeaImpl extends ProjectModelIdea { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, required TResult orElse(), }) { @@ -836,6 +849,7 @@ abstract class ProjectModelIdea extends ProjectModel String get title; @override ProjectTypes get type; + @override DateTime? get archivedAt; List get answers; IdeaProjectAnswerModel? get draftAnswer; @@ -1046,7 +1060,8 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds) + List tagsIds, + DateTime? archivedAt) changelog, }) { return note(id, createdAt, updatedAt, this.note, type, charactersLimit, @@ -1083,7 +1098,8 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, }) { return note?.call(id, createdAt, updatedAt, this.note, type, @@ -1120,7 +1136,8 @@ class _$ProjectModelNoteImpl extends ProjectModelNote { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, required TResult orElse(), }) { @@ -1199,6 +1216,7 @@ abstract class ProjectModelNote extends ProjectModel @override ProjectTypes get type; int get charactersLimit; + @override DateTime? get archivedAt; @override List get tagsIds; @@ -1223,7 +1241,8 @@ abstract class _$$ProjectModelChangelogImplCopyWith<$Res> LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds}); + List tagsIds, + DateTime? archivedAt}); $LocalizedTextModelCopyWith<$Res> get title; } @@ -1245,6 +1264,7 @@ class __$$ProjectModelChangelogImplCopyWithImpl<$Res> Object? id = null, Object? type = null, Object? tagsIds = null, + Object? archivedAt = freezed, }) { return _then(_$ProjectModelChangelogImpl( createdAt: null == createdAt @@ -1271,6 +1291,10 @@ class __$$ProjectModelChangelogImplCopyWithImpl<$Res> ? _value._tagsIds : tagsIds // ignore: cast_nullable_to_non_nullable as List, + archivedAt: freezed == archivedAt + ? _value.archivedAt + : archivedAt // ignore: cast_nullable_to_non_nullable + as DateTime?, )); } @@ -1293,6 +1317,7 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { this.id = ProjectModelId.systemChangelog, this.type = ProjectTypes.systemChangelog, final List tagsIds = const [], + this.archivedAt, final String? $type}) : _tagsIds = tagsIds, $type = $type ?? 'changelog', @@ -1323,12 +1348,15 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { return EqualUnmodifiableListView(_tagsIds); } + @override + final DateTime? archivedAt; + @JsonKey(name: 'runtimeType') final String $type; @override String toString() { - return 'ProjectModel.changelog(createdAt: $createdAt, updatedAt: $updatedAt, title: $title, id: $id, type: $type, tagsIds: $tagsIds)'; + return 'ProjectModel.changelog(createdAt: $createdAt, updatedAt: $updatedAt, title: $title, id: $id, type: $type, tagsIds: $tagsIds, archivedAt: $archivedAt)'; } @override @@ -1343,13 +1371,15 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { (identical(other.title, title) || other.title == title) && (identical(other.id, id) || other.id == id) && (identical(other.type, type) || other.type == type) && - const DeepCollectionEquality().equals(other._tagsIds, _tagsIds)); + const DeepCollectionEquality().equals(other._tagsIds, _tagsIds) && + (identical(other.archivedAt, archivedAt) || + other.archivedAt == archivedAt)); } @JsonKey(ignore: true) @override int get hashCode => Object.hash(runtimeType, createdAt, updatedAt, title, id, - type, const DeepCollectionEquality().hash(_tagsIds)); + type, const DeepCollectionEquality().hash(_tagsIds), archivedAt); @JsonKey(ignore: true) @override @@ -1388,10 +1418,12 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds) + List tagsIds, + DateTime? archivedAt) changelog, }) { - return changelog(createdAt, updatedAt, title, id, type, tagsIds); + return changelog( + createdAt, updatedAt, title, id, type, tagsIds, archivedAt); } @override @@ -1424,10 +1456,12 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, }) { - return changelog?.call(createdAt, updatedAt, title, id, type, tagsIds); + return changelog?.call( + createdAt, updatedAt, title, id, type, tagsIds, archivedAt); } @override @@ -1460,12 +1494,14 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { LocalizedTextModel title, ProjectModelId id, ProjectTypes type, - List tagsIds)? + List tagsIds, + DateTime? archivedAt)? changelog, required TResult orElse(), }) { if (changelog != null) { - return changelog(createdAt, updatedAt, title, id, type, tagsIds); + return changelog( + createdAt, updatedAt, title, id, type, tagsIds, archivedAt); } return orElse(); } @@ -1512,14 +1548,16 @@ class _$ProjectModelChangelogImpl extends ProjectModelChangelog { } } -abstract class ProjectModelChangelog extends ProjectModel implements Sharable { +abstract class ProjectModelChangelog extends ProjectModel + implements Sharable, Archivable { const factory ProjectModelChangelog( {required final DateTime createdAt, required final DateTime updatedAt, final LocalizedTextModel title, final ProjectModelId id, final ProjectTypes type, - final List tagsIds}) = _$ProjectModelChangelogImpl; + final List tagsIds, + final DateTime? archivedAt}) = _$ProjectModelChangelogImpl; const ProjectModelChangelog._() : super._(); factory ProjectModelChangelog.fromJson(Map json) = @@ -1537,6 +1575,8 @@ abstract class ProjectModelChangelog extends ProjectModel implements Sharable { @override List get tagsIds; @override + DateTime? get archivedAt; + @override @JsonKey(ignore: true) _$$ProjectModelChangelogImplCopyWith<_$ProjectModelChangelogImpl> get copyWith => throw _privateConstructorUsedError; diff --git a/packages/core/lib/src/data_models/data_models.g.dart b/packages/core/lib/src/data_models/data_models.g.dart index e63d2d00..beef072c 100644 --- a/packages/core/lib/src/data_models/data_models.g.dart +++ b/packages/core/lib/src/data_models/data_models.g.dart @@ -125,6 +125,9 @@ _$ProjectModelChangelogImpl _$$ProjectModelChangelogImplFromJson( ?.map((e) => ProjectTagModelId.fromJson(e as String)) .toList() ?? const [], + archivedAt: json['archivedAt'] == null + ? null + : DateTime.parse(json['archivedAt'] as String), $type: json['runtimeType'] as String?, ); @@ -137,6 +140,7 @@ Map _$$ProjectModelChangelogImplToJson( 'id': instance.id, 'type': _$ProjectTypesEnumMap[instance.type]!, 'tagsIds': instance.tagsIds, + 'archivedAt': instance.archivedAt?.toIso8601String(), 'runtimeType': instance.$type, }; diff --git a/packages/core/lib/src/data_models/project.dart b/packages/core/lib/src/data_models/project.dart index 3033f69f..0337b5d0 100644 --- a/packages/core/lib/src/data_models/project.dart +++ b/packages/core/lib/src/data_models/project.dart @@ -45,6 +45,7 @@ sealed class ProjectModel with _$ProjectModel implements Sharable, Archivable { /// keeps only position of system changelog whithout any content @Implements() + @Implements() const factory ProjectModel.changelog({ required final DateTime createdAt, required final DateTime updatedAt, @@ -52,12 +53,12 @@ sealed class ProjectModel with _$ProjectModel implements Sharable, Archivable { @Default(ProjectModelId.systemChangelog) final ProjectModelId id, @Default(ProjectTypes.systemChangelog) final ProjectTypes type, @Default([]) final List tagsIds, + final DateTime? archivedAt, }) = ProjectModelChangelog; factory ProjectModel.fromJson(final dynamic json) => _$ProjectModelFromJson(json as Map); const ProjectModel._(); - static ProjectModelChangelog getSystemChangelogFromNotifications({ - required final ProjectModelChangelog project, + factory ProjectModel.getSystemChangelogFromNotifications({ required final List notifications, }) { final newest = notifications.first; @@ -66,9 +67,7 @@ sealed class ProjectModel with _$ProjectModel implements Sharable, Archivable { return ProjectModelChangelog( createdAt: oldest.created, title: newest.title, - updatedAt: project.updatedAt.isAfter(newest.created) - ? project.updatedAt - : newest.created, + updatedAt: newest.created, ); } diff --git a/packages/core/lib/src/state/notifications_notifier.dart b/packages/core/lib/src/state/notifications_notifier.dart index 7012ab5e..5447eb53 100644 --- a/packages/core/lib/src/state/notifications_notifier.dart +++ b/packages/core/lib/src/state/notifications_notifier.dart @@ -12,19 +12,21 @@ class NotificationsNotifierState with _$NotificationsNotifierState { class NotificationsNotifier extends ValueNotifier implements Loadable { NotificationsNotifier(final BuildContext context) - : notificationRepository = context.read(), + : _notificationRepository = context.read(), + _projectsRepository = context.read(), super(const NotificationsNotifierState()); - final NotificationsRepository notificationRepository; + final NotificationsRepository _notificationRepository; + final ProjectsRepository _projectsRepository; Future readAllUpdates() async { setValue(value.copyWith(hasUnreadUpdates: false)); - await notificationRepository.setLastReadTime(); + await _notificationRepository.setLastReadTime(); } List get updates => value.updates; bool get hasUnreadUpdates => value.hasUnreadUpdates; Future determineUnreadUpdates() async { - final lastReadTime = await notificationRepository.getLastReadDateTime(); + final lastReadTime = await _notificationRepository.getLastReadDateTime(); if (lastReadTime == null) { setValue(value.copyWith(hasUnreadUpdates: true)); } else { @@ -42,8 +44,16 @@ class NotificationsNotifier extends ValueNotifier @override Future onLoad() async { final notifications = - await notificationRepository.getUpdatesNotifications(); + await _notificationRepository.getUpdatesNotifications(); await determineUnreadUpdates(); setValue(value.copyWith(updates: notifications)); + + /// always update project, to make sure, it is up to date + /// That's absolutely okay if project is not created yet + /// or it is different in projects + final project = ProjectModel.getSystemChangelogFromNotifications( + notifications: notifications, + ); + await _projectsRepository.put(project: project); } } From 01ff0566b3003ad5c381e49e2bc30137dceb78d1 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 22:57:37 +0200 Subject: [PATCH 16/20] fix: delete changelog :D --- lib/_library/widgets/core/dismissible_tile.dart | 3 +++ lib/home/widgets/project_tile.dart | 1 + 2 files changed, 4 insertions(+) diff --git a/lib/_library/widgets/core/dismissible_tile.dart b/lib/_library/widgets/core/dismissible_tile.dart index a91d13e1..99818ec7 100644 --- a/lib/_library/widgets/core/dismissible_tile.dart +++ b/lib/_library/widgets/core/dismissible_tile.dart @@ -5,9 +5,11 @@ class DismissibleTile extends StatelessWidget { required this.child, required this.dismissibleKey, required this.onDismissed, + this.canDismiss = true, // final this.confirmDismiss, super.key, }); + final bool canDismiss; final VoidCallback onDismissed; // final ConfirmDismissCallback? confirmDismiss; final Widget child; @@ -15,6 +17,7 @@ class DismissibleTile extends StatelessWidget { @override Widget build(final BuildContext context) => slidable.Slidable( key: dismissibleKey, + enabled: canDismiss, startActionPane: slidable.ActionPane( motion: const slidable.BehindMotion(), children: [ diff --git a/lib/home/widgets/project_tile.dart b/lib/home/widgets/project_tile.dart index 06858eb8..9892760c 100644 --- a/lib/home/widgets/project_tile.dart +++ b/lib/home/widgets/project_tile.dart @@ -54,6 +54,7 @@ class ProjectTile extends StatelessWidget { ); return DismissibleTile( + canDismiss: project.type != ProjectTypes.systemChangelog, dismissibleKey: ValueKey(project.id), // confirmDismiss: (final direction) async { // if (direction != DismissDirection.startToEnd) return false; From 49df3b3d98e88ffb08a2d64f8cd724a4ddc52138 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Wed, 6 Mar 2024 23:29:20 +0200 Subject: [PATCH 17/20] feat: adaptive folders --- lib/home/home_screen.dart | 39 +++++++++++++++++++++++++--------- lib/home/tags/tags_screen.dart | 6 ++++-- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/lib/home/home_screen.dart b/lib/home/home_screen.dart index cba8ec3d..bc2c995b 100644 --- a/lib/home/home_screen.dart +++ b/lib/home/home_screen.dart @@ -110,17 +110,36 @@ class TagsVerticalBar extends StatelessWidget { onPressed: () async => showAdaptiveDialog( context: context, barrierDismissible: true, - builder: (final context) => Dialog( - child: ConstrainedBox( - constraints: const BoxConstraints( - maxHeight: 600, - maxWidth: 400, - minWidth: 200, - minHeight: 150, + builder: (final context) { + final screenLayout = ScreenLayout.of(context); + return AnimatedContainer( + duration: 350.milliseconds, + padding: screenLayout.small + ? EdgeInsets.zero + : const EdgeInsets.symmetric( + horizontal: 40, + vertical: 24, + ), + child: Dialog( + insetPadding: EdgeInsets.zero, + child: ConstrainedBox( + constraints: screenLayout.small + ? const BoxConstraints() + : const BoxConstraints( + maxHeight: 600, + maxWidth: 400, + minWidth: 200, + minHeight: 150, + ), + child: AnimatedSize( + curve: Curves.easeIn, + duration: 150.milliseconds, + child: const TagsScreen(), + ), + ), ), - child: const TagsScreen(), - ), - ), + ); + }, ), icon: const Icon(Icons.edit_square), tooltip: l10n.clickToEditFolders, diff --git a/lib/home/tags/tags_screen.dart b/lib/home/tags/tags_screen.dart index e4090494..6dcee427 100644 --- a/lib/home/tags/tags_screen.dart +++ b/lib/home/tags/tags_screen.dart @@ -27,7 +27,9 @@ class TagsScreenBody extends StatelessWidget { TagsScreenType.allTags => const _TagsListView(), TagsScreenType.editingTag => const _ManageTagView(), TagsScreenType.addProjects => const _AddProjectsView(), - }; + } + .animate() + .fadeIn(); } } @@ -365,7 +367,7 @@ class _AddProjectsView extends StatelessWidget { padding: const MaterialStatePropertyAll( EdgeInsets.symmetric(horizontal: 16), ), - autoFocus: true, + autoFocus: PlatformInfo.isNativeWebDesktop, ), ], ); From 55974699cc3d95109aa9de3a779edf2201ad6207 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Thu, 7 Mar 2024 00:34:28 +0200 Subject: [PATCH 18/20] chore: firebase --- ios/Podfile.lock | 278 ------------------ ios/Runner.xcodeproj/project.pbxproj | 12 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 - packages/core/pubspec.yaml | 10 +- packages/ui_kit/pubspec.yaml | 10 +- pubspec.lock | 56 +--- 6 files changed, 32 insertions(+), 336 deletions(-) delete mode 100644 ios/Podfile.lock diff --git a/ios/Podfile.lock b/ios/Podfile.lock deleted file mode 100644 index 9c55c7d3..00000000 --- a/ios/Podfile.lock +++ /dev/null @@ -1,278 +0,0 @@ -PODS: - - connectivity_plus (0.0.1): - - Flutter - - ReachabilitySwift - - device_info_plus (0.0.1): - - Flutter - - Firebase/Analytics (10.17.0): - - Firebase/Core - - Firebase/Core (10.17.0): - - Firebase/CoreOnly - - FirebaseAnalytics (~> 10.17.0) - - Firebase/CoreOnly (10.17.0): - - FirebaseCore (= 10.17.0) - - Firebase/Crashlytics (10.17.0): - - Firebase/CoreOnly - - FirebaseCrashlytics (~> 10.17.0) - - Firebase/Messaging (10.17.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 10.17.0) - - firebase_analytics (10.7.0): - - Firebase/Analytics (= 10.17.0) - - firebase_core - - Flutter - - firebase_core (2.22.0): - - Firebase/CoreOnly (= 10.17.0) - - Flutter - - firebase_crashlytics (3.4.4): - - Firebase/Crashlytics (= 10.17.0) - - firebase_core - - Flutter - - firebase_messaging (14.7.4): - - Firebase/Messaging (= 10.17.0) - - firebase_core - - Flutter - - FirebaseAnalytics (10.17.0): - - FirebaseAnalytics/AdIdSupport (= 10.17.0) - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseAnalytics/AdIdSupport (10.17.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleAppMeasurement (= 10.17.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseCore (10.17.0): - - FirebaseCoreInternal (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreExtension (10.17.0): - - FirebaseCore (~> 10.0) - - FirebaseCoreInternal (10.17.0): - - "GoogleUtilities/NSData+zlib (~> 7.8)" - - FirebaseCrashlytics (10.17.0): - - FirebaseCore (~> 10.5) - - FirebaseInstallations (~> 10.0) - - FirebaseSessions (~> 10.5) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/Environment (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (~> 2.1) - - FirebaseInstallations (10.17.0): - - FirebaseCore (~> 10.0) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - PromisesObjC (~> 2.1) - - FirebaseMessaging (10.17.0): - - FirebaseCore (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/AppDelegateSwizzler (~> 7.8) - - GoogleUtilities/Environment (~> 7.8) - - GoogleUtilities/Reachability (~> 7.8) - - GoogleUtilities/UserDefaults (~> 7.8) - - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseSessions (10.17.0): - - FirebaseCore (~> 10.5) - - FirebaseCoreExtension (~> 10.0) - - FirebaseInstallations (~> 10.0) - - GoogleDataTransport (~> 9.2) - - GoogleUtilities/Environment (~> 7.10) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesSwift (~> 2.1) - - Flutter (1.0.0) - - flutter_keyboard_visibility (0.0.1): - - Flutter - - flutter_native_splash (0.0.1): - - Flutter - - GoogleAppMeasurement (10.17.0): - - GoogleAppMeasurement/AdIdSupport (= 10.17.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/AdIdSupport (10.17.0): - - GoogleAppMeasurement/WithoutAdIdSupport (= 10.17.0) - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleAppMeasurement/WithoutAdIdSupport (10.17.0): - - GoogleUtilities/AppDelegateSwizzler (~> 7.11) - - GoogleUtilities/MethodSwizzler (~> 7.11) - - GoogleUtilities/Network (~> 7.11) - - "GoogleUtilities/NSData+zlib (~> 7.11)" - - nanopb (< 2.30910.0, >= 2.30908.0) - - GoogleDataTransport (9.2.5): - - GoogleUtilities/Environment (~> 7.7) - - nanopb (< 2.30910.0, >= 2.30908.0) - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/AppDelegateSwizzler (7.11.6): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (7.11.6): - - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.11.6): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (7.11.6): - - GoogleUtilities/Logger - - GoogleUtilities/Network (7.11.6): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (7.11.6)" - - GoogleUtilities/Reachability (7.11.6): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (7.11.6): - - GoogleUtilities/Logger - - isar_flutter_libs (1.0.0): - - Flutter - - nanopb (2.30909.1): - - nanopb/decode (= 2.30909.1) - - nanopb/encode (= 2.30909.1) - - nanopb/decode (2.30909.1) - - nanopb/encode (2.30909.1) - - package_info_plus (0.4.5): - - Flutter - - pasteboard (0.0.1): - - Flutter - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - permission_handler_apple (9.1.1): - - Flutter - - PromisesObjC (2.3.1) - - PromisesSwift (2.3.1): - - PromisesObjC (= 2.3.1) - - ReachabilitySwift (5.0.0) - - share_plus (0.0.1): - - Flutter - - shared_preferences_foundation (0.0.1): - - Flutter - - FlutterMacOS - - url_launcher_ios (0.0.1): - - Flutter - -DEPENDENCIES: - - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) - - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) - - Flutter (from `Flutter`) - - flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`) - - flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`) - - isar_flutter_libs (from `.symlinks/plugins/isar_flutter_libs/ios`) - - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - pasteboard (from `.symlinks/plugins/pasteboard/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - - share_plus (from `.symlinks/plugins/share_plus/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - -SPEC REPOS: - trunk: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseCoreExtension - - FirebaseCoreInternal - - FirebaseCrashlytics - - FirebaseInstallations - - FirebaseMessaging - - FirebaseSessions - - GoogleAppMeasurement - - GoogleDataTransport - - GoogleUtilities - - nanopb - - PromisesObjC - - PromisesSwift - - ReachabilitySwift - -EXTERNAL SOURCES: - connectivity_plus: - :path: ".symlinks/plugins/connectivity_plus/ios" - device_info_plus: - :path: ".symlinks/plugins/device_info_plus/ios" - firebase_analytics: - :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - firebase_crashlytics: - :path: ".symlinks/plugins/firebase_crashlytics/ios" - firebase_messaging: - :path: ".symlinks/plugins/firebase_messaging/ios" - Flutter: - :path: Flutter - flutter_keyboard_visibility: - :path: ".symlinks/plugins/flutter_keyboard_visibility/ios" - flutter_native_splash: - :path: ".symlinks/plugins/flutter_native_splash/ios" - isar_flutter_libs: - :path: ".symlinks/plugins/isar_flutter_libs/ios" - package_info_plus: - :path: ".symlinks/plugins/package_info_plus/ios" - pasteboard: - :path: ".symlinks/plugins/pasteboard/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/darwin" - permission_handler_apple: - :path: ".symlinks/plugins/permission_handler_apple/ios" - share_plus: - :path: ".symlinks/plugins/share_plus/ios" - shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/darwin" - url_launcher_ios: - :path: ".symlinks/plugins/url_launcher_ios/ios" - -SPEC CHECKSUMS: - connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d - device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6 - Firebase: f4ac0b02927af9253ae094d23deecf0890da7374 - firebase_analytics: d6f520c1030d2c1215851f6e332d39a489a30bd2 - firebase_core: efc9455611b8769fa90fbdae5da182600bd6901c - firebase_crashlytics: 6a564f58db90be49c49d9ac100bc5cc3fcbf8267 - firebase_messaging: 9c697d1ecfe77edf15d995b5048906ffc994c96c - FirebaseAnalytics: b9284f9fff10157a843e0422e908711f7bf3b9f2 - FirebaseCore: 534544dd98cabcf4bf8598d88ec683b02319a528 - FirebaseCoreExtension: 47720bb330d7041047c0935a34a3a4b92f818074 - FirebaseCoreInternal: 2cf9202e226e3f78d2bf6d56c472686b935bfb7f - FirebaseCrashlytics: d78651ad7db206ef98269e103ac38d69d569200a - FirebaseInstallations: 9387bf15abfc69a714f54e54f74a251264fdb79b - FirebaseMessaging: 1367b28c0c83a63072af4a711328fcc2e6899902 - FirebaseSessions: 49f39e5c10e3f9fdd38d01b748329bae2a2fa8ed - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 - flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069 - flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef - GoogleAppMeasurement: 4dcddfc7f102825c1c4e6422cb35567b101881a7 - GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2 - GoogleUtilities: 202e7a9f5128accd11160fb9c19612de1911aa19 - isar_flutter_libs: b69f437aeab9c521821c3f376198c4371fa21073 - nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5 - package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 - pasteboard: 982969ebaa7c78af3e6cc7761e8f5e77565d9ce0 - path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 - permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 - PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - PromisesSwift: 28dca69a9c40779916ac2d6985a0192a5cb4a265 - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 - shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 - url_launcher_ios: 68d46cc9766d0c41dbdc884310529557e3cd7a86 - -PODFILE CHECKSUM: c14fdbfb9440b342d406257e9273ff4c18868c17 - -COCOAPODS: 1.13.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 6426ef0e..f8428cbe 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -380,7 +380,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -401,7 +401,7 @@ ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -465,7 +465,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -515,7 +515,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -538,7 +538,7 @@ ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -567,7 +567,7 @@ ENABLE_BITCODE = NO; INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 29000d5c..283c5ff6 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -12,7 +12,6 @@ import file_selector_macos import firebase_analytics import firebase_core import firebase_crashlytics -import firebase_messaging import in_app_purchase_storekit import isar_flutter_libs import package_info_plus @@ -31,7 +30,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FLTFirebaseAnalyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAnalyticsPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) FLTFirebaseCrashlyticsPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCrashlyticsPlugin")) - FLTFirebaseMessagingPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseMessagingPlugin")) InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin")) IsarFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "IsarFlutterLibsPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) diff --git a/packages/core/pubspec.yaml b/packages/core/pubspec.yaml index 203561db..a96a0af8 100644 --- a/packages/core/pubspec.yaml +++ b/packages/core/pubspec.yaml @@ -16,11 +16,11 @@ dependencies: file_picker: ^6.1.1 file_saver: ^0.2.9 file_selector: ^1.0.3 - firebase_analytics: ^10.8.5 - firebase_core: ^2.25.4 - firebase_core_web: ^2.11.4 - firebase_crashlytics: ^3.4.14 - firebase_messaging: ^14.7.15 + firebase_analytics: ^10.8.8 + firebase_analytics_web: ^0.5.5+20 + firebase_core: ^2.26.0 + firebase_core_web: ^2.11.5 + firebase_crashlytics: ^3.4.17 flutter: sdk: flutter flutter_animate: ^4.2.0+1 diff --git a/packages/ui_kit/pubspec.yaml b/packages/ui_kit/pubspec.yaml index 5d3abf06..c06d06b7 100644 --- a/packages/ui_kit/pubspec.yaml +++ b/packages/ui_kit/pubspec.yaml @@ -13,11 +13,11 @@ dependencies: core: path: ../core equatable: ^2.0.5 - firebase_analytics: ^10.8.5 - firebase_core: ^2.25.4 - firebase_core_web: ^2.11.4 - firebase_crashlytics: ^3.4.14 - firebase_messaging: ^14.7.15 + firebase_analytics: ^10.8.8 + firebase_analytics_web: ^0.5.5+20 + firebase_core: ^2.26.0 + firebase_core_web: ^2.11.5 + firebase_crashlytics: ^3.4.17 flutter: sdk: flutter flutter_animate: ^4.2.0+1 diff --git a/pubspec.lock b/pubspec.lock index 45452db2..cd6e6bd4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -13,10 +13,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "1a52f1afae8ab7ac4741425114713bdbba802f1ce1e0648e167ffcc6e05e96cf" + sha256: "2489c399d8b23a12704bd9e056e3df957c69ceec621f4fc8d69fa7cd5211d1f4" url: "https://pub.dev" source: hosted - version: "1.3.21" + version: "1.3.24" analyzer: dependency: "direct dev" description: @@ -507,34 +507,34 @@ packages: dependency: transitive description: name: firebase_analytics - sha256: edb9f9eaecf0e6431e5c12b7fabdb68be3e85ce51f941ccbfa6cb71327e8b535 + sha256: c7f243b336232d01f2f7913d937107bc3a147e2aefb3008dbe0a56d2cf134c3e url: "https://pub.dev" source: hosted - version: "10.8.5" + version: "10.8.8" firebase_analytics_platform_interface: dependency: transitive description: name: firebase_analytics_platform_interface - sha256: de4a54353cf58412c6da6b660a0dbad8efacb33b345c0286bc3a2edb869124d8 + sha256: "2e68d302f566f2dec15b9d5a0c710c5d4c759a041aea5b33548785c198921541" url: "https://pub.dev" source: hosted - version: "3.9.5" + version: "3.9.8" firebase_analytics_web: dependency: transitive description: name: firebase_analytics_web - sha256: "77e4c02ffd0204ccc7856221193265c807b7e056fa62855f973a7f77435b5d41" + sha256: "5975aa69c58cc1f66597fc6e769b77b7cd8e3b32c6f9df6b36a496286399b510" url: "https://pub.dev" source: hosted - version: "0.5.5+17" + version: "0.5.5+20" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "7e049e32a9d347616edb39542cf92cd53fdb4a99fb6af0a0bff327c14cd76445" + sha256: a746f861618eef57a11d8b658a2db1fa5a336fc82ba65b7763d7e2292687de2b url: "https://pub.dev" source: hosted - version: "2.25.4" + version: "2.26.0" firebase_core_platform_interface: dependency: transitive description: @@ -547,50 +547,26 @@ packages: dependency: "direct main" description: name: firebase_core_web - sha256: "57e61d6010e253b36d38191cefd6199d7849152cdcd234b61ca290cdb278a0ba" + sha256: c8e1d59385eee98de63c92f961d2a7062c5d9a65e7f45bdc7f1b0b205aab2492 url: "https://pub.dev" source: hosted - version: "2.11.4" + version: "2.11.5" firebase_crashlytics: dependency: "direct main" description: name: firebase_crashlytics - sha256: efd096e4c3d2c568e128505b6e4ce5f5d5a1629f700a4d6fee6bd25b85937dde + sha256: "1b871e88921cd3bcf8fadfed32af7adbfecaa7e6a8bf5f44a2e0c1f6310c6842" url: "https://pub.dev" source: hosted - version: "3.4.14" + version: "3.4.17" firebase_crashlytics_platform_interface: dependency: transitive description: name: firebase_crashlytics_platform_interface - sha256: "225a54d834a118be262c1f1096d407515e35b99d9b474c987abdcff7663f2b81" + sha256: f8af3f770257fc1ddd6cf1741edcf6cb440124f02e197480b05f26417d48a7b2 url: "https://pub.dev" source: hosted - version: "3.6.21" - firebase_messaging: - dependency: transitive - description: - name: firebase_messaging - sha256: "9c97b20c012542252a8853f11334efd833ddae83551fe37d27f87d885c655038" - url: "https://pub.dev" - source: hosted - version: "14.7.15" - firebase_messaging_platform_interface: - dependency: transitive - description: - name: firebase_messaging_platform_interface - sha256: d464b255e922c7915dc4b0ebc305ebad4e1f130519bee3d6e568ef2ea1613a4b - url: "https://pub.dev" - source: hosted - version: "4.5.23" - firebase_messaging_web: - dependency: transitive - description: - name: firebase_messaging_web - sha256: f3f71aeec719ec1fe2c99f75cd74d00d33f1c240cf1e402cc9d43883e84f935a - url: "https://pub.dev" - source: hosted - version: "3.6.4" + version: "3.6.24" fixnum: dependency: transitive description: From 765fe45af47c5478ec57ca8a50f2d00b21f80594 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Thu, 7 Mar 2024 00:35:01 +0200 Subject: [PATCH 19/20] chore: 3.19.5+47 --- pubspec.yaml | 2 +- snap/snapcraft.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pubspec.yaml b/pubspec.yaml index 5e98feac..076927df 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 3.19.4+46 +version: 3.19.5+47 environment: sdk: ">=3.3.0 <4.0.0" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 9d5cd596..4a1505e9 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: last-answer -version: 3.19.4+46 +version: 3.19.5+47 summary: Fast ideas brainstorming tool with quick notes description: | Do you have a cool idea and need to get it down quickly? Or do you blog / write articles on social media? From 0d1be5f347342cd9a8c459f19b473b8fd136dd88 Mon Sep 17 00:00:00 2001 From: Arenukvern Date: Thu, 7 Mar 2024 00:46:13 +0200 Subject: [PATCH 20/20] fix: release web workflow --- .github/workflows/release_web.workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release_web.workflow.yml b/.github/workflows/release_web.workflow.yml index 9e604a40..1d140d95 100644 --- a/.github/workflows/release_web.workflow.yml +++ b/.github/workflows/release_web.workflow.yml @@ -4,7 +4,7 @@ on: types: [created] push: branches: - - master-web + - release/web jobs: build: name: Build Web