✨ Realm basis
This commit is contained in:
@ -15,8 +15,9 @@ import 'package:uuid/uuid.dart';
|
||||
|
||||
class ChannelEditorScreen extends StatefulWidget {
|
||||
final Channel? editing;
|
||||
final String? realm;
|
||||
|
||||
const ChannelEditorScreen({super.key, this.editing});
|
||||
const ChannelEditorScreen({super.key, this.editing, this.realm});
|
||||
|
||||
@override
|
||||
State<ChannelEditorScreen> createState() => _ChannelEditorScreenState();
|
||||
@ -39,8 +40,8 @@ class _ChannelEditorScreenState extends State<ChannelEditorScreen> {
|
||||
}
|
||||
|
||||
final uri = widget.editing == null
|
||||
? getRequestUri('messaging', '/api/channels/global')
|
||||
: getRequestUri('messaging', '/api/channels/global/${widget.editing!.id}');
|
||||
? getRequestUri('messaging', '/api/channels/${widget.realm ?? 'global'}')
|
||||
: getRequestUri('messaging', '/api/channels/${widget.realm ?? 'global'}/${widget.editing!.id}');
|
||||
|
||||
final req = Request(widget.editing == null ? 'POST' : 'PUT', uri);
|
||||
req.headers['Content-Type'] = 'application/json';
|
||||
|
@ -15,8 +15,9 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
class ChatMemberScreen extends StatefulWidget {
|
||||
final Channel channel;
|
||||
final String realm;
|
||||
|
||||
const ChatMemberScreen({super.key, required this.channel});
|
||||
const ChatMemberScreen({super.key, required this.channel, this.realm = 'global'});
|
||||
|
||||
@override
|
||||
State<ChatMemberScreen> createState() => _ChatMemberScreenState();
|
||||
@ -36,8 +37,7 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
|
||||
_selfId = prof['id'];
|
||||
|
||||
var uri = getRequestUri(
|
||||
'messaging', '/api/channels/global/${widget.channel.alias}/members');
|
||||
var uri = getRequestUri('messaging', '/api/channels/${widget.realm}/${widget.channel.alias}/members');
|
||||
|
||||
var res = await auth.client!.get(uri);
|
||||
if (res.statusCode == 200) {
|
||||
@ -51,7 +51,7 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> kickMember(ChannelMember item) async {
|
||||
Future<void> removeMember(ChannelMember item) async {
|
||||
setState(() => _isSubmitting = true);
|
||||
|
||||
final auth = context.read<AuthProvider>();
|
||||
@ -60,10 +60,9 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
return;
|
||||
}
|
||||
|
||||
var uri = getRequestUri(
|
||||
'messaging', '/api/channels/global/${widget.channel.alias}/kick');
|
||||
var uri = getRequestUri('messaging', '/api/channels/global/${widget.channel.alias}');
|
||||
|
||||
var res = await auth.client!.post(
|
||||
var res = await auth.client!.delete(
|
||||
uri,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
@ -82,7 +81,7 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
setState(() => _isSubmitting = false);
|
||||
}
|
||||
|
||||
Future<void> inviteMember(String username) async {
|
||||
Future<void> addMember(String username) async {
|
||||
setState(() => _isSubmitting = true);
|
||||
|
||||
final auth = context.read<AuthProvider>();
|
||||
@ -91,8 +90,7 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
return;
|
||||
}
|
||||
|
||||
var uri = getRequestUri(
|
||||
'messaging', '/api/channels/global/${widget.channel.alias}/invite');
|
||||
var uri = getRequestUri('messaging', '/api/channels/${widget.realm}/${widget.channel.alias}');
|
||||
|
||||
var res = await auth.client!.post(
|
||||
uri,
|
||||
@ -122,10 +120,10 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
);
|
||||
if (input == null) return;
|
||||
|
||||
await inviteMember((input as Account).name);
|
||||
await addMember((input as Account).name);
|
||||
}
|
||||
|
||||
bool getKickable(ChannelMember item) {
|
||||
bool getRemovable(ChannelMember item) {
|
||||
if (_selfId != widget.channel.account.externalId) return false;
|
||||
if (item.accountId == widget.channel.accountId) return false;
|
||||
if (item.account.externalId == _selfId) return false;
|
||||
@ -156,9 +154,7 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
child: CustomScrollView(
|
||||
slivers: [
|
||||
SliverToBoxAdapter(
|
||||
child: _isSubmitting
|
||||
? const LinearProgressIndicator().animate().scaleX()
|
||||
: Container(),
|
||||
child: _isSubmitting ? const LinearProgressIndicator().animate().scaleX() : Container(),
|
||||
),
|
||||
SliverList.builder(
|
||||
itemCount: _members.length,
|
||||
@ -169,9 +165,7 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
|
||||
return Dismissible(
|
||||
key: Key(randomId.toString()),
|
||||
direction: getKickable(element)
|
||||
? DismissDirection.startToEnd
|
||||
: DismissDirection.none,
|
||||
direction: getRemovable(element) ? DismissDirection.startToEnd : DismissDirection.none,
|
||||
background: Container(
|
||||
color: Colors.red,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
@ -179,13 +173,12 @@ class _ChatMemberScreenState extends State<ChatMemberScreen> {
|
||||
child: const Icon(Icons.remove, color: Colors.white),
|
||||
),
|
||||
child: ListTile(
|
||||
leading: AccountAvatar(
|
||||
source: element.account.avatar, direct: true),
|
||||
leading: AccountAvatar(source: element.account.avatar, direct: true),
|
||||
title: Text(element.account.nick),
|
||||
subtitle: Text(element.account.name),
|
||||
),
|
||||
onDismissed: (_) {
|
||||
kickMember(element);
|
||||
removeMember(element);
|
||||
},
|
||||
);
|
||||
},
|
||||
|
@ -21,8 +21,9 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
class ChatScreen extends StatelessWidget {
|
||||
final String alias;
|
||||
final String realm;
|
||||
|
||||
const ChatScreen({super.key, required this.alias});
|
||||
const ChatScreen({super.key, required this.alias, this.realm = 'global'});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -37,31 +38,35 @@ class ChatScreen extends StatelessWidget {
|
||||
ChannelCallAction(
|
||||
call: chat.ongoingCall,
|
||||
channel: chat.focusChannel!,
|
||||
onUpdate: () => chat.fetchChannel(chat.focusChannel!.alias),
|
||||
realm: realm,
|
||||
onUpdate: () => chat.fetchChannel(chat.focusChannel!.alias, realm),
|
||||
),
|
||||
ChannelManageAction(
|
||||
channel: chat.focusChannel!,
|
||||
onUpdate: () => chat.fetchChannel(chat.focusChannel!.alias),
|
||||
realm: realm,
|
||||
onUpdate: () => chat.fetchChannel(chat.focusChannel!.alias, realm),
|
||||
),
|
||||
]
|
||||
: [],
|
||||
child: ChatScreenWidget(
|
||||
child: ChatWidget(
|
||||
alias: alias,
|
||||
realm: realm,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ChatScreenWidget extends StatefulWidget {
|
||||
class ChatWidget extends StatefulWidget {
|
||||
final String alias;
|
||||
final String realm;
|
||||
|
||||
const ChatScreenWidget({super.key, required this.alias});
|
||||
const ChatWidget({super.key, required this.alias, required this.realm});
|
||||
|
||||
@override
|
||||
State<ChatScreenWidget> createState() => _ChatScreenWidgetState();
|
||||
State<ChatWidget> createState() => _ChatWidgetState();
|
||||
}
|
||||
|
||||
class _ChatScreenWidgetState extends State<ChatScreenWidget> {
|
||||
class _ChatWidgetState extends State<ChatWidget> {
|
||||
bool _isReady = false;
|
||||
|
||||
final PagingController<int, Message> _pagingController = PagingController(firstPageKey: 0);
|
||||
@ -77,7 +82,7 @@ class _ChatScreenWidgetState extends State<ChatScreenWidget> {
|
||||
|
||||
var uri = getRequestUri(
|
||||
'messaging',
|
||||
'/api/channels/global/${widget.alias}/messages?take=$take&offset=$offset',
|
||||
'/api/channels/${widget.realm}/${widget.alias}/messages?take=$take&offset=$offset',
|
||||
);
|
||||
|
||||
var res = await auth.client!.get(uri);
|
||||
@ -147,8 +152,8 @@ class _ChatScreenWidgetState extends State<ChatScreenWidget> {
|
||||
super.initState();
|
||||
|
||||
Future.delayed(Duration.zero, () {
|
||||
_chat.fetchOngoingCall(widget.alias);
|
||||
_chat.fetchChannel(widget.alias);
|
||||
_chat.fetchOngoingCall(widget.alias, widget.realm);
|
||||
_chat.fetchChannel(widget.alias, widget.realm);
|
||||
});
|
||||
}
|
||||
|
||||
@ -232,6 +237,7 @@ class _ChatScreenWidgetState extends State<ChatScreenWidget> {
|
||||
),
|
||||
),
|
||||
ChatMessageEditor(
|
||||
realm: widget.realm,
|
||||
channel: widget.alias,
|
||||
editing: _editingItem,
|
||||
replying: _replyingItem,
|
||||
|
@ -9,8 +9,9 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
|
||||
|
||||
class ChatDetailScreen extends StatefulWidget {
|
||||
final Channel channel;
|
||||
final String realm;
|
||||
|
||||
const ChatDetailScreen({super.key, required this.channel});
|
||||
const ChatDetailScreen({super.key, required this.channel, this.realm = 'global'});
|
||||
|
||||
@override
|
||||
State<ChatDetailScreen> createState() => _ChatDetailScreenState();
|
||||
@ -24,6 +25,7 @@ class _ChatDetailScreenState extends State<ChatDetailScreen> {
|
||||
context: context,
|
||||
builder: (context) => ChannelDeletion(
|
||||
channel: widget.channel,
|
||||
realm: widget.realm,
|
||||
isOwned: _isOwned,
|
||||
),
|
||||
);
|
||||
|
@ -23,29 +23,15 @@ class ChatListScreen extends StatelessWidget {
|
||||
title: AppLocalizations.of(context)!.chat,
|
||||
appBarActions: const [NotificationButton()],
|
||||
fixedAppBarColor: SolianTheme.isLargeScreen(context),
|
||||
child: ChatListWidget(
|
||||
onSelect: (item) {
|
||||
if (SolianRouter.currentRoute.name == 'chat.channel') {
|
||||
SolianRouter.router.pushReplacementNamed(
|
||||
'chat.channel',
|
||||
pathParameters: {'channel': item.alias},
|
||||
);
|
||||
} else {
|
||||
SolianRouter.router.pushNamed(
|
||||
'chat.channel',
|
||||
pathParameters: {'channel': item.alias},
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
child: const ChatListWidget(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ChatListWidget extends StatefulWidget {
|
||||
final Function(Channel item)? onSelect;
|
||||
final String? realm;
|
||||
|
||||
const ChatListWidget({super.key, this.onSelect});
|
||||
const ChatListWidget({super.key, this.realm});
|
||||
|
||||
@override
|
||||
State<ChatListWidget> createState() => _ChatListWidgetState();
|
||||
@ -58,7 +44,12 @@ class _ChatListWidgetState extends State<ChatListWidget> {
|
||||
final auth = context.read<AuthProvider>();
|
||||
if (!await auth.isAuthorized()) return;
|
||||
|
||||
var uri = getRequestUri('messaging', '/api/channels/global/me/available');
|
||||
Uri uri;
|
||||
if (widget.realm == null) {
|
||||
uri = getRequestUri('messaging', '/api/channels/global/me/available');
|
||||
} else {
|
||||
uri = getRequestUri('messaging', '/api/channels/${widget.realm}');
|
||||
}
|
||||
|
||||
var res = await auth.client!.get(uri);
|
||||
if (res.statusCode == 200) {
|
||||
@ -75,7 +66,10 @@ class _ChatListWidgetState extends State<ChatListWidget> {
|
||||
void viewNewChatAction() {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
builder: (context) => ChatNewAction(onUpdate: () => fetchChannels()),
|
||||
builder: (context) => ChatNewAction(
|
||||
onUpdate: () => fetchChannels(),
|
||||
realm: widget.realm,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@ -128,17 +122,24 @@ class _ChatListWidgetState extends State<ChatListWidget> {
|
||||
title: Text(element.name),
|
||||
subtitle: Text(element.description),
|
||||
onTap: () async {
|
||||
if (widget.onSelect != null) {
|
||||
widget.onSelect!(element);
|
||||
return;
|
||||
String? result;
|
||||
if (SolianRouter.currentRoute.name == 'chat.channel') {
|
||||
result = await SolianRouter.router.pushReplacementNamed(
|
||||
widget.realm == null ? 'chat.channel' : 'realms.chat.channel',
|
||||
pathParameters: {
|
||||
'channel': element.alias,
|
||||
...(widget.realm == null ? {} : {'realm': widget.realm!}),
|
||||
},
|
||||
);
|
||||
} else {
|
||||
result = await SolianRouter.router.pushNamed(
|
||||
widget.realm == null ? 'chat.channel' : 'realms.chat.channel',
|
||||
pathParameters: {
|
||||
'channel': element.alias,
|
||||
...(widget.realm == null ? {} : {'realm': widget.realm!}),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
final result = await SolianRouter.router.pushNamed(
|
||||
'chat.channel',
|
||||
pathParameters: {
|
||||
'channel': element.alias,
|
||||
},
|
||||
);
|
||||
switch (result) {
|
||||
case 'refresh':
|
||||
fetchChannels();
|
||||
|
Reference in New Issue
Block a user