Skip to content

Commit c748c17

Browse files
committed
wip nfc propagate InternalLink up; TODO update doc; test?
1 parent 77ca60f commit c748c17

File tree

3 files changed

+22
-11
lines changed

3 files changed

+22
-11
lines changed

lib/model/internal_link.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,14 @@ class NarrowLink extends InternalLink {
140140
/// better, but some kinds will be rare, even unheard-of:
141141
/// #narrow/stream/1-announce/stream/1-announce (duplicated operator)
142142
// TODO(#252): handle all valid narrow links, returning a search narrow
143-
Narrow? parseInternalLink(Uri url, PerAccountStore store) {
143+
InternalLink? parseInternalLink(Uri url, PerAccountStore store) {
144144
if (!_isInternalLink(url, store.realmUrl)) return null;
145145

146146
final (category, segments) = _getCategoryAndSegmentsFromFragment(url.fragment);
147147
switch (category) {
148148
case 'narrow':
149149
if (segments.isEmpty || !segments.length.isEven) return null;
150-
return _interpretNarrowSegments(segments, store)?.narrow;
150+
return _interpretNarrowSegments(segments, store);
151151
}
152152
return null;
153153
}

lib/widgets/content.dart

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1535,15 +1535,17 @@ void _launchUrl(BuildContext context, String urlString) async {
15351535
return;
15361536
}
15371537

1538-
final internalNarrow = parseInternalLink(url, store);
1539-
if (internalNarrow != null) {
1540-
unawaited(Navigator.push(context,
1541-
MessageListPage.buildRoute(context: context,
1542-
narrow: internalNarrow)));
1543-
return;
1538+
final internalLink = parseInternalLink(url, store);
1539+
assert(internalLink == null || internalLink.realmUrl == store.realmUrl);
1540+
switch (internalLink) {
1541+
case NarrowLink():
1542+
unawaited(Navigator.push(context,
1543+
MessageListPage.buildRoute(context: context,
1544+
narrow: internalLink.narrow)));
1545+
1546+
case null:
1547+
await PlatformActions.launchUrl(context, url);
15441548
}
1545-
1546-
await PlatformActions.launchUrl(context, url);
15471549
}
15481550

15491551
/// Like [Image.network], but includes [authHeader] if [src] is on-realm.

test/model/internal_link_test.dart

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,12 @@ void main() {
160160
test(urlString, () async {
161161
final store = await setupStore(realmUrl: realmUrl, streams: streams, users: users);
162162
final url = store.tryResolveUrl(urlString)!;
163-
check(parseInternalLink(url, store)).equals(expected);
163+
final result = parseInternalLink(url, store);
164+
if (expected == null) {
165+
check(result).isNull();
166+
} else {
167+
check(result).isA<NarrowLink>().narrow.equals(expected);
168+
}
164169
});
165170
}
166171
}
@@ -564,3 +569,7 @@ void main() {
564569
});
565570
});
566571
}
572+
573+
extension NarrowLinkChecks on Subject<NarrowLink> {
574+
Subject<Narrow> get narrow => has((x) => x.narrow, 'narrow');
575+
}

0 commit comments

Comments
 (0)