import 'package:lemmy_api_client/v3.dart'; import 'package:mobx/mobx.dart'; import '../../util/async_store.dart'; import '../../util/cleanup_url.dart'; part 'post_store.g.dart'; class PostStore = _PostStore with _$PostStore; abstract class _PostStore with Store { _PostStore(this.postView); final votingState = AsyncStore(); final savingState = AsyncStore(); final userBlockingState = AsyncStore(); final reportingState = AsyncStore(); @observable PostView postView; @computed String? get urlDomain => postView.post.url != null ? urlHost(postView.post.url!) : null; @computed bool get hasMedia { final url = postView.post.url; if (url == null || url.isEmpty) return false; // TODO: detect video // this is how they do it in lemmy-ui: // https://github.com/LemmyNet/lemmy-ui/blob/018c10c9193082237b5f8036e215a40325591acb/src/shared/utils.ts#L291 if (!url.startsWith('https://') && !url.startsWith('http://')) { return false; } return url.endsWith('.jpg') || url.endsWith('.jpeg') || url.endsWith('.png') || url.endsWith('.gif') || url.endsWith('.webp') || url.endsWith('.bmp') || url.endsWith('.svg') || url.endsWith('.wbpm'); } @action Future save(Jwt token) async { final result = await savingState.runLemmy( postView.instanceHost, SavePost( postId: postView.post.id, save: !postView.saved, auth: token.raw)); if (result != null) postView = result; } @action Future report(Jwt token, String reason) async { if (reason.trim().isEmpty) throw ArgumentError('reason must not be empty'); await reportingState.runLemmy( postView.instanceHost, CreatePostReport( postId: postView.post.id, reason: reason, auth: token.raw, ), ); } @action Future blockUser(Jwt token) async { final result = await userBlockingState.runLemmy( postView.post.instanceHost, BlockPerson( personId: postView.creator.id, block: !postView.creatorBlocked, auth: token.raw, )); if (result != null) { postView = postView.copyWith(creatorBlocked: result.blocked); } } @action // ignore: use_setters_to_change_properties void updatePostView(PostView postView) { this.postView = postView; } // VOTING @action Future _vote(Jwt token, VoteType voteType) async { final result = await votingState.runLemmy( postView.instanceHost, CreatePostLike( postId: postView.post.id, score: voteType, auth: token.raw), ); if (result != null) postView = result; } @action Future upVote(Jwt token) => _vote( token, postView.myVote == VoteType.up ? VoteType.none : VoteType.up); @action Future downVote(Jwt token) => _vote( token, postView.myVote == VoteType.down ? VoteType.none : VoteType.down); }