Skip to content

Commit 3f8694c

Browse files
authored
TW-2947: Handle invitation link web page and routing (#2948)
1 parent 617c645 commit 3f8694c

File tree

5 files changed

+77
-4
lines changed

5 files changed

+77
-4
lines changed

lib/config/go_routes/app_route_paths.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@
33
/// This file contains all route paths used in go_router configuration
44
/// and navigation calls to ensure consistency and prevent typos.
55
abstract class AppRoutePaths {
6+
static const matrixId = 'matrixId';
7+
68
// Security routes
79
static const String roomsSecurityFull = '/rooms/security';
810
static const String contactsVisibilitySegment = 'contactsVisibility';
911
static const String contactsVisibilityFull =
1012
'$roomsSecurityFull/$contactsVisibilitySegment';
13+
14+
// Invitation route
15+
static const String invitationLinkFull = '/chat/:matrixId';
1116
}

lib/config/go_routes/go_router.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:fluffychat/pages/chat_draft/draft_chat_adaptive_scaffold.dart';
1414
import 'package:fluffychat/pages/chat_encryption_settings/chat_encryption_settings.dart';
1515
import 'package:fluffychat/pages/error_page/error_page.dart';
1616
import 'package:fluffychat/pages/homeserver_picker/homeserver_picker.dart';
17+
import 'package:fluffychat/pages/invitation_link_web/invitation_link_web.dart';
1718
import 'package:fluffychat/pages/login/on_auth_redirect.dart';
1819
import 'package:fluffychat/pages/new_group/new_group_chat_info.dart';
1920
import 'package:fluffychat/pages/personal_qr/personal_qr.dart';
@@ -119,6 +120,17 @@ abstract class AppRoutes {
119120
return defaultPageBuilder(context, const OnAuthRedirect());
120121
},
121122
),
123+
GoRoute(
124+
path: AppRoutePaths.invitationLinkFull,
125+
redirect: loggedOutRedirect,
126+
pageBuilder: (context, state) {
127+
final matrixId = state.pathParameters[AppRoutePaths.matrixId];
128+
return defaultPageBuilder(
129+
context,
130+
InvitationLinkWeb(matrixId: matrixId),
131+
);
132+
},
133+
),
122134
GoRoute(
123135
path: '/connect',
124136
pageBuilder: (context, state) =>
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import 'package:fluffychat/utils/url_launcher.dart';
2+
import 'package:flutter/cupertino.dart';
3+
import 'package:flutter/material.dart';
4+
import 'package:go_router/go_router.dart';
5+
import 'package:linagora_design_flutter/linagora_design_flutter.dart';
6+
7+
class InvitationLinkWeb extends StatefulWidget {
8+
final String? matrixId;
9+
10+
const InvitationLinkWeb({super.key, this.matrixId});
11+
12+
@override
13+
State<InvitationLinkWeb> createState() => _InvitationLinkWebState();
14+
}
15+
16+
class _InvitationLinkWebState extends State<InvitationLinkWeb> {
17+
@override
18+
void initState() {
19+
super.initState();
20+
WidgetsBinding.instance.addPostFrameCallback((_) {
21+
final matrixId = widget.matrixId;
22+
if (matrixId == null || matrixId.isEmpty) {
23+
context.go('/rooms');
24+
return;
25+
}
26+
UrlLauncher(
27+
context,
28+
url: widget.matrixId,
29+
).launchUrl(isInvitationLink: true);
30+
});
31+
}
32+
33+
@override
34+
Widget build(BuildContext context) {
35+
return Scaffold(
36+
body: Center(
37+
child: CupertinoActivityIndicator(
38+
color: LinagoraSysColors.material().onSurfaceVariant,
39+
),
40+
),
41+
);
42+
}
43+
}

lib/presentation/mixins/go_to_direct_chat_mixin.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ mixin GoToDraftChatMixin {
3434
required BuildContext context,
3535
required String path,
3636
required ContactPresentationSearch contactPresentationSearch,
37+
bool isInvitationLink = false,
3738
}) {
3839
final roomId = Matrix.of(
3940
context,
@@ -46,6 +47,7 @@ mixin GoToDraftChatMixin {
4647
context: context,
4748
path: path,
4849
contactPresentationSearch: contactPresentationSearch,
50+
isInvitationLink: isInvitationLink,
4951
);
5052
} else {
5153
TwakeDialog.showFutureLoadingDialogFullScreen(
@@ -79,10 +81,14 @@ mixin GoToDraftChatMixin {
7981
required BuildContext context,
8082
required String path,
8183
required ContactPresentationSearch contactPresentationSearch,
84+
bool isInvitationLink = false,
8285
}) {
8386
if (contactPresentationSearch.matrixId ==
8487
Matrix.of(context).client.userID) {
8588
TwakeSnackBar.show(context, L10n.of(context)!.cannotCreateChatWithSelf);
89+
if (isInvitationLink) {
90+
context.go('/rooms');
91+
}
8692
return;
8793
}
8894

lib/utils/url_launcher.dart

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ class UrlLauncher with GoToDraftChatMixin {
3131
? ChromeSafariBrowser()
3232
: null;
3333

34-
void launchUrl() {
34+
void launchUrl({bool isInvitationLink = false}) {
3535
if (url!.toLowerCase().startsWith(AppConfig.deepLinkPrefix) ||
3636
url!.toLowerCase().startsWith(AppConfig.inviteLinkPrefix) ||
3737
{'#', '@', '!', '+', '\$'}.contains(url![0]) ||
3838
url!.toLowerCase().startsWith(AppConfig.schemePrefix)) {
39-
return openMatrixToUrl();
39+
return openMatrixToUrl(isInvitationLink: isInvitationLink);
4040
}
4141
final uri = Uri.tryParse(url!);
4242
if (uri == null) {
@@ -50,7 +50,10 @@ class UrlLauncher with GoToDraftChatMixin {
5050
host: inviteUri.host,
5151
path: uri.path.replaceFirst('/chat', ''),
5252
);
53-
return openMatrixToUrl(matrixToUri.toString());
53+
return openMatrixToUrl(
54+
customUrl: matrixToUri.toString(),
55+
isInvitationLink: isInvitationLink,
56+
);
5457
}
5558
if (!{'https', 'http'}.contains(uri.scheme)) {
5659
// just launch non-https / non-http uris directly
@@ -111,7 +114,10 @@ class UrlLauncher with GoToDraftChatMixin {
111114
);
112115
}
113116

114-
void openMatrixToUrl([String? customUrl]) async {
117+
void openMatrixToUrl({
118+
String? customUrl,
119+
bool isInvitationLink = false,
120+
}) async {
115121
final matrix = Matrix.of(context);
116122
final url = (customUrl ?? this.url!).replaceFirst(
117123
AppConfig.deepLinkPrefix,
@@ -218,6 +224,7 @@ class UrlLauncher with GoToDraftChatMixin {
218224
onContactTap(
219225
context: context,
220226
path: 'rooms',
227+
isInvitationLink: isInvitationLink,
221228
contactPresentationSearch: ContactPresentationSearch(
222229
matrixId: identityParts.primaryIdentifier,
223230
displayName:

0 commit comments

Comments
 (0)