💄 Optimized drafts

This commit is contained in:
LittleSheep 2025-06-25 00:01:52 +08:00
parent 568d70fffb
commit b89cffeb18
11 changed files with 148 additions and 169 deletions

View File

@ -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

View File

@ -634,13 +634,13 @@ class $ComposeDraftsTable extends ComposeDrafts
'visibility',
);
@override
late final GeneratedColumn<String> visibility = GeneratedColumn<String>(
late final GeneratedColumn<int> visibility = GeneratedColumn<int>(
'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<ComposeDraft> {
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<ComposeDraft> {
map['description'] = Variable<String>(description);
map['content'] = Variable<String>(content);
map['attachment_ids'] = Variable<String>(attachmentIds);
map['visibility'] = Variable<String>(visibility);
map['visibility'] = Variable<int>(visibility);
map['last_modified'] = Variable<DateTime>(lastModified);
return map;
}
@ -833,7 +833,7 @@ class ComposeDraft extends DataClass implements Insertable<ComposeDraft> {
description: serializer.fromJson<String>(json['description']),
content: serializer.fromJson<String>(json['content']),
attachmentIds: serializer.fromJson<String>(json['attachmentIds']),
visibility: serializer.fromJson<String>(json['visibility']),
visibility: serializer.fromJson<int>(json['visibility']),
lastModified: serializer.fromJson<DateTime>(json['lastModified']),
);
}
@ -846,7 +846,7 @@ class ComposeDraft extends DataClass implements Insertable<ComposeDraft> {
'description': serializer.toJson<String>(description),
'content': serializer.toJson<String>(content),
'attachmentIds': serializer.toJson<String>(attachmentIds),
'visibility': serializer.toJson<String>(visibility),
'visibility': serializer.toJson<int>(visibility),
'lastModified': serializer.toJson<DateTime>(lastModified),
};
}
@ -857,7 +857,7 @@ class ComposeDraft extends DataClass implements Insertable<ComposeDraft> {
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<ComposeDraft> {
final Value<String> description;
final Value<String> content;
final Value<String> attachmentIds;
final Value<String> visibility;
final Value<int> visibility;
final Value<DateTime> lastModified;
final Value<int> rowid;
const ComposeDraftsCompanion({
@ -961,7 +961,7 @@ class ComposeDraftsCompanion extends UpdateCompanion<ComposeDraft> {
Expression<String>? description,
Expression<String>? content,
Expression<String>? attachmentIds,
Expression<String>? visibility,
Expression<int>? visibility,
Expression<DateTime>? lastModified,
Expression<int>? rowid,
}) {
@ -983,7 +983,7 @@ class ComposeDraftsCompanion extends UpdateCompanion<ComposeDraft> {
Value<String>? description,
Value<String>? content,
Value<String>? attachmentIds,
Value<String>? visibility,
Value<int>? visibility,
Value<DateTime>? lastModified,
Value<int>? rowid,
}) {
@ -1018,7 +1018,7 @@ class ComposeDraftsCompanion extends UpdateCompanion<ComposeDraft> {
map['attachment_ids'] = Variable<String>(attachmentIds.value);
}
if (visibility.present) {
map['visibility'] = Variable<String>(visibility.value);
map['visibility'] = Variable<int>(visibility.value);
}
if (lastModified.present) {
map['last_modified'] = Variable<DateTime>(lastModified.value);
@ -1098,13 +1098,13 @@ class $ArticleDraftsTable extends ArticleDrafts
'visibility',
);
@override
late final GeneratedColumn<String> visibility = GeneratedColumn<String>(
late final GeneratedColumn<int> visibility = GeneratedColumn<int>(
'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<ArticleDraft> {
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<ArticleDraft> {
map['title'] = Variable<String>(title);
map['description'] = Variable<String>(description);
map['content'] = Variable<String>(content);
map['visibility'] = Variable<String>(visibility);
map['visibility'] = Variable<int>(visibility);
map['last_modified'] = Variable<DateTime>(lastModified);
return map;
}
@ -1277,7 +1277,7 @@ class ArticleDraft extends DataClass implements Insertable<ArticleDraft> {
title: serializer.fromJson<String>(json['title']),
description: serializer.fromJson<String>(json['description']),
content: serializer.fromJson<String>(json['content']),
visibility: serializer.fromJson<String>(json['visibility']),
visibility: serializer.fromJson<int>(json['visibility']),
lastModified: serializer.fromJson<DateTime>(json['lastModified']),
);
}
@ -1289,7 +1289,7 @@ class ArticleDraft extends DataClass implements Insertable<ArticleDraft> {
'title': serializer.toJson<String>(title),
'description': serializer.toJson<String>(description),
'content': serializer.toJson<String>(content),
'visibility': serializer.toJson<String>(visibility),
'visibility': serializer.toJson<int>(visibility),
'lastModified': serializer.toJson<DateTime>(lastModified),
};
}
@ -1299,7 +1299,7 @@ class ArticleDraft extends DataClass implements Insertable<ArticleDraft> {
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<ArticleDraft> {
final Value<String> title;
final Value<String> description;
final Value<String> content;
final Value<String> visibility;
final Value<int> visibility;
final Value<DateTime> lastModified;
final Value<int> rowid;
const ArticleDraftsCompanion({
@ -1385,7 +1385,7 @@ class ArticleDraftsCompanion extends UpdateCompanion<ArticleDraft> {
Expression<String>? title,
Expression<String>? description,
Expression<String>? content,
Expression<String>? visibility,
Expression<int>? visibility,
Expression<DateTime>? lastModified,
Expression<int>? rowid,
}) {
@ -1405,7 +1405,7 @@ class ArticleDraftsCompanion extends UpdateCompanion<ArticleDraft> {
Value<String>? title,
Value<String>? description,
Value<String>? content,
Value<String>? visibility,
Value<int>? visibility,
Value<DateTime>? lastModified,
Value<int>? rowid,
}) {
@ -1436,7 +1436,7 @@ class ArticleDraftsCompanion extends UpdateCompanion<ArticleDraft> {
map['content'] = Variable<String>(content.value);
}
if (visibility.present) {
map['visibility'] = Variable<String>(visibility.value);
map['visibility'] = Variable<int>(visibility.value);
}
if (lastModified.present) {
map['last_modified'] = Variable<DateTime>(lastModified.value);
@ -1771,7 +1771,7 @@ typedef $$ComposeDraftsTableCreateCompanionBuilder =
Value<String> description,
Value<String> content,
Value<String> attachmentIds,
Value<String> visibility,
Value<int> visibility,
required DateTime lastModified,
Value<int> rowid,
});
@ -1782,7 +1782,7 @@ typedef $$ComposeDraftsTableUpdateCompanionBuilder =
Value<String> description,
Value<String> content,
Value<String> attachmentIds,
Value<String> visibility,
Value<int> visibility,
Value<DateTime> lastModified,
Value<int> rowid,
});
@ -1821,7 +1821,7 @@ class $$ComposeDraftsTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get visibility => $composableBuilder(
ColumnFilters<int> get visibility => $composableBuilder(
column: $table.visibility,
builder: (column) => ColumnFilters(column),
);
@ -1866,7 +1866,7 @@ class $$ComposeDraftsTableOrderingComposer
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get visibility => $composableBuilder(
ColumnOrderings<int> get visibility => $composableBuilder(
column: $table.visibility,
builder: (column) => ColumnOrderings(column),
);
@ -1905,7 +1905,7 @@ class $$ComposeDraftsTableAnnotationComposer
builder: (column) => column,
);
GeneratedColumn<String> get visibility => $composableBuilder(
GeneratedColumn<int> get visibility => $composableBuilder(
column: $table.visibility,
builder: (column) => column,
);
@ -1956,7 +1956,7 @@ class $$ComposeDraftsTableTableManager
Value<String> description = const Value.absent(),
Value<String> content = const Value.absent(),
Value<String> attachmentIds = const Value.absent(),
Value<String> visibility = const Value.absent(),
Value<int> visibility = const Value.absent(),
Value<DateTime> lastModified = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => ComposeDraftsCompanion(
@ -1976,7 +1976,7 @@ class $$ComposeDraftsTableTableManager
Value<String> description = const Value.absent(),
Value<String> content = const Value.absent(),
Value<String> attachmentIds = const Value.absent(),
Value<String> visibility = const Value.absent(),
Value<int> visibility = const Value.absent(),
required DateTime lastModified,
Value<int> rowid = const Value.absent(),
}) => ComposeDraftsCompanion.insert(
@ -2027,7 +2027,7 @@ typedef $$ArticleDraftsTableCreateCompanionBuilder =
Value<String> title,
Value<String> description,
Value<String> content,
Value<String> visibility,
Value<int> visibility,
required DateTime lastModified,
Value<int> rowid,
});
@ -2037,7 +2037,7 @@ typedef $$ArticleDraftsTableUpdateCompanionBuilder =
Value<String> title,
Value<String> description,
Value<String> content,
Value<String> visibility,
Value<int> visibility,
Value<DateTime> lastModified,
Value<int> rowid,
});
@ -2071,7 +2071,7 @@ class $$ArticleDraftsTableFilterComposer
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get visibility => $composableBuilder(
ColumnFilters<int> get visibility => $composableBuilder(
column: $table.visibility,
builder: (column) => ColumnFilters(column),
);
@ -2111,7 +2111,7 @@ class $$ArticleDraftsTableOrderingComposer
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get visibility => $composableBuilder(
ColumnOrderings<int> get visibility => $composableBuilder(
column: $table.visibility,
builder: (column) => ColumnOrderings(column),
);
@ -2145,7 +2145,7 @@ class $$ArticleDraftsTableAnnotationComposer
GeneratedColumn<String> get content =>
$composableBuilder(column: $table.content, builder: (column) => column);
GeneratedColumn<String> get visibility => $composableBuilder(
GeneratedColumn<int> get visibility => $composableBuilder(
column: $table.visibility,
builder: (column) => column,
);
@ -2195,7 +2195,7 @@ class $$ArticleDraftsTableTableManager
Value<String> title = const Value.absent(),
Value<String> description = const Value.absent(),
Value<String> content = const Value.absent(),
Value<String> visibility = const Value.absent(),
Value<int> visibility = const Value.absent(),
Value<DateTime> lastModified = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => ArticleDraftsCompanion(
@ -2213,7 +2213,7 @@ class $$ArticleDraftsTableTableManager
Value<String> title = const Value.absent(),
Value<String> description = const Value.absent(),
Value<String> content = const Value.absent(),
Value<String> visibility = const Value.absent(),
Value<int> visibility = const Value.absent(),
required DateTime lastModified,
Value<int> rowid = const Value.absent(),
}) => ArticleDraftsCompanion.insert(

View File

@ -14,6 +14,9 @@ sealed class UniversalFile with _$UniversalFile {
required UniversalFileType type,
}) = _UniversalFile;
factory UniversalFile.fromJson(Map<String, dynamic> json) =>
_$UniversalFileFromJson(json);
bool get isOnCloud => data is SnCloudFile;
bool get isOnDevice => !isOnCloud;

View File

@ -12,6 +12,7 @@ part of 'file.dart';
// dart format off
T _$identity<T>(T value) => value;
/// @nodoc
mixin _$UniversalFile {
@ -22,6 +23,8 @@ mixin _$UniversalFile {
@pragma('vm:prefer-inline')
$UniversalFileCopyWith<UniversalFile> get copyWith => _$UniversalFileCopyWithImpl<UniversalFile>(this as UniversalFile, _$identity);
/// Serializes this UniversalFile to a JSON map.
Map<String, dynamic> 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<String, dynamic> 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<String, dynamic> 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);

View File

@ -6,6 +6,25 @@ part of 'file.dart';
// JsonSerializableGenerator
// **************************************************************************
_UniversalFile _$UniversalFileFromJson(Map<String, dynamic> json) =>
_UniversalFile(
data: json['data'],
type: $enumDecode(_$UniversalFileTypeEnumMap, json['type']),
);
Map<String, dynamic> _$UniversalFileToJson(_UniversalFile instance) =>
<String, dynamic>{
'data': instance.data,
'type': _$UniversalFileTypeEnumMap[instance.type]!,
};
const _$UniversalFileTypeEnumMap = {
UniversalFileType.image: 'image',
UniversalFileType.video: 'video',
UniversalFileType.audio: 'audio',
UniversalFileType.file: 'file',
};
_SnCloudFile _$SnCloudFileFromJson(Map<String, dynamic> json) => _SnCloudFile(
id: json['id'] as String,
name: json['name'] as String,

View File

@ -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;
}
},
),

View File

@ -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;
}
}
}

View File

@ -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<String> attachmentIds;
final String visibility;
final List<UniversalFile> 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<String>.from(json['attachmentIds'] as List? ?? []),
visibility: json['visibility'] as String? ?? 'public',
attachments: (json['attachments'] as List? ?? [])
.map((e) => UniversalFile.fromJson(e as Map<String, dynamic>))
.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<String>.from(jsonDecode(row.attachmentIds)),
attachments: (jsonDecode(row.attachmentIds) as List)
.map((e) => UniversalFile.fromJson(e as Map<String, dynamic>))
.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<String>? attachmentIds,
String? visibility,
List<UniversalFile>? 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 = <UniversalFile>[];
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 {

View File

@ -7,7 +7,7 @@ part of 'compose_storage_db.dart';
// **************************************************************************
String _$composeStorageNotifierHash() =>
r'57d3812b8fd430e6144f72708c694ddceea34c17';
r'fcdb006dca44d30916a20804922e93d0caad49ca';
/// See also [ComposeStorageNotifier].
@ProviderFor(ComposeStorageNotifier)

View File

@ -102,7 +102,7 @@ class ComposeLogic {
titleController: TextEditingController(text: draft.title),
descriptionController: TextEditingController(text: draft.description),
contentController: TextEditingController(text: draft.content),
visibility: ValueNotifier<int>(_parseVisibility(draft.visibility)),
visibility: ValueNotifier<int>(draft.visibility),
submitting: ValueNotifier<bool>(false),
attachmentProgress: ValueNotifier<Map<int, double>>({}),
currentPublisher: ValueNotifier<SnPublisher?>(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<void> 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(),
);

View File

@ -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();