Skip to content

Commit c865ec7

Browse files
committed
wip nfc propagate InternalLink up; TODO update doc; test?
1 parent 6503046 commit c865ec7

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
@@ -1536,15 +1536,17 @@ void _launchUrl(BuildContext context, String urlString) async {
15361536
return;
15371537
}
15381538

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

15501552
/// 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)