From b89cffeb18be30ab1b950d9f276be5195adc217b Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Wed, 25 Jun 2025 00:01:52 +0800 Subject: [PATCH] :lipstick: Optimized drafts --- lib/database/draft.dart | 4 +- lib/database/drift_db.g.dart | 80 +++++++++++++------------- lib/models/file.dart | 3 + lib/models/file.freezed.dart | 16 ++++-- lib/models/file.g.dart | 19 ++++++ lib/screens/posts/compose.dart | 24 +------- lib/screens/posts/compose_article.dart | 40 +------------ lib/services/compose_storage_db.dart | 71 +++++++++++++++++------ lib/services/compose_storage_db.g.dart | 2 +- lib/widgets/post/compose_shared.dart | 42 +------------- lib/widgets/post/draft_manager.dart | 16 +++--- 11 files changed, 148 insertions(+), 169 deletions(-) diff --git a/lib/database/draft.dart b/lib/database/draft.dart index 076397a..95cfa52 100644 --- a/lib/database/draft.dart +++ b/lib/database/draft.dart @@ -6,7 +6,7 @@ class ComposeDrafts extends Table { TextColumn get description => text().withDefault(const Constant(''))(); TextColumn get content => text().withDefault(const Constant(''))(); TextColumn get attachmentIds => text().withDefault(const Constant('[]'))(); // JSON array as string - TextColumn get visibility => text().withDefault(const Constant('public'))(); + IntColumn get visibility => integer().withDefault(const Constant(0))(); // 0=public, 1=unlisted, 2=friends, 3=selected, 4=private DateTimeColumn get lastModified => dateTime()(); @override @@ -18,7 +18,7 @@ class ArticleDrafts extends Table { TextColumn get title => text().withDefault(const Constant(''))(); TextColumn get description => text().withDefault(const Constant(''))(); TextColumn get content => text().withDefault(const Constant(''))(); - TextColumn get visibility => text().withDefault(const Constant('public'))(); + IntColumn get visibility => integer().withDefault(const Constant(0))(); // 0=public, 1=unlisted, 2=friends, 3=private DateTimeColumn get lastModified => dateTime()(); @override diff --git a/lib/database/drift_db.g.dart b/lib/database/drift_db.g.dart index 3cdabf1..4403baa 100644 --- a/lib/database/drift_db.g.dart +++ b/lib/database/drift_db.g.dart @@ -634,13 +634,13 @@ class $ComposeDraftsTable extends ComposeDrafts 'visibility', ); @override - late final GeneratedColumn visibility = GeneratedColumn( + late final GeneratedColumn visibility = GeneratedColumn( 'visibility', aliasedName, false, - type: DriftSqlType.string, + type: DriftSqlType.int, requiredDuringInsert: false, - defaultValue: const Constant('public'), + defaultValue: const Constant(0), ); static const VerificationMeta _lastModifiedMeta = const VerificationMeta( 'lastModified', @@ -763,7 +763,7 @@ class $ComposeDraftsTable extends ComposeDrafts )!, visibility: attachedDatabase.typeMapping.read( - DriftSqlType.string, + DriftSqlType.int, data['${effectivePrefix}visibility'], )!, lastModified: @@ -786,7 +786,7 @@ class ComposeDraft extends DataClass implements Insertable { final String description; final String content; final String attachmentIds; - final String visibility; + final int visibility; final DateTime lastModified; const ComposeDraft({ required this.id, @@ -805,7 +805,7 @@ class ComposeDraft extends DataClass implements Insertable { map['description'] = Variable(description); map['content'] = Variable(content); map['attachment_ids'] = Variable(attachmentIds); - map['visibility'] = Variable(visibility); + map['visibility'] = Variable(visibility); map['last_modified'] = Variable(lastModified); return map; } @@ -833,7 +833,7 @@ class ComposeDraft extends DataClass implements Insertable { description: serializer.fromJson(json['description']), content: serializer.fromJson(json['content']), attachmentIds: serializer.fromJson(json['attachmentIds']), - visibility: serializer.fromJson(json['visibility']), + visibility: serializer.fromJson(json['visibility']), lastModified: serializer.fromJson(json['lastModified']), ); } @@ -846,7 +846,7 @@ class ComposeDraft extends DataClass implements Insertable { 'description': serializer.toJson(description), 'content': serializer.toJson(content), 'attachmentIds': serializer.toJson(attachmentIds), - 'visibility': serializer.toJson(visibility), + 'visibility': serializer.toJson(visibility), 'lastModified': serializer.toJson(lastModified), }; } @@ -857,7 +857,7 @@ class ComposeDraft extends DataClass implements Insertable { String? description, String? content, String? attachmentIds, - String? visibility, + int? visibility, DateTime? lastModified, }) => ComposeDraft( id: id ?? this.id, @@ -931,7 +931,7 @@ class ComposeDraftsCompanion extends UpdateCompanion { final Value description; final Value content; final Value attachmentIds; - final Value visibility; + final Value visibility; final Value lastModified; final Value rowid; const ComposeDraftsCompanion({ @@ -961,7 +961,7 @@ class ComposeDraftsCompanion extends UpdateCompanion { Expression? description, Expression? content, Expression? attachmentIds, - Expression? visibility, + Expression? visibility, Expression? lastModified, Expression? rowid, }) { @@ -983,7 +983,7 @@ class ComposeDraftsCompanion extends UpdateCompanion { Value? description, Value? content, Value? attachmentIds, - Value? visibility, + Value? visibility, Value? lastModified, Value? rowid, }) { @@ -1018,7 +1018,7 @@ class ComposeDraftsCompanion extends UpdateCompanion { map['attachment_ids'] = Variable(attachmentIds.value); } if (visibility.present) { - map['visibility'] = Variable(visibility.value); + map['visibility'] = Variable(visibility.value); } if (lastModified.present) { map['last_modified'] = Variable(lastModified.value); @@ -1098,13 +1098,13 @@ class $ArticleDraftsTable extends ArticleDrafts 'visibility', ); @override - late final GeneratedColumn visibility = GeneratedColumn( + late final GeneratedColumn visibility = GeneratedColumn( 'visibility', aliasedName, false, - type: DriftSqlType.string, + type: DriftSqlType.int, requiredDuringInsert: false, - defaultValue: const Constant('public'), + defaultValue: const Constant(0), ); static const VerificationMeta _lastModifiedMeta = const VerificationMeta( 'lastModified', @@ -1212,7 +1212,7 @@ class $ArticleDraftsTable extends ArticleDrafts )!, visibility: attachedDatabase.typeMapping.read( - DriftSqlType.string, + DriftSqlType.int, data['${effectivePrefix}visibility'], )!, lastModified: @@ -1234,7 +1234,7 @@ class ArticleDraft extends DataClass implements Insertable { final String title; final String description; final String content; - final String visibility; + final int visibility; final DateTime lastModified; const ArticleDraft({ required this.id, @@ -1251,7 +1251,7 @@ class ArticleDraft extends DataClass implements Insertable { map['title'] = Variable(title); map['description'] = Variable(description); map['content'] = Variable(content); - map['visibility'] = Variable(visibility); + map['visibility'] = Variable(visibility); map['last_modified'] = Variable(lastModified); return map; } @@ -1277,7 +1277,7 @@ class ArticleDraft extends DataClass implements Insertable { title: serializer.fromJson(json['title']), description: serializer.fromJson(json['description']), content: serializer.fromJson(json['content']), - visibility: serializer.fromJson(json['visibility']), + visibility: serializer.fromJson(json['visibility']), lastModified: serializer.fromJson(json['lastModified']), ); } @@ -1289,7 +1289,7 @@ class ArticleDraft extends DataClass implements Insertable { 'title': serializer.toJson(title), 'description': serializer.toJson(description), 'content': serializer.toJson(content), - 'visibility': serializer.toJson(visibility), + 'visibility': serializer.toJson(visibility), 'lastModified': serializer.toJson(lastModified), }; } @@ -1299,7 +1299,7 @@ class ArticleDraft extends DataClass implements Insertable { String? title, String? description, String? content, - String? visibility, + int? visibility, DateTime? lastModified, }) => ArticleDraft( id: id ?? this.id, @@ -1358,7 +1358,7 @@ class ArticleDraftsCompanion extends UpdateCompanion { final Value title; final Value description; final Value content; - final Value visibility; + final Value visibility; final Value lastModified; final Value rowid; const ArticleDraftsCompanion({ @@ -1385,7 +1385,7 @@ class ArticleDraftsCompanion extends UpdateCompanion { Expression? title, Expression? description, Expression? content, - Expression? visibility, + Expression? visibility, Expression? lastModified, Expression? rowid, }) { @@ -1405,7 +1405,7 @@ class ArticleDraftsCompanion extends UpdateCompanion { Value? title, Value? description, Value? content, - Value? visibility, + Value? visibility, Value? lastModified, Value? rowid, }) { @@ -1436,7 +1436,7 @@ class ArticleDraftsCompanion extends UpdateCompanion { map['content'] = Variable(content.value); } if (visibility.present) { - map['visibility'] = Variable(visibility.value); + map['visibility'] = Variable(visibility.value); } if (lastModified.present) { map['last_modified'] = Variable(lastModified.value); @@ -1771,7 +1771,7 @@ typedef $$ComposeDraftsTableCreateCompanionBuilder = Value description, Value content, Value attachmentIds, - Value visibility, + Value visibility, required DateTime lastModified, Value rowid, }); @@ -1782,7 +1782,7 @@ typedef $$ComposeDraftsTableUpdateCompanionBuilder = Value description, Value content, Value attachmentIds, - Value visibility, + Value visibility, Value lastModified, Value rowid, }); @@ -1821,7 +1821,7 @@ class $$ComposeDraftsTableFilterComposer builder: (column) => ColumnFilters(column), ); - ColumnFilters get visibility => $composableBuilder( + ColumnFilters get visibility => $composableBuilder( column: $table.visibility, builder: (column) => ColumnFilters(column), ); @@ -1866,7 +1866,7 @@ class $$ComposeDraftsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get visibility => $composableBuilder( + ColumnOrderings get visibility => $composableBuilder( column: $table.visibility, builder: (column) => ColumnOrderings(column), ); @@ -1905,7 +1905,7 @@ class $$ComposeDraftsTableAnnotationComposer builder: (column) => column, ); - GeneratedColumn get visibility => $composableBuilder( + GeneratedColumn get visibility => $composableBuilder( column: $table.visibility, builder: (column) => column, ); @@ -1956,7 +1956,7 @@ class $$ComposeDraftsTableTableManager Value description = const Value.absent(), Value content = const Value.absent(), Value attachmentIds = const Value.absent(), - Value visibility = const Value.absent(), + Value visibility = const Value.absent(), Value lastModified = const Value.absent(), Value rowid = const Value.absent(), }) => ComposeDraftsCompanion( @@ -1976,7 +1976,7 @@ class $$ComposeDraftsTableTableManager Value description = const Value.absent(), Value content = const Value.absent(), Value attachmentIds = const Value.absent(), - Value visibility = const Value.absent(), + Value visibility = const Value.absent(), required DateTime lastModified, Value rowid = const Value.absent(), }) => ComposeDraftsCompanion.insert( @@ -2027,7 +2027,7 @@ typedef $$ArticleDraftsTableCreateCompanionBuilder = Value title, Value description, Value content, - Value visibility, + Value visibility, required DateTime lastModified, Value rowid, }); @@ -2037,7 +2037,7 @@ typedef $$ArticleDraftsTableUpdateCompanionBuilder = Value title, Value description, Value content, - Value visibility, + Value visibility, Value lastModified, Value rowid, }); @@ -2071,7 +2071,7 @@ class $$ArticleDraftsTableFilterComposer builder: (column) => ColumnFilters(column), ); - ColumnFilters get visibility => $composableBuilder( + ColumnFilters get visibility => $composableBuilder( column: $table.visibility, builder: (column) => ColumnFilters(column), ); @@ -2111,7 +2111,7 @@ class $$ArticleDraftsTableOrderingComposer builder: (column) => ColumnOrderings(column), ); - ColumnOrderings get visibility => $composableBuilder( + ColumnOrderings get visibility => $composableBuilder( column: $table.visibility, builder: (column) => ColumnOrderings(column), ); @@ -2145,7 +2145,7 @@ class $$ArticleDraftsTableAnnotationComposer GeneratedColumn get content => $composableBuilder(column: $table.content, builder: (column) => column); - GeneratedColumn get visibility => $composableBuilder( + GeneratedColumn get visibility => $composableBuilder( column: $table.visibility, builder: (column) => column, ); @@ -2195,7 +2195,7 @@ class $$ArticleDraftsTableTableManager Value title = const Value.absent(), Value description = const Value.absent(), Value content = const Value.absent(), - Value visibility = const Value.absent(), + Value visibility = const Value.absent(), Value lastModified = const Value.absent(), Value rowid = const Value.absent(), }) => ArticleDraftsCompanion( @@ -2213,7 +2213,7 @@ class $$ArticleDraftsTableTableManager Value title = const Value.absent(), Value description = const Value.absent(), Value content = const Value.absent(), - Value visibility = const Value.absent(), + Value visibility = const Value.absent(), required DateTime lastModified, Value rowid = const Value.absent(), }) => ArticleDraftsCompanion.insert( diff --git a/lib/models/file.dart b/lib/models/file.dart index 48cc1f0..8a6a7b7 100644 --- a/lib/models/file.dart +++ b/lib/models/file.dart @@ -14,6 +14,9 @@ sealed class UniversalFile with _$UniversalFile { required UniversalFileType type, }) = _UniversalFile; + factory UniversalFile.fromJson(Map json) => + _$UniversalFileFromJson(json); + bool get isOnCloud => data is SnCloudFile; bool get isOnDevice => !isOnCloud; diff --git a/lib/models/file.freezed.dart b/lib/models/file.freezed.dart index 8b37e32..4dcb7ad 100644 --- a/lib/models/file.freezed.dart +++ b/lib/models/file.freezed.dart @@ -12,6 +12,7 @@ part of 'file.dart'; // dart format off T _$identity(T value) => value; + /// @nodoc mixin _$UniversalFile { @@ -22,6 +23,8 @@ mixin _$UniversalFile { @pragma('vm:prefer-inline') $UniversalFileCopyWith get copyWith => _$UniversalFileCopyWithImpl(this as UniversalFile, _$identity); + /// Serializes this UniversalFile to a JSON map. + Map toJson(); @override @@ -29,7 +32,7 @@ bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType&&other is UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)); } - +@JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type); @@ -75,11 +78,11 @@ as UniversalFileType, /// @nodoc - +@JsonSerializable() class _UniversalFile extends UniversalFile { const _UniversalFile({required this.data, required this.type}): super._(); - + factory _UniversalFile.fromJson(Map json) => _$UniversalFileFromJson(json); @override final dynamic data; @override final UniversalFileType type; @@ -90,14 +93,17 @@ class _UniversalFile extends UniversalFile { @pragma('vm:prefer-inline') _$UniversalFileCopyWith<_UniversalFile> get copyWith => __$UniversalFileCopyWithImpl<_UniversalFile>(this, _$identity); - +@override +Map toJson() { + return _$UniversalFileToJson(this, ); +} @override bool operator ==(Object other) { return identical(this, other) || (other.runtimeType == runtimeType&&other is _UniversalFile&&const DeepCollectionEquality().equals(other.data, data)&&(identical(other.type, type) || other.type == type)); } - +@JsonKey(includeFromJson: false, includeToJson: false) @override int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(data),type); diff --git a/lib/models/file.g.dart b/lib/models/file.g.dart index 4a1a6a6..d006853 100644 --- a/lib/models/file.g.dart +++ b/lib/models/file.g.dart @@ -6,6 +6,25 @@ part of 'file.dart'; // JsonSerializableGenerator // ************************************************************************** +_UniversalFile _$UniversalFileFromJson(Map json) => + _UniversalFile( + data: json['data'], + type: $enumDecode(_$UniversalFileTypeEnumMap, json['type']), + ); + +Map _$UniversalFileToJson(_UniversalFile instance) => + { + 'data': instance.data, + 'type': _$UniversalFileTypeEnumMap[instance.type]!, + }; + +const _$UniversalFileTypeEnumMap = { + UniversalFileType.image: 'image', + UniversalFileType.video: 'video', + UniversalFileType.audio: 'audio', + UniversalFileType.file: 'file', +}; + _SnCloudFile _$SnCloudFileFromJson(Map json) => _SnCloudFile( id: json['id'] as String, name: json['name'] as String, diff --git a/lib/screens/posts/compose.dart b/lib/screens/posts/compose.dart index 2d262e9..60b057a 100644 --- a/lib/screens/posts/compose.dart +++ b/lib/screens/posts/compose.dart @@ -62,21 +62,7 @@ class PostComposeScreen extends HookConsumerWidget { @QueryParam('type') this.type, }); - // Helper method to parse visibility - int _parseVisibility(String visibility) { - switch (visibility) { - case 'public': - return 0; - case 'unlisted': - return 1; - case 'friends': - return 2; - case 'private': - return 3; - default: - return 0; - } - } + @override Widget build(BuildContext context, WidgetRef ref) { @@ -140,9 +126,7 @@ class PostComposeScreen extends HookConsumerWidget { state.titleController.text = mostRecentDraft.title; state.descriptionController.text = mostRecentDraft.description; state.contentController.text = mostRecentDraft.content; - state.visibility.value = _parseVisibility( - mostRecentDraft.visibility, - ); + state.visibility.value = mostRecentDraft.visibility; } } } @@ -272,9 +256,7 @@ class PostComposeScreen extends HookConsumerWidget { state.descriptionController.text = draft.description; state.contentController.text = draft.content; - state.visibility.value = _parseVisibility( - draft.visibility, - ); + state.visibility.value = draft.visibility; } }, ), diff --git a/lib/screens/posts/compose_article.dart b/lib/screens/posts/compose_article.dart index 7ea492b..560a257 100644 --- a/lib/screens/posts/compose_article.dart +++ b/lib/screens/posts/compose_article.dart @@ -111,9 +111,7 @@ class ArticleComposeScreen extends HookConsumerWidget { state.titleController.text = mostRecentDraft.title; state.descriptionController.text = mostRecentDraft.description; state.contentController.text = mostRecentDraft.content; - state.visibility.value = _parseArticleVisibility( - mostRecentDraft.visibility, - ); + state.visibility.value = mostRecentDraft.visibility; } } } @@ -396,9 +394,7 @@ class ArticleComposeScreen extends HookConsumerWidget { state.descriptionController.text = draft.description; state.contentController.text = draft.content; - state.visibility.value = _parseArticleVisibility( - draft.visibility, - ); + state.visibility.value = draft.visibility; } }, ), @@ -548,7 +544,7 @@ class ArticleComposeScreen extends HookConsumerWidget { title: state.titleController.text, description: state.descriptionController.text, content: state.contentController.text, - visibility: _visibilityToString(state.visibility.value), + visibility: state.visibility.value, lastModified: DateTime.now(), ); @@ -559,35 +555,5 @@ class ArticleComposeScreen extends HookConsumerWidget { } } - // Helper method to convert visibility int to string - String _visibilityToString(int visibility) { - switch (visibility) { - case 0: - return 'public'; - case 1: - return 'unlisted'; - case 2: - return 'friends'; - case 3: - return 'private'; - default: - return 'public'; - } - } - // Helper method to parse article visibility - int _parseArticleVisibility(String visibility) { - switch (visibility) { - case 'public': - return 0; - case 'unlisted': - return 1; - case 'friends': - return 2; - case 'private': - return 3; - default: - return 0; - } - } } diff --git a/lib/services/compose_storage_db.dart b/lib/services/compose_storage_db.dart index 4e6ca26..fdf8110 100644 --- a/lib/services/compose_storage_db.dart +++ b/lib/services/compose_storage_db.dart @@ -3,6 +3,10 @@ import 'package:drift/drift.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:island/database/drift_db.dart'; import 'package:island/pods/database.dart'; +import 'package:island/services/file.dart'; +import 'package:island/models/file.dart'; +import 'package:island/pods/config.dart'; +import 'package:island/pods/network.dart'; part 'compose_storage_db.g.dart'; @@ -11,8 +15,8 @@ class ComposeDraftModel { final String title; final String description; final String content; - final List attachmentIds; - final String visibility; + final List attachments; + final int visibility; final DateTime lastModified; ComposeDraftModel({ @@ -20,7 +24,7 @@ class ComposeDraftModel { required this.title, required this.description, required this.content, - required this.attachmentIds, + required this.attachments, required this.visibility, required this.lastModified, }); @@ -30,7 +34,7 @@ class ComposeDraftModel { 'title': title, 'description': description, 'content': content, - 'attachmentIds': attachmentIds, + 'attachments': attachments.map((e) => e.toJson()).toList(), 'visibility': visibility, 'lastModified': lastModified.toIso8601String(), }; @@ -40,8 +44,10 @@ class ComposeDraftModel { title: json['title'] as String? ?? '', description: json['description'] as String? ?? '', content: json['content'] as String? ?? '', - attachmentIds: List.from(json['attachmentIds'] as List? ?? []), - visibility: json['visibility'] as String? ?? 'public', + attachments: (json['attachments'] as List? ?? []) + .map((e) => UniversalFile.fromJson(e as Map)) + .toList(), + visibility: json['visibility'] as int? ?? 0, lastModified: DateTime.parse(json['lastModified'] as String), ); @@ -50,7 +56,9 @@ class ComposeDraftModel { title: row.title, description: row.description, content: row.content, - attachmentIds: List.from(jsonDecode(row.attachmentIds)), + attachments: (jsonDecode(row.attachmentIds) as List) + .map((e) => UniversalFile.fromJson(e as Map)) + .toList(), visibility: row.visibility, lastModified: row.lastModified, ); @@ -60,7 +68,7 @@ class ComposeDraftModel { title: Value(title), description: Value(description), content: Value(content), - attachmentIds: Value(jsonEncode(attachmentIds)), + attachmentIds: Value(jsonEncode(attachments.map((e) => e.toJson()).toList())), visibility: Value(visibility), lastModified: Value(lastModified), ); @@ -70,8 +78,8 @@ class ComposeDraftModel { String? title, String? description, String? content, - List? attachmentIds, - String? visibility, + List? attachments, + int? visibility, DateTime? lastModified, }) { return ComposeDraftModel( @@ -79,7 +87,7 @@ class ComposeDraftModel { title: title ?? this.title, description: description ?? this.description, content: content ?? this.content, - attachmentIds: attachmentIds ?? this.attachmentIds, + attachments: attachments ?? this.attachments, visibility: visibility ?? this.visibility, lastModified: lastModified ?? this.lastModified, ); @@ -89,7 +97,7 @@ class ComposeDraftModel { title.isEmpty && description.isEmpty && content.isEmpty && - attachmentIds.isEmpty; + attachments.isEmpty; } class ArticleDraftModel { @@ -97,7 +105,7 @@ class ArticleDraftModel { final String title; final String description; final String content; - final String visibility; + final int visibility; final DateTime lastModified; ArticleDraftModel({ @@ -123,7 +131,7 @@ class ArticleDraftModel { title: json['title'] as String? ?? '', description: json['description'] as String? ?? '', content: json['content'] as String? ?? '', - visibility: json['visibility'] as String? ?? 'public', + visibility: json['visibility'] as int? ?? 0, lastModified: DateTime.parse(json['lastModified'] as String), ); @@ -150,7 +158,7 @@ class ArticleDraftModel { String? title, String? description, String? content, - String? visibility, + int? visibility, DateTime? lastModified, }) { return ArticleDraftModel( @@ -196,7 +204,38 @@ class ComposeStorageNotifier extends _$ComposeStorageNotifier { return; } - final updatedDraft = draft.copyWith(lastModified: DateTime.now()); + // Upload all attachments that are not yet uploaded + final uploadedAttachments = []; + final serverUrl = ref.read(serverUrlProvider); + final token = ref.read(tokenProvider); + + for (final attachment in draft.attachments) { + if (!attachment.isOnCloud) { + try { + final completer = putMediaToCloud( + fileData: attachment, + atk: token?.token ?? '', + baseUrl: serverUrl, + ); + final uploadedFile = await completer.future; + if (uploadedFile != null) { + uploadedAttachments.add(UniversalFile.fromAttachment(uploadedFile)); + } else { + uploadedAttachments.add(attachment); + } + } catch (e) { + // If upload fails, keep the original file + uploadedAttachments.add(attachment); + } + } else { + uploadedAttachments.add(attachment); + } + } + + final updatedDraft = draft.copyWith( + attachments: uploadedAttachments, + lastModified: DateTime.now(), + ); state = {...state, updatedDraft.id: updatedDraft}; try { diff --git a/lib/services/compose_storage_db.g.dart b/lib/services/compose_storage_db.g.dart index aa9eb85..654fafe 100644 --- a/lib/services/compose_storage_db.g.dart +++ b/lib/services/compose_storage_db.g.dart @@ -7,7 +7,7 @@ part of 'compose_storage_db.dart'; // ************************************************************************** String _$composeStorageNotifierHash() => - r'57d3812b8fd430e6144f72708c694ddceea34c17'; + r'fcdb006dca44d30916a20804922e93d0caad49ca'; /// See also [ComposeStorageNotifier]. @ProviderFor(ComposeStorageNotifier) diff --git a/lib/widgets/post/compose_shared.dart b/lib/widgets/post/compose_shared.dart index 974fd47..238e90c 100644 --- a/lib/widgets/post/compose_shared.dart +++ b/lib/widgets/post/compose_shared.dart @@ -102,7 +102,7 @@ class ComposeLogic { titleController: TextEditingController(text: draft.title), descriptionController: TextEditingController(text: draft.description), contentController: TextEditingController(text: draft.content), - visibility: ValueNotifier(_parseVisibility(draft.visibility)), + visibility: ValueNotifier(draft.visibility), submitting: ValueNotifier(false), attachmentProgress: ValueNotifier>({}), currentPublisher: ValueNotifier(null), @@ -110,39 +110,7 @@ class ComposeLogic { ); } - static int _parseVisibility(String visibility) { - switch (visibility.toLowerCase()) { - case 'public': - return 0; - case 'unlisted': - return 1; - case 'friends': - return 2; - case 'selected': - return 3; - case 'private': - return 4; - default: - return 0; - } - } - static String _visibilityToString(int visibility) { - switch (visibility) { - case 0: - return 'public'; - case 1: - return 'unlisted'; - case 2: - return 'friends'; - case 3: - return 'selected'; - case 4: - return 'private'; - default: - return 'public'; - } - } static Future saveDraft(WidgetRef ref, ComposeState state) async { try { @@ -156,12 +124,8 @@ class ComposeLogic { title: state.titleController.text, description: state.descriptionController.text, content: state.contentController.text, - attachmentIds: - state.attachments.value - .where((e) => e.isOnCloud) - .map((e) => e.data.id.toString()) - .toList(), - visibility: _visibilityToString(state.visibility.value), + attachments: state.attachments.value, + visibility: state.visibility.value, lastModified: DateTime.now(), ); diff --git a/lib/widgets/post/draft_manager.dart b/lib/widgets/post/draft_manager.dart index f51295a..1a915ec 100644 --- a/lib/widgets/post/draft_manager.dart +++ b/lib/widgets/post/draft_manager.dart @@ -203,7 +203,7 @@ class _DraftItem extends StatelessWidget { ? postDraft.description : 'noContent'.tr()); lastModified = postDraft.lastModified; - visibility = postDraft.visibility; + visibility = _parseArticleVisibility(postDraft.visibility); } final preview = @@ -316,17 +316,17 @@ class _DraftItem extends StatelessWidget { } } - String _parseArticleVisibility(String visibility) { - switch (visibility.toLowerCase()) { - case 'public': + String _parseArticleVisibility(int visibility) { + switch (visibility) { + case 0: return 'public'.tr(); - case 'unlisted': + case 1: return 'unlisted'.tr(); - case 'friends': + case 2: return 'friends'.tr(); - case 'selected': + case 3: return 'selected'.tr(); - case 'private': + case 4: return 'private'.tr(); default: return 'unknown'.tr();