Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions lib/config/go_routes/app_route_paths.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@
/// This file contains all route paths used in go_router configuration
/// and navigation calls to ensure consistency and prevent typos.
abstract class AppRoutePaths {
static const matrixId = 'matrixId';

// Security routes
static const String roomsSecurityFull = '/rooms/security';
static const String contactsVisibilitySegment = 'contactsVisibility';
static const String contactsVisibilityFull =
'$roomsSecurityFull/$contactsVisibilitySegment';

// Invitation route
static const String invitationLinkFull = '/chat/:matrixId';
}
12 changes: 12 additions & 0 deletions lib/config/go_routes/go_router.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:fluffychat/pages/chat_draft/draft_chat_adaptive_scaffold.dart';
import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart';
import 'package:fluffychat/pages/error_page/error_page.dart';
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart';
import 'package:fluffychat/pages/invitation_link_web/invitation_link_web.dart';
import 'package:fluffychat/pages/login/on_auth_redirect.dart';
import 'package:fluffychat/pages/new_group/new_group_chat_info.dart';
import 'package:fluffychat/pages/personal_qr/personal_qr.dart';
Expand Down Expand Up @@ -119,6 +120,17 @@ abstract class AppRoutes {
return defaultPageBuilder(context, const OnAuthRedirect());
},
),
GoRoute(
path: AppRoutePaths.invitationLinkFull,
redirect: loggedOutRedirect,
pageBuilder: (context, state) {
final matrixId = state.pathParameters[AppRoutePaths.matrixId];
return defaultPageBuilder(
context,
InvitationLinkWeb(matrixId: matrixId),
);
},
),
GoRoute(
path: '/connect',
pageBuilder: (context, state) =>
Expand Down
43 changes: 43 additions & 0 deletions lib/pages/invitation_link_web/invitation_link_web.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import 'package:fluffychat/utils/url_launcher.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:linagora_design_flutter/linagora_design_flutter.dart';

class InvitationLinkWeb extends StatefulWidget {
final String? matrixId;

const InvitationLinkWeb({super.key, this.matrixId});

@override
State<InvitationLinkWeb> createState() => _InvitationLinkWebState();
}

class _InvitationLinkWebState extends State<InvitationLinkWeb> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final matrixId = widget.matrixId;
if (matrixId == null || matrixId.isEmpty) {
context.go('/rooms');
return;
}
UrlLauncher(
context,
url: widget.matrixId,
).launchUrl(isInvitationLink: true);
});
}

@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: CupertinoActivityIndicator(
color: LinagoraSysColors.material().onSurfaceVariant,
),
),
);
}
}
6 changes: 6 additions & 0 deletions lib/presentation/mixins/go_to_direct_chat_mixin.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ mixin GoToDraftChatMixin {
required BuildContext context,
required String path,
required ContactPresentationSearch contactPresentationSearch,
bool isInvitationLink = false,
}) {
final roomId = Matrix.of(
context,
Expand All @@ -46,6 +47,7 @@ mixin GoToDraftChatMixin {
context: context,
path: path,
contactPresentationSearch: contactPresentationSearch,
isInvitationLink: isInvitationLink
);
} else {
TwakeDialog.showFutureLoadingDialogFullScreen(
Expand Down Expand Up @@ -79,10 +81,14 @@ mixin GoToDraftChatMixin {
required BuildContext context,
required String path,
required ContactPresentationSearch contactPresentationSearch,
bool isInvitationLink = false,
}) {
if (contactPresentationSearch.matrixId ==
Matrix.of(context).client.userID) {
TwakeSnackBar.show(context, L10n.of(context)!.cannotCreateChatWithSelf);
if (isInvitationLink) {
context.go('/rooms');
}
return;
}

Expand Down
13 changes: 10 additions & 3 deletions lib/utils/url_launcher.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class UrlLauncher with GoToDraftChatMixin {
? ChromeSafariBrowser()
: null;

void launchUrl() {
void launchUrl({bool isInvitationLink = false}) {
if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) ||
url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) ||
{'#', '@', '!', '+', '\$'}.contains(url![0]) ||
Expand All @@ -50,7 +50,10 @@ class UrlLauncher with GoToDraftChatMixin {
host: inviteUri.host,
path: uri.path.replaceFirst('/chat', ''),
);
return openMatrixToUrl(matrixToUri.toString());
return openMatrixToUrl(
customUrl: matrixToUri.toString(),
isInvitationLink: isInvitationLink,
);
}
if (!{'https', 'http'}.contains(uri.scheme)) {
// just launch non-https / non-http uris directly
Expand Down Expand Up @@ -111,7 +114,10 @@ class UrlLauncher with GoToDraftChatMixin {
);
}

void openMatrixToUrl([String? customUrl]) async {
void openMatrixToUrl({
String? customUrl,
bool isInvitationLink = false,
}) async {
final matrix = Matrix.of(context);
final url = (customUrl ?? this.url!).replaceFirst(
AppConfig.deepLinkPrefix,
Expand Down Expand Up @@ -218,6 +224,7 @@ class UrlLauncher with GoToDraftChatMixin {
onContactTap(
context: context,
path: 'rooms',
isInvitationLink: true,
contactPresentationSearch: ContactPresentationSearch(
matrixId: identityParts.primaryIdentifier,
displayName:
Expand Down
Loading