🐛 Fix the goddamn AI code
This commit is contained in:
@@ -1,58 +1,39 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:island/models/post.dart';
|
||||
import 'package:island/services/compose_storage_db.dart';
|
||||
import 'package:island/widgets/post/compose_shared.dart';
|
||||
import 'package:island/widgets/post/draft_manager.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
|
||||
import '../../models/post.dart';
|
||||
import '../../models/file.dart';
|
||||
import '../../services/compose_storage_db.dart';
|
||||
import '../../widgets/post/draft_manager.dart';
|
||||
|
||||
class ComposeToolbar extends StatelessWidget {
|
||||
final WidgetRef ref;
|
||||
final BuildContext context;
|
||||
final ColorScheme colorScheme;
|
||||
class ComposeToolbar extends HookConsumerWidget {
|
||||
final ComposeState state;
|
||||
final SnPost? originalPost;
|
||||
final bool isEmpty;
|
||||
final TextEditingController titleController;
|
||||
final TextEditingController descriptionController;
|
||||
final TextEditingController contentController;
|
||||
final ValueNotifier<int> visibility;
|
||||
final ValueNotifier<List<UniversalFile>> attachments;
|
||||
|
||||
const ComposeToolbar({
|
||||
super.key,
|
||||
required this.ref,
|
||||
required this.context,
|
||||
required this.colorScheme,
|
||||
required this.isEmpty,
|
||||
required this.titleController,
|
||||
required this.descriptionController,
|
||||
required this.contentController,
|
||||
required this.visibility,
|
||||
required this.attachments,
|
||||
this.originalPost,
|
||||
});
|
||||
|
||||
void _pickPhotoMedia() {
|
||||
// TODO: Implement photo picking logic
|
||||
}
|
||||
|
||||
void _pickVideoMedia() {
|
||||
// TODO: Implement video picking logic
|
||||
}
|
||||
|
||||
void _linkAttachment() {
|
||||
// TODO: Implement link attachment logic
|
||||
}
|
||||
|
||||
void _saveDraft() {
|
||||
// TODO: Implement draft saving logic
|
||||
}
|
||||
const ComposeToolbar({super.key, required this.state, this.originalPost});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
void pickPhotoMedia() {
|
||||
ComposeLogic.pickPhotoMedia(ref, state);
|
||||
}
|
||||
|
||||
void pickVideoMedia() {
|
||||
ComposeLogic.pickVideoMedia(ref, state);
|
||||
}
|
||||
|
||||
void linkAttachment() {
|
||||
ComposeLogic.linkAttachment(ref, state, context);
|
||||
}
|
||||
|
||||
void saveDraft() {
|
||||
ComposeLogic.saveDraft(ref, state);
|
||||
}
|
||||
|
||||
final colorScheme = Theme.of(context).colorScheme;
|
||||
|
||||
return Material(
|
||||
elevation: 4,
|
||||
child: Center(
|
||||
@@ -61,25 +42,25 @@ class ComposeToolbar extends StatelessWidget {
|
||||
child: Row(
|
||||
children: [
|
||||
IconButton(
|
||||
onPressed: _pickPhotoMedia,
|
||||
onPressed: pickPhotoMedia,
|
||||
tooltip: 'addPhoto'.tr(),
|
||||
icon: const Icon(Symbols.add_a_photo),
|
||||
color: colorScheme.primary,
|
||||
),
|
||||
IconButton(
|
||||
onPressed: _pickVideoMedia,
|
||||
onPressed: pickVideoMedia,
|
||||
tooltip: 'addVideo'.tr(),
|
||||
icon: const Icon(Symbols.videocam),
|
||||
color: colorScheme.primary,
|
||||
),
|
||||
IconButton(
|
||||
onPressed: _linkAttachment,
|
||||
onPressed: linkAttachment,
|
||||
icon: const Icon(Symbols.attach_file),
|
||||
tooltip: 'linkAttachment'.tr(),
|
||||
color: colorScheme.primary,
|
||||
),
|
||||
const Spacer(),
|
||||
if (originalPost == null && isEmpty)
|
||||
if (originalPost == null && state.isEmpty)
|
||||
IconButton(
|
||||
icon: const Icon(Symbols.draft),
|
||||
color: colorScheme.primary,
|
||||
@@ -95,11 +76,12 @@ class ComposeToolbar extends StatelessWidget {
|
||||
composeStorageNotifierProvider,
|
||||
)[draftId];
|
||||
if (draft != null) {
|
||||
titleController.text = draft.title ?? '';
|
||||
descriptionController.text =
|
||||
state.titleController.text = draft.title ?? '';
|
||||
state.descriptionController.text =
|
||||
draft.description ?? '';
|
||||
contentController.text = draft.content ?? '';
|
||||
visibility.value = draft.visibility;
|
||||
state.contentController.text =
|
||||
draft.content ?? '';
|
||||
state.visibility.value = draft.visibility;
|
||||
}
|
||||
},
|
||||
),
|
||||
@@ -111,7 +93,7 @@ class ComposeToolbar extends StatelessWidget {
|
||||
IconButton(
|
||||
icon: const Icon(Symbols.save),
|
||||
color: colorScheme.primary,
|
||||
onPressed: _saveDraft,
|
||||
onPressed: saveDraft,
|
||||
tooltip: 'saveDraft'.tr(),
|
||||
),
|
||||
],
|
||||
|
@@ -26,9 +26,23 @@ import 'package:island/widgets/content/markdown.dart';
|
||||
import 'package:island/widgets/safety/abuse_report_helper.dart';
|
||||
import 'package:island/widgets/share/share_sheet.dart';
|
||||
import 'package:material_symbols_icons/symbols.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
import 'package:styled_widget/styled_widget.dart';
|
||||
import 'package:super_context_menu/super_context_menu.dart';
|
||||
|
||||
part 'post_item.g.dart';
|
||||
|
||||
@riverpod
|
||||
Future<SnPost?> postFeaturedReply(Ref ref, String id) async {
|
||||
final client = ref.watch(apiClientProvider);
|
||||
try {
|
||||
final resp = await client.get('/sphere/posts/$id/replies/featured');
|
||||
return SnPost.fromJson(resp.data);
|
||||
} catch (_) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class PostActionableItem extends HookConsumerWidget {
|
||||
final Color? backgroundColor;
|
||||
final SnPost item;
|
||||
@@ -338,9 +352,12 @@ class PostItem extends HookConsumerWidget {
|
||||
mostReaction == null
|
||||
? const Icon(Symbols.add_reaction)
|
||||
: Badge(
|
||||
label: Text(
|
||||
'x${item.reactionsCount[mostReaction]}',
|
||||
style: TextStyle(fontSize: 11),
|
||||
label: Center(
|
||||
child: Text(
|
||||
'x${item.reactionsCount[mostReaction]}',
|
||||
style: TextStyle(fontSize: 11),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
),
|
||||
offset: Offset(4, 20),
|
||||
backgroundColor: Theme.of(
|
||||
@@ -352,6 +369,13 @@ class PostItem extends HookConsumerWidget {
|
||||
style: TextStyle(fontSize: 20),
|
||||
),
|
||||
),
|
||||
style: ButtonStyle(
|
||||
backgroundColor: WidgetStatePropertyAll(
|
||||
(item.reactionsMade[mostReaction] ?? false)
|
||||
? Theme.of(context).colorScheme.primary.withOpacity(0.5)
|
||||
: null,
|
||||
),
|
||||
),
|
||||
onPressed: () {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
|
152
lib/widgets/post/post_item.g.dart
Normal file
152
lib/widgets/post/post_item.g.dart
Normal file
@@ -0,0 +1,152 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'post_item.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$postFeaturedReplyHash() => r'3f0ac0d51ad21f8754a63dd94109eb8ac4812293';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
_SystemHash._();
|
||||
|
||||
static int combine(int hash, int value) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + value);
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
|
||||
return hash ^ (hash >> 6);
|
||||
}
|
||||
|
||||
static int finish(int hash) {
|
||||
// ignore: parameter_assignments
|
||||
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
|
||||
// ignore: parameter_assignments
|
||||
hash = hash ^ (hash >> 11);
|
||||
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
|
||||
}
|
||||
}
|
||||
|
||||
/// See also [postFeaturedReply].
|
||||
@ProviderFor(postFeaturedReply)
|
||||
const postFeaturedReplyProvider = PostFeaturedReplyFamily();
|
||||
|
||||
/// See also [postFeaturedReply].
|
||||
class PostFeaturedReplyFamily extends Family<AsyncValue<SnPost?>> {
|
||||
/// See also [postFeaturedReply].
|
||||
const PostFeaturedReplyFamily();
|
||||
|
||||
/// See also [postFeaturedReply].
|
||||
PostFeaturedReplyProvider call(String id) {
|
||||
return PostFeaturedReplyProvider(id);
|
||||
}
|
||||
|
||||
@override
|
||||
PostFeaturedReplyProvider getProviderOverride(
|
||||
covariant PostFeaturedReplyProvider provider,
|
||||
) {
|
||||
return call(provider.id);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
|
||||
|
||||
@override
|
||||
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
|
||||
_allTransitiveDependencies;
|
||||
|
||||
@override
|
||||
String? get name => r'postFeaturedReplyProvider';
|
||||
}
|
||||
|
||||
/// See also [postFeaturedReply].
|
||||
class PostFeaturedReplyProvider extends AutoDisposeFutureProvider<SnPost?> {
|
||||
/// See also [postFeaturedReply].
|
||||
PostFeaturedReplyProvider(String id)
|
||||
: this._internal(
|
||||
(ref) => postFeaturedReply(ref as PostFeaturedReplyRef, id),
|
||||
from: postFeaturedReplyProvider,
|
||||
name: r'postFeaturedReplyProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$postFeaturedReplyHash,
|
||||
dependencies: PostFeaturedReplyFamily._dependencies,
|
||||
allTransitiveDependencies:
|
||||
PostFeaturedReplyFamily._allTransitiveDependencies,
|
||||
id: id,
|
||||
);
|
||||
|
||||
PostFeaturedReplyProvider._internal(
|
||||
super._createNotifier, {
|
||||
required super.name,
|
||||
required super.dependencies,
|
||||
required super.allTransitiveDependencies,
|
||||
required super.debugGetCreateSourceHash,
|
||||
required super.from,
|
||||
required this.id,
|
||||
}) : super.internal();
|
||||
|
||||
final String id;
|
||||
|
||||
@override
|
||||
Override overrideWith(
|
||||
FutureOr<SnPost?> Function(PostFeaturedReplyRef provider) create,
|
||||
) {
|
||||
return ProviderOverride(
|
||||
origin: this,
|
||||
override: PostFeaturedReplyProvider._internal(
|
||||
(ref) => create(ref as PostFeaturedReplyRef),
|
||||
from: from,
|
||||
name: null,
|
||||
dependencies: null,
|
||||
allTransitiveDependencies: null,
|
||||
debugGetCreateSourceHash: null,
|
||||
id: id,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
AutoDisposeFutureProviderElement<SnPost?> createElement() {
|
||||
return _PostFeaturedReplyProviderElement(this);
|
||||
}
|
||||
|
||||
@override
|
||||
bool operator ==(Object other) {
|
||||
return other is PostFeaturedReplyProvider && other.id == id;
|
||||
}
|
||||
|
||||
@override
|
||||
int get hashCode {
|
||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||
hash = _SystemHash.combine(hash, id.hashCode);
|
||||
|
||||
return _SystemHash.finish(hash);
|
||||
}
|
||||
}
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin PostFeaturedReplyRef on AutoDisposeFutureProviderRef<SnPost?> {
|
||||
/// The parameter `id` of this provider.
|
||||
String get id;
|
||||
}
|
||||
|
||||
class _PostFeaturedReplyProviderElement
|
||||
extends AutoDisposeFutureProviderElement<SnPost?>
|
||||
with PostFeaturedReplyRef {
|
||||
_PostFeaturedReplyProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
String get id => (origin as PostFeaturedReplyProvider).id;
|
||||
}
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
|
Reference in New Issue
Block a user