Skip to content

Commit

Permalink
fixed preview with link_preview_generator package
Browse files Browse the repository at this point in the history
  • Loading branch information
lielb100 committed Oct 21, 2021
1 parent e5d7873 commit 5b043c4
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 34 deletions.
13 changes: 7 additions & 6 deletions lib/state/feedState.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import 'package:flutter_twitter_clone/helper/utility.dart';
import 'package:flutter_twitter_clone/model/user.dart';
import 'package:flutter_twitter_clone/state/appState.dart';
import 'package:flutter_twitter_clone/ui/page/common/locator.dart';
import 'package:link_preview_generator/link_preview_generator.dart'
show WebInfo;
import 'package:path/path.dart' as path;
import 'package:translator/translator.dart';
import 'package:flutter_chat_types/flutter_chat_types.dart' show PreviewData;
// import 'package:flutter_chat_types/flutter_chat_types.dart' show PreviewData;
// import 'authState.dart';

class FeedState extends AppState {
Expand Down Expand Up @@ -76,11 +78,10 @@ class FeedState extends AppState {
return list;
}

Map<String, PreviewData> _linkDataPreviews = {};
Map<String, PreviewData> get linkDataPreviews => _linkDataPreviews;
void addPreviewData(String url, PreviewData previewData) {
_linkDataPreviews.addAll({url: previewData});
notifyListeners();
Map<String, WebInfo> _linkWebInfos = {};
Map<String, WebInfo> get linkWebInfos => _linkWebInfos;
void addWebInfo(String url, WebInfo webInfo) {
_linkWebInfos.addAll({url: webInfo});
}

Map<String, Translation?> _tweetsTranslations = {};
Expand Down
145 changes: 118 additions & 27 deletions lib/widgets/url_text/link_preview.dart
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_link_previewer/flutter_link_previewer.dart';
import 'package:link_preview_generator/link_preview_generator.dart';

import 'package:flutter_twitter_clone/helper/utility.dart';
import 'package:flutter_twitter_clone/state/feedState.dart';
import 'package:flutter_twitter_clone/ui/theme/theme.dart';
import 'package:link_preview_generator/src/utils/analyzer.dart'
show
LinkPreviewAnalyzer; //FIXME Don't import implementation files from another package.
import 'package:provider/provider.dart';

class LinkPreviewer extends StatelessWidget {
Expand All @@ -31,42 +34,130 @@ class LinkPreviewer extends StatelessWidget {
@override
Widget build(BuildContext context) {
var state = Provider.of<FeedState>(context, listen: false);

var uri = url ?? getUrl();
if (uri == null) {
return const SizedBox.shrink();
} else if (uri.contains("page.link/")) {
/// `flutter_link_preview` package is unable to fetch firebase dynamic link meta data
return const SizedBox.shrink();
}
final style = TextStyle(
fontSize: 0,
);

try {
return LinkPreview(
enableAnimation: false,
onPreviewDataFetched: (data) {
state.addPreviewData(uri, data);
},
imageBuilder: (image) {
return ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: CachedNetworkImage(
imageUrl: image,
if (state.linkWebInfos.containsKey(uri))
return _buildLinkPreview(
state.linkWebInfos[uri]!, uri, Theme.of(context));
return FutureBuilder(
builder: (BuildContext context, AsyncSnapshot<WebInfo> snapshot) {
if (snapshot.hasData) {
state.addWebInfo(uri, snapshot.data!);
return _buildLinkPreview(snapshot.data!, uri, Theme.of(context));
}
if (snapshot.hasError) {
return SizedBox.shrink();
}
return Container(
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: const Color.fromRGBO(248, 248, 248, 1.0),
),
).ripple(() {
Utility.launchURL(uri);
});
alignment: Alignment.center,
child: const Text('Fetching data...'),
);
},
linkStyle: style,
previewData:
state.linkDataPreviews[uri], // Pass the preview data from the state
text: uri,
width: MediaQuery.of(context).size.width,
future: LinkPreview.scrapeFromURL(uri));
}

Widget _buildLinkPreview(WebInfo info, String uri, ThemeData theme) {
var image = LinkPreviewAnalyzer.isNotEmpty(info.image)
? info.image
: LinkPreviewAnalyzer.isNotEmpty(info.icon)
? info.icon
: ""; //TODO Placeholder/error image
if (!LinkPreviewAnalyzer.isNotEmpty(info.title) &&
LinkPreviewAnalyzer.isNotEmpty(info.image)) {
return CachedNetworkImage(
imageUrl: image,
fit: BoxFit.contain,
).ripple(
() {
Utility.launchURL(uri);
},
borderRadius: BorderRadius.circular(10),
);
} catch (e) {
cprint(e);
return SizedBox.shrink();
}
if (!LinkPreviewAnalyzer.isNotEmpty(info.title)) return const SizedBox();

return Padding(
padding: const EdgeInsets.only(top: 8),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10),
border: Border.all(color: AppColor.extraLightGrey),
color: theme.colorScheme.onPrimary),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
if (LinkPreviewAnalyzer.isNotEmpty(image))
ClipRRect(
borderRadius: BorderRadius.vertical(top: Radius.circular(10)),
child: Container(
height: 140,
width: double.infinity,
decoration: BoxDecoration(
border: Border(
bottom: BorderSide(color: theme.dividerColor, width: 1),
),
),
child: CachedNetworkImage(
imageUrl: image,
fit: BoxFit.cover,
),
),
),
const SizedBox(height: 4),
if (LinkPreviewAnalyzer.isNotEmpty(info.title))
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: Text(
info.title.trim(),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyles.titleStyle.copyWith(
fontSize: 14,
fontWeight: FontWeight.bold,
color: Colors.black87),
),
),
if (LinkPreviewAnalyzer.isNotEmpty(info.description))
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
child: Text(
info.description.trim(),
maxLines: 2,
overflow: TextOverflow.ellipsis,
style: TextStyles.subtitleStyle.copyWith(fontSize: 12),
),
),
Padding(
padding: EdgeInsets.only(bottom: 5, left: 8, right: 8),
child: Text(
Uri.tryParse(uri)!.authority,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyles.subtitleStyle.copyWith(
fontWeight: FontWeight.w400,
fontSize: info.title.isNotEmpty ? 14 : 16),
),
),
],
),
).ripple(
() {
Utility.launchURL(uri);
},
borderRadius: BorderRadius.circular(8),
),
);
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ dependencies:
qr_code_scanner: ^0.5.2
qr_flutter: ^4.0.0
rxdart: ^0.27.2
flutter_link_previewer: ^2.5.2
translator: ^0.1.7
flutter_chat_types: ^3.1.4
link_preview_generator: ^1.2.0

dev_dependencies:
test: ^1.17.10
Expand Down

0 comments on commit 5b043c4

Please sign in to comment.