Realm post, and post publisher is org is rounded rect

This commit is contained in:
2025-08-17 02:37:45 +08:00
parent af1b303211
commit 1a892ab227
13 changed files with 177 additions and 31 deletions

View File

@@ -5,11 +5,15 @@ import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/post_category.dart';
import 'package:island/models/realm.dart';
import 'package:island/pods/network.dart';
import 'package:island/screens/realm/realms.dart';
import 'package:island/widgets/content/cloud_files.dart';
import 'package:island/widgets/content/sheet.dart';
import 'package:island/widgets/post/compose_shared.dart';
import 'package:material_symbols_icons/symbols.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:textfield_tags/textfield_tags.dart';
part 'compose_settings_sheet.g.dart';
@@ -129,7 +133,9 @@ class ComposeSettingsSheet extends HookConsumerWidget {
// Listen to visibility changes to trigger rebuilds
final currentVisibility = useValueListenable(state.visibility);
final currentCategories = useValueListenable(state.categories);
final currentRealm = useValueListenable(state.realm);
final postCategories = ref.watch(postCategoriesProvider);
final userRealms = ref.watch(realmsJoinedProvider);
IconData getVisibilityIcon(int visibilityValue) {
switch (visibilityValue) {
@@ -336,14 +342,92 @@ class ComposeSettingsSheet extends HookConsumerWidget {
},
buttonStyleData: const ButtonStyleData(
padding: EdgeInsets.only(left: 16, right: 8),
height: 40,
height: 38,
),
menuItemStyleData: const MenuItemStyleData(
height: 40,
height: 38,
padding: EdgeInsets.zero,
),
),
// Realm selection
DropdownButtonFormField2<SnRealm?>(
isExpanded: true,
decoration: InputDecoration(
contentPadding: const EdgeInsets.symmetric(vertical: 9),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
),
),
hint: Text('realm'.tr(), style: const TextStyle(fontSize: 15)),
items: [
DropdownMenuItem<SnRealm?>(
value: null,
child: Row(
children: [
const CircleAvatar(
radius: 16,
child: Icon(Symbols.link_off, fill: 1),
),
const SizedBox(width: 12),
Text('postUnlinkRealm').tr(),
],
).padding(left: 16, right: 8),
),
if (userRealms.hasValue)
...(userRealms.value ?? []).map(
(realm) => DropdownMenuItem<SnRealm?>(
value: realm,
child: Row(
children: [
ProfilePictureWidget(
fileId: realm.picture?.id,
fallbackIcon: Symbols.workspaces,
radius: 16,
),
const SizedBox(width: 12),
Text(realm.name),
],
).padding(left: 16, right: 8),
),
),
],
value: currentRealm,
onChanged: (value) {
state.realm.value = value;
},
selectedItemBuilder: (context) {
return (userRealms.value ?? []).map((_) {
return Row(
children: [
if (currentRealm == null)
const CircleAvatar(
radius: 16,
child: Icon(Symbols.link_off, fill: 1),
)
else
ProfilePictureWidget(
fileId: currentRealm.picture?.id,
fallbackIcon: Symbols.workspaces,
radius: 16,
),
const SizedBox(width: 12),
Text(currentRealm?.name ?? 'postUnlinkRealm'.tr()),
],
);
}).toList();
},
buttonStyleData: const ButtonStyleData(
padding: EdgeInsets.only(left: 16, right: 8),
height: 40,
),
menuItemStyleData: const MenuItemStyleData(
height: 56,
padding: EdgeInsets.zero,
),
),
const Gap(16),
// Visibility setting
Container(
decoration: BoxDecoration(

View File

@@ -9,6 +9,7 @@ import 'package:island/models/file.dart';
import 'package:island/models/post.dart';
import 'package:island/models/post_category.dart';
import 'package:island/models/publisher.dart';
import 'package:island/models/realm.dart';
import 'package:island/pods/config.dart';
import 'package:island/pods/network.dart';
import 'package:island/services/file.dart';
@@ -33,6 +34,7 @@ class ComposeState {
final ValueNotifier<bool> submitting;
final ValueNotifier<List<SnPostCategory>> categories;
StringTagController tagsController;
final ValueNotifier<SnRealm?> realm;
final String draftId;
int postType;
// Linked poll id for this compose session (nullable)
@@ -50,6 +52,7 @@ class ComposeState {
required this.submitting,
required this.tagsController,
required this.categories,
required this.realm,
required this.draftId,
this.postType = 0,
String? pollId,
@@ -112,6 +115,7 @@ class ComposeLogic {
categories: ValueNotifier<List<SnPostCategory>>(
originalPost?.categories ?? [],
),
realm: ValueNotifier(originalPost?.realm),
draftId: id,
postType: postType,
// initialize without poll by default
@@ -141,6 +145,7 @@ class ComposeLogic {
currentPublisher: ValueNotifier<SnPublisher?>(null),
tagsController: tagsController,
categories: ValueNotifier<List<SnPostCategory>>([]),
realm: ValueNotifier(null),
draftId: draft.id,
postType: postType,
pollId: null,
@@ -640,6 +645,7 @@ class ComposeLogic {
if (forwardedPost != null) 'forwarded_post_id': forwardedPost.id,
'tags': state.tagsController.getTags,
'categories': state.categories.value.map((e) => e.slug).toList(),
if (state.realm.value != null) 'realm_id': state.realm.value?.id,
if (state.pollId.value != null) 'poll_id': state.pollId.value,
};
@@ -733,6 +739,7 @@ class ComposeLogic {
state.currentPublisher.dispose();
state.tagsController.dispose();
state.categories.dispose();
state.realm.dispose();
state.pollId.dispose();
}
}

View File

@@ -559,7 +559,11 @@ class PostHeader extends StatelessWidget {
);
}
: null,
child: ProfilePictureWidget(file: item.publisher.picture, radius: 16),
child: ProfilePictureWidget(
file: item.publisher.picture,
radius: 16,
borderRadius: item.publisher.type == 0 ? null : 6,
),
),
Expanded(
child: Column(