App/lib/models/post.dart
2025-06-25 02:15:45 +08:00

116 lines
3.5 KiB
Dart

import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:island/models/file.dart';
import 'package:island/models/user.dart';
part 'post.freezed.dart';
part 'post.g.dart';
@freezed
sealed class SnPost with _$SnPost {
const factory SnPost({
required String id,
String? title,
String? description,
String? language,
DateTime? editedAt,
@Default(null) DateTime? publishedAt,
@Default(0) int visibility,
String? content,
@Default(0) int type,
Map<String, dynamic>? meta,
@Default(0) int viewsUnique,
@Default(0) int viewsTotal,
@Default(0) int upvotes,
@Default(0) int downvotes,
@Default(0) int repliesCount,
String? threadedPostId,
SnPost? threadedPost,
String? repliedPostId,
SnPost? repliedPost,
String? forwardedPostId,
SnPost? forwardedPost,
@Default([]) List<SnCloudFile> attachments,
@Default(SnPublisher()) SnPublisher publisher,
@Default({}) Map<String, int> reactionsCount,
@Default([]) List<dynamic> reactions,
@Default([]) List<dynamic> tags,
@Default([]) List<dynamic> categories,
@Default([]) List<dynamic> collections,
@Default(null) DateTime? createdAt,
@Default(null) DateTime? updatedAt,
DateTime? deletedAt,
@Default(false) bool isTruncated,
}) = _SnPost;
factory SnPost.fromJson(Map<String, dynamic> json) => _$SnPostFromJson(json);
}
@freezed
sealed class SnPublisher with _$SnPublisher {
const factory SnPublisher({
@Default('') String id,
@Default(0) int type,
@Default('') String name,
@Default('') String nick,
@Default('') String bio,
SnCloudFile? picture,
SnCloudFile? background,
SnAccount? account,
String? accountId,
@Default(null) DateTime? createdAt,
@Default(null) DateTime? updatedAt,
DateTime? deletedAt,
String? realmId,
SnVerificationMark? verification,
}) = _SnPublisher;
factory SnPublisher.fromJson(Map<String, dynamic> json) =>
_$SnPublisherFromJson(json);
}
@freezed
sealed class SnPublisherStats with _$SnPublisherStats {
const factory SnPublisherStats({
required int postsCreated,
required int stickerPacksCreated,
required int stickersCreated,
required int upvoteReceived,
required int downvoteReceived,
}) = _SnPublisherStats;
factory SnPublisherStats.fromJson(Map<String, dynamic> json) =>
_$SnPublisherStatsFromJson(json);
}
@freezed
sealed class SnSubscriptionStatus with _$SnSubscriptionStatus {
const factory SnSubscriptionStatus({
required bool isSubscribed,
required String publisherId,
required String publisherName,
}) = _SnSubscriptionStatus;
factory SnSubscriptionStatus.fromJson(Map<String, dynamic> json) =>
_$SnSubscriptionStatusFromJson(json);
}
@freezed
sealed class ReactInfo with _$ReactInfo {
const factory ReactInfo({required String icon, required int attitude}) =
_ReactInfo;
}
const Map<String, ReactInfo> kReactionTemplates = {
'thumb_up': ReactInfo(icon: '👍', attitude: 0),
'thumb_down': ReactInfo(icon: '👎', attitude: 2),
'just_okay': ReactInfo(icon: '😅', attitude: 1),
'cry': ReactInfo(icon: '😭', attitude: 1),
'confuse': ReactInfo(icon: '🧐', attitude: 1),
'clap': ReactInfo(icon: '👏', attitude: 0),
'laugh': ReactInfo(icon: '😂', attitude: 0),
'angry': ReactInfo(icon: '😡', attitude: 2),
'party': ReactInfo(icon: '🎉', attitude: 0),
'pray': ReactInfo(icon: '🙏', attitude: 0),
'heart': ReactInfo(icon: '❤️', attitude: 0),
};