mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-26 08:36:50 +08:00
Log every feature and how we reach the purchase page
We now have a list of all the features that are implemented, and we can use that to show a kind of feature list which can be used to - 1. Move away from app rental model 2. Showcase a feature list; see WorkingCopy
This commit is contained in:
@ -180,7 +180,7 @@ features:
|
||||
noteMetaDataCustomize:
|
||||
title: Customize Note Metadata
|
||||
subtitle: Allows GitJorunal to be used with static website generators
|
||||
autoMergeConflict: Automation Merge Conflict Resolution
|
||||
autoMergeConflicts: Automation Merge Conflict Resolution
|
||||
noteSorting: Configurable Note Sorting
|
||||
gitPushFreq: Configurable Git Sync Frequency
|
||||
checklistEditor: Checklist Editor
|
||||
@ -194,3 +194,9 @@ features:
|
||||
txtFiles: Txt File Support
|
||||
wikiLinks: Wiki Style Links Support
|
||||
metaDataTitle: Customize Title MetaData
|
||||
journalEditorDefaultFolder: Customize Default Folder for Journal Editor
|
||||
yamlModifiedKey: Customize the YAML modified key
|
||||
yamlCreatedKey: Customize the YAML created key
|
||||
yamlTagsKey: Customize the YAML tags key
|
||||
disableYamlHeader: Disable YAML Metadata Header
|
||||
customizeHomeScreen: Customize Home Screen
|
||||
|
@ -12,6 +12,7 @@ import 'package:share/share.dart';
|
||||
import 'package:gitjournal/core/note.dart';
|
||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||
import 'package:gitjournal/error_reporting.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/widgets/pro_overlay.dart';
|
||||
|
||||
export 'package:gitjournal/editors/scaffold.dart';
|
||||
@ -250,6 +251,7 @@ Widget _buildBottomMenuSheet(
|
||||
},
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.tags,
|
||||
child: ListTile(
|
||||
leading: const FaIcon(FontAwesomeIcons.tag),
|
||||
title: Text(tr('editors.common.tags')),
|
||||
@ -272,6 +274,7 @@ Widget _buildBottomMenuSheet(
|
||||
},
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.zenMode,
|
||||
child: ListTile(
|
||||
leading: const FaIcon(FontAwesomeIcons.peace),
|
||||
title: Text(tr(zenModeEnabled
|
||||
|
@ -4,40 +4,249 @@ class Features {
|
||||
static bool perFolderConfig = false;
|
||||
|
||||
static final all = <Feature>[
|
||||
Feature(DateTime(2019, 09, 25), tr("feature.darkMode"), "", false),
|
||||
Feature(DateTime(2019, 10, 07), tr("feature.rawEditor"), "", false),
|
||||
Feature(DateTime(2019, 12, 04), tr("feature.folderSupport"), "", false),
|
||||
Feature(DateTime(2019, 12, 20), tr("feature.fileNameCustomize"), "", false),
|
||||
Feature(
|
||||
DateTime(2019, 12, 20),
|
||||
tr("feature.noteMetaDataCustomize.title"),
|
||||
tr("feature.noteMetaDataCustomize.subtitle"),
|
||||
true,
|
||||
),
|
||||
Feature(DateTime(2019, 12, 28), tr("feature.autoMergeConflict"), "", false),
|
||||
Feature(DateTime(2020, 02, 09), tr("feature.noteSorting"), "", false),
|
||||
Feature(DateTime(2020, 02, 09), tr("feature.noteSorting"), "", false),
|
||||
Feature(DateTime(2020, 02, 09), tr("feature.gitPushFreq"), "", false),
|
||||
Feature(DateTime(2020, 02, 15), tr("feature.checklistEditor"), "", false),
|
||||
Feature(DateTime(2020, 03, 01), tr("feature.journalEditor"), "", false),
|
||||
Feature(DateTime(2020, 04, 01), tr("feature.diffViews"), "", false),
|
||||
Feature(DateTime(2020, 05, 08), tr("feature.imageSupport"), "", false),
|
||||
Feature(DateTime(2020, 05, 14), tr("feature.tags"), "", true),
|
||||
Feature(DateTime(2020, 05, 14), tr("feature.appShortcuts"), "", false),
|
||||
Feature(DateTime(2020, 05, 18), tr("feature.createRepo"), "", false),
|
||||
Feature(DateTime(2020, 05, 27), tr("feature.backlinks"), "", true),
|
||||
Feature(DateTime(2020, 06, 03), tr("feature.txtFiles"), "", false),
|
||||
Feature(DateTime(2020, 07, 09), tr("feature.wikiLinks"), "", false),
|
||||
Feature(DateTime(2020, 07, 28), tr("feature.zenMode"), "", true),
|
||||
Feature(DateTime(2020, 07, 30), tr("feature.metaDataTitle"), "", true),
|
||||
Feature.darkMode,
|
||||
Feature.rawEditor,
|
||||
Feature.folderSupport,
|
||||
Feature.fileNameCustomize,
|
||||
Feature.noteMetaDataCustomize,
|
||||
Feature.autoMergeConflicts,
|
||||
Feature.yamlModifiedKey,
|
||||
Feature.noteSorting,
|
||||
Feature.gitPushFreq,
|
||||
Feature.checkListEditor,
|
||||
Feature.disableYamlHeader,
|
||||
Feature.journalEditor,
|
||||
Feature.diffViews,
|
||||
Feature.journalEditorDefaultFolder,
|
||||
Feature.customizeHomeScreen,
|
||||
Feature.imageSupport,
|
||||
Feature.tags,
|
||||
Feature.appShortcuts,
|
||||
Feature.createRepo,
|
||||
Feature.backlinks,
|
||||
Feature.txtFiles,
|
||||
Feature.wikiLinks,
|
||||
Feature.zenMode,
|
||||
Feature.metaDataTitle,
|
||||
Feature.yamlCreatedKey,
|
||||
Feature.yamlTagsKey,
|
||||
];
|
||||
}
|
||||
|
||||
class Feature {
|
||||
final String featureName;
|
||||
final DateTime date;
|
||||
final String title;
|
||||
final String subtitle;
|
||||
final bool pro;
|
||||
|
||||
Feature(this.date, this.title, this.subtitle, this.pro);
|
||||
Feature(this.featureName, this.date, this.title, this.subtitle, this.pro);
|
||||
|
||||
static final darkMode = Feature(
|
||||
"DarkMode",
|
||||
DateTime(2019, 09, 25),
|
||||
tr("feature.darkMode"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final rawEditor = Feature(
|
||||
"RawEditor",
|
||||
DateTime(2019, 10, 07),
|
||||
tr("feature.rawEditor"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final folderSupport = Feature(
|
||||
"FolderSupport",
|
||||
DateTime(2019, 12, 04),
|
||||
tr("feature.folderSupport"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final fileNameCustomize = Feature(
|
||||
"FileNameCustomize",
|
||||
DateTime(2019, 12, 20),
|
||||
tr("feature.fileNameCustomize"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final noteMetaDataCustomize = Feature(
|
||||
"NoteMetaDataCustomize",
|
||||
DateTime(2019, 12, 20),
|
||||
tr("feature.noteMetaDataCustomize.title"),
|
||||
tr("feature.noteMetaDataCustomize.subtitle"),
|
||||
true,
|
||||
);
|
||||
|
||||
static final autoMergeConflicts = Feature(
|
||||
"AutoMergeConflicts",
|
||||
DateTime(2019, 12, 28),
|
||||
tr("feature.autoMergeConflicts"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final yamlModifiedKey = Feature(
|
||||
"YamlModifiedKey",
|
||||
DateTime(2020, 01, 05),
|
||||
tr("feature.yamlModifiedKey"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final noteSorting = Feature(
|
||||
"NoteSorting",
|
||||
DateTime(2020, 02, 09),
|
||||
tr("feature.noteSorting"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final gitPushFreq = Feature(
|
||||
"GitPushFreq",
|
||||
DateTime(2020, 02, 09),
|
||||
tr("feature.gitPushFreq"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final checkListEditor = Feature(
|
||||
"CheckListEditor",
|
||||
DateTime(2020, 02, 15),
|
||||
tr("feature.checklistEditor"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final disableYamlHeader = Feature(
|
||||
"DisableYamlHeader",
|
||||
DateTime(2020, 02, 18),
|
||||
tr("feature.disableYamlHeader"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final journalEditor = Feature(
|
||||
"JournalEditor",
|
||||
DateTime(2020, 03, 01),
|
||||
tr("feature.journalEditor"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final diffViews = Feature(
|
||||
"DiffViews",
|
||||
DateTime(2020, 04, 01),
|
||||
tr("feature.diffViews"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final journalEditorDefaultFolder = Feature(
|
||||
"JournalEditorDefaultFolder",
|
||||
DateTime(2020, 04, 01),
|
||||
tr("feature.journalEditorDefaultFolder"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final customizeHomeScreen = Feature(
|
||||
"CustomizeHomeScreen",
|
||||
DateTime(2020, 05, 06),
|
||||
tr("feature.customizeHomeScreen"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final imageSupport = Feature(
|
||||
"ImageSupport",
|
||||
DateTime(2020, 05, 08),
|
||||
tr("feature.imageSupport"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final tags = Feature(
|
||||
"Tags",
|
||||
DateTime(2020, 05, 14),
|
||||
tr("feature.tags"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final appShortcuts = Feature(
|
||||
"AppShortcuts",
|
||||
DateTime(2020, 05, 14),
|
||||
tr("feature.appShortcuts"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final createRepo = Feature(
|
||||
"CreateRepo",
|
||||
DateTime(2020, 05, 18),
|
||||
tr("feature.createRepo"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final backlinks = Feature(
|
||||
"Backlinks",
|
||||
DateTime(2020, 05, 27),
|
||||
tr("feature.backlinks"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final txtFiles = Feature(
|
||||
"TxtFiles",
|
||||
DateTime(2020, 06, 03),
|
||||
tr("feature.txtFiles"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final wikiLinks = Feature(
|
||||
"WikiLinks",
|
||||
DateTime(2020, 07, 09),
|
||||
tr("feature.wikiLinks"),
|
||||
"",
|
||||
false,
|
||||
);
|
||||
|
||||
static final zenMode = Feature(
|
||||
"ZenMode",
|
||||
DateTime(2020, 07, 28),
|
||||
tr("feature.zenMode"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final metaDataTitle = Feature(
|
||||
"MetaDataTitle",
|
||||
DateTime(2020, 07, 30),
|
||||
tr("feature.metaDataTitle"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final yamlCreatedKey = Feature(
|
||||
"YamlCreatedKey",
|
||||
DateTime(2020, 08, 02),
|
||||
tr("feature.yamlCreatedKey"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
|
||||
static final yamlTagsKey = Feature(
|
||||
"yamlTagsKey",
|
||||
DateTime(2020, 08, 06),
|
||||
tr("feature.yamlTagsKey"),
|
||||
"",
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/screens/settings_screen.dart';
|
||||
import 'package:gitjournal/screens/settings_widgets.dart';
|
||||
import 'package:gitjournal/settings.dart';
|
||||
@ -63,6 +64,7 @@ class SettingsEditorsScreenState extends State<SettingsEditorsScreen> {
|
||||
),
|
||||
SettingsHeader(tr("settings.editors.journalEditor")),
|
||||
ProOverlay(
|
||||
feature: Feature.journalEditorDefaultFolder,
|
||||
child: ListTile(
|
||||
title: Text(tr("settings.editors.defaultFolder")),
|
||||
subtitle: Text(defaultNewFolder),
|
||||
|
@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/screens/settings_widgets.dart';
|
||||
import 'package:gitjournal/settings.dart';
|
||||
import 'package:gitjournal/widgets/folder_selection_dialog.dart';
|
||||
@ -74,7 +75,7 @@ class SettingsImagesScreenState extends State<SettingsImagesScreen> {
|
||||
},
|
||||
),
|
||||
),
|
||||
body: ProOverlay(child: body),
|
||||
body: ProOverlay(feature: Feature.imageSupport, child: body),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -9,6 +9,7 @@ import 'package:gitjournal/core/note.dart';
|
||||
import 'package:gitjournal/core/note_serializer.dart';
|
||||
import 'package:gitjournal/editors/note_body_editor.dart';
|
||||
import 'package:gitjournal/editors/note_title_editor.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/screens/settings_widgets.dart';
|
||||
import 'package:gitjournal/settings.dart';
|
||||
import 'package:gitjournal/widgets/pro_overlay.dart';
|
||||
@ -65,6 +66,7 @@ class _NoteMetadataSettingsScreenState
|
||||
},
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.yamlModifiedKey,
|
||||
child: ListPreference(
|
||||
title: tr("settings.noteMetaData.modified"),
|
||||
options: [
|
||||
@ -84,6 +86,7 @@ class _NoteMetadataSettingsScreenState
|
||||
),
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.yamlCreatedKey,
|
||||
child: ListPreference(
|
||||
title: tr("settings.noteMetaData.created"),
|
||||
options: [
|
||||
@ -101,6 +104,7 @@ class _NoteMetadataSettingsScreenState
|
||||
),
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.yamlTagsKey,
|
||||
child: ListPreference(
|
||||
title: tr("settings.noteMetaData.tags"),
|
||||
options: [
|
||||
@ -118,6 +122,7 @@ class _NoteMetadataSettingsScreenState
|
||||
),
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.metaDataTitle,
|
||||
child: ListPreference(
|
||||
title: tr("settings.noteMetaData.titleMetaData.title"),
|
||||
options: [
|
||||
|
@ -6,6 +6,7 @@ import 'package:provider/provider.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
|
||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/screens/debug_screen.dart';
|
||||
import 'package:gitjournal/screens/settings_editors.dart';
|
||||
import 'package:gitjournal/screens/settings_experimental.dart';
|
||||
@ -157,6 +158,7 @@ class SettingsListState extends State<SettingsList> {
|
||||
},
|
||||
),
|
||||
ProOverlay(
|
||||
feature: Feature.customizeHomeScreen,
|
||||
child: ListPreference(
|
||||
title: tr('settings.display.homeScreen'),
|
||||
currentOption: settings.homeScreen.toPublicString(),
|
||||
|
@ -10,6 +10,7 @@ import 'package:gitjournal/core/flattened_notes_folder.dart';
|
||||
import 'package:gitjournal/core/note.dart';
|
||||
import 'package:gitjournal/core/note_serializer.dart';
|
||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/screens/folder_view.dart';
|
||||
import 'package:gitjournal/widgets/app_bar_menu_button.dart';
|
||||
import 'package:gitjournal/widgets/app_drawer.dart';
|
||||
@ -33,7 +34,12 @@ class TagListingScreen extends StatelessWidget {
|
||||
title: Text(tr('screens.tags.title')),
|
||||
leading: GJAppBarMenuButton(),
|
||||
),
|
||||
body: Scrollbar(child: ProOverlay(child: listView)),
|
||||
body: Scrollbar(
|
||||
child: ProOverlay(
|
||||
feature: Feature.tags,
|
||||
child: listView,
|
||||
),
|
||||
),
|
||||
drawer: AppDrawer(),
|
||||
);
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import 'package:path/path.dart' as p;
|
||||
import 'package:gitjournal/core/link.dart';
|
||||
import 'package:gitjournal/core/note.dart';
|
||||
import 'package:gitjournal/core/notes_folder_fs.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/folder_views/common.dart';
|
||||
import 'package:gitjournal/utils/logger.dart';
|
||||
import 'package:gitjournal/widgets/pro_overlay.dart';
|
||||
@ -108,7 +109,7 @@ class _NoteBacklinkRendererState extends State<NoteBacklinkRenderer> {
|
||||
child: c,
|
||||
),
|
||||
);
|
||||
return ProOverlay(child: child);
|
||||
return ProOverlay(feature: Feature.backlinks, child: child);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,12 +3,15 @@ import 'package:flutter/material.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import 'package:gitjournal/analytics.dart';
|
||||
import 'package:gitjournal/features.dart';
|
||||
import 'package:gitjournal/settings.dart';
|
||||
|
||||
class ProOverlay extends StatelessWidget {
|
||||
final Widget child;
|
||||
final Feature feature;
|
||||
|
||||
ProOverlay({@required this.child});
|
||||
ProOverlay({@required this.child, @required this.feature});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -27,6 +30,11 @@ class ProOverlay extends StatelessWidget {
|
||||
),
|
||||
onTap: () {
|
||||
Navigator.pushNamed(context, "/purchase");
|
||||
|
||||
logEvent(
|
||||
Event.PurchaseScreenOpen,
|
||||
parameters: {"from": feature.featureName},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
Reference in New Issue
Block a user