diff --git a/ios/Podfile b/ios/Podfile index fdcc671..164df53 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 54be371..384c575 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,4 +1,6 @@ PODS: + - device_info_plus (0.0.1): + - Flutter - DKImagePickerController/Core (4.3.4): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource @@ -34,20 +36,27 @@ PODS: - DKImagePickerController/PhotoGallery - Flutter - Flutter (1.0.0) + - irondash_engine_context (0.0.1): + - Flutter - path_provider_foundation (0.0.1): - Flutter - FlutterMacOS - SDWebImage (5.18.3): - SDWebImage/Core (= 5.18.3) - SDWebImage/Core (5.18.3) + - super_native_extensions (0.0.1): + - Flutter - SwiftyGif (5.4.4) - url_launcher_ios (0.0.1): - Flutter DEPENDENCIES: + - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - Flutter (from `Flutter`) + - irondash_engine_context (from `.symlinks/plugins/irondash_engine_context/ios`) - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) + - super_native_extensions (from `.symlinks/plugins/super_native_extensions/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) SPEC REPOS: @@ -58,25 +67,34 @@ SPEC REPOS: - SwiftyGif EXTERNAL SOURCES: + device_info_plus: + :path: ".symlinks/plugins/device_info_plus/ios" file_picker: :path: ".symlinks/plugins/file_picker/ios" Flutter: :path: Flutter + irondash_engine_context: + :path: ".symlinks/plugins/irondash_engine_context/ios" path_provider_foundation: :path: ".symlinks/plugins/path_provider_foundation/darwin" + super_native_extensions: + :path: ".symlinks/plugins/super_native_extensions/ios" url_launcher_ios: :path: ".symlinks/plugins/url_launcher_ios/ios" SPEC CHECKSUMS: + device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: ce3938a0df3cc1ef404671531facef740d03f920 - Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + irondash_engine_context: 3458bf979b90d616ffb8ae03a150bafe2e860cc9 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 SDWebImage: 96e0c18ef14010b7485210e92fac888587ebb958 + super_native_extensions: 4916b3c627a9c7fffdc48a23a9eca0b1ac228fa7 SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f url_launcher_ios: bf5ce03e0e2088bad9cc378ea97fa0ed5b49673b -PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 +PODFILE CHECKSUM: 7be2f5f74864d463a8ad433546ed1de7e0f29aef -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.2 diff --git a/lib/main.dart b/lib/main.dart index aac0955..bbf2138 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,6 +8,7 @@ import 'config.dart'; import 'model/current_ancestors.dart'; import 'model/entry_data.dart'; import 'model/entry_filter.dart'; +import 'model/json_backend.dart'; import 'model/tag_data.dart'; import 'widgets/desktop_frame.dart'; import 'widgets/entry_list_view.dart'; @@ -16,6 +17,7 @@ import 'widgets/sidebar.dart'; const uuID = Uuid(); String platformAppSupportDir = ''; +final String hashedPwd = JsonBackend().readHashedPwd(); final entryListProvider = StateNotifierProvider>( diff --git a/lib/model/entry_data.dart b/lib/model/entry_data.dart index 7a6e21a..2342057 100644 --- a/lib/model/entry_data.dart +++ b/lib/model/entry_data.dart @@ -5,6 +5,21 @@ import '../format_utils.dart'; import '../main.dart'; import 'json_backend.dart'; +enum EntryType { standard, deprecated, archived } + +extension ToEntryType on String { + EntryType toEntryType() { + return switch (this) { + 'EntryType.standard' => EntryType.standard, + 'EntryType.deprecated' => EntryType.deprecated, + 'EntryType.archived' => EntryType.archived, + _ => throw ArgumentError( + 'String $this could not be converted to EntryType!', + ) + }; + } +} + class PeregrineEntryList extends StateNotifier> { final Ref ref; @@ -38,6 +53,7 @@ class PeregrineEntryList extends StateNotifier> { date: value.date, input: value.input, isEncrypted: value.isEncrypted, + entryType: value.entryType, tags: value.tags, mentionedContacts: value.mentionedContacts, ancestors: value.ancestors, @@ -53,6 +69,7 @@ class PeregrineEntryList extends StateNotifier> { date: DateTime.now(), input: input, isEncrypted: isAutoEncrypt, + entryType: EntryType.standard, tags: findTags(input), mentionedContacts: findContacts(input), ancestors: ancestors, @@ -67,6 +84,7 @@ class PeregrineEntry extends PretDataclass { final DateTime date; final String input; final bool isEncrypted; + final EntryType entryType; final List tags; final List mentionedContacts; final List ancestors; @@ -76,6 +94,7 @@ class PeregrineEntry extends PretDataclass { required this.date, required this.input, required this.isEncrypted, + required this.entryType, required this.tags, required this.mentionedContacts, required this.ancestors, @@ -88,6 +107,7 @@ class PeregrineEntry extends PretDataclass { 'date': date.toIso8601String(), 'input': input, 'isEncrypted': isEncrypted, + 'entryType': entryType.toString(), 'tags': tags, 'mentionedContacts': mentionedContacts, 'ancestors': ancestors, diff --git a/lib/model/json_backend.dart b/lib/model/json_backend.dart index d9ad963..d83a10d 100644 --- a/lib/model/json_backend.dart +++ b/lib/model/json_backend.dart @@ -12,12 +12,13 @@ class JsonBackend extends PretJsonManager { @override final dataFile = File(Config.logFilePath); @override - String schemaVersion = '2.1.0'; + String schemaVersion = '2.2.0'; @override Map> dropFields = {}; @override Map get freshJson => { 'schema': schemaVersion, + 'hashedPwd': '', 'tags': {}, 'entries': {}, }; @@ -30,6 +31,7 @@ class JsonBackend extends PretJsonManager { return switch (contentsMap['schema'] as String) { '2.0.0' => _parseV2_0(contentsMap), '2.1.0' => _parseV2_1(contentsMap), + '2.2.0' => _parseV2_2(contentsMap), _ => throw UnimplementedError( "Schema version ${contentsMap['schema']} invalid!") }; @@ -54,6 +56,11 @@ class JsonBackend extends PretJsonManager { return sortTags(tags); } + String readHashedPwd() { + final contentsMap = pretLoadJson(); + return contentsMap['hashedPwd']; + } + Map _parseV1(contentsMap) { final data = Map.from({ for (final value in contentsMap) @@ -61,6 +68,7 @@ class JsonBackend extends PretJsonManager { date: DateTime.parse(value['date']), input: value['input'], isEncrypted: value['encrypted'] ?? false, + entryType: EntryType.standard, tags: findTags(value['input']), mentionedContacts: findContacts(value['input']), ancestors: const [], @@ -82,6 +90,7 @@ class JsonBackend extends PretJsonManager { date: DateTime.parse(value['date']), input: value['input'], isEncrypted: value['isEncrypted'], + entryType: EntryType.standard, tags: List.from(value['tags']), mentionedContacts: List.from(value['mentionedContacts']), ancestors: const [], @@ -102,6 +111,26 @@ class JsonBackend extends PretJsonManager { date: DateTime.parse(value['date']), input: value['input'], isEncrypted: value['isEncrypted'], + entryType: EntryType.standard, + tags: List.from(value['tags']), + mentionedContacts: List.from(value['mentionedContacts']), + ancestors: List.from(value['ancestors']), + descendants: List.from(value['descendants']), + ), + ), + )); + } + + Map _parseV2_2(contentsMap) { + final entriesMap = contentsMap['entries']; + return Map.from(entriesMap.map( + (key, value) => MapEntry( + key, + PeregrineEntry( + date: DateTime.parse(value['date']), + input: value['input'], + isEncrypted: value['isEncrypted'], + entryType: (value['entryType'] as String).toEntryType(), tags: List.from(value['tags']), mentionedContacts: List.from(value['mentionedContacts']), ancestors: List.from(value['ancestors']), diff --git a/lib/widgets/peregrine_app_bar.dart b/lib/widgets/peregrine_app_bar.dart index 99f1949..b14e201 100644 --- a/lib/widgets/peregrine_app_bar.dart +++ b/lib/widgets/peregrine_app_bar.dart @@ -76,8 +76,16 @@ class PeregrineAppBar extends ConsumerWidget { shape: const RoundedRectangleBorder( borderRadius: BorderRadius.all(PretConfig.thinBorderRounding), )), - onPressed: () => - ref.read(isLocked.notifier).update((state) => !state), + onPressed: () { + if (hashedPwd.isEmpty) { + showModalBottomSheet( + context: context, + builder: (context) => const Column( + children: [Text('Set a password')], + )); + } + ref.read(isLocked.notifier).update((state) => !state); + }, icon: Icon( ref.watch(isLocked) ? Icons.lock : Icons.lock_open_rounded, color: Theme.of(context).colorScheme.surface,