Skip to content

Commit

Permalink
Merge branch 'feature/refactor'
Browse files Browse the repository at this point in the history
  • Loading branch information
n1k3c committed Dec 28, 2019
2 parents 0f734cd + bb2d791 commit 0528156
Show file tree
Hide file tree
Showing 8 changed files with 160 additions and 141 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@
.pub/

build/

example/.flutter-plugins-dependencies
58 changes: 36 additions & 22 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## 0.1.5

* Refactor from events to method call
* Remove loading state (handle that in app)
* Better error handling

## 0.1.4

* Fix iOS bug
Expand Down
54 changes: 28 additions & 26 deletions android/src/main/kotlin/com/n1k3c/link_preview/LinkPreviewPlugin.kt
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package com.n1k3c.link_preview

import com.leocardz.link.preview.library.LinkPreviewCallback
import com.leocardz.link.preview.library.SourceContent
import com.leocardz.link.preview.library.TextCrawler
import io.flutter.plugin.common.EventChannel
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar
import com.leocardz.link.preview.library.SourceContent
import com.leocardz.link.preview.library.LinkPreviewCallback
import com.leocardz.link.preview.library.TextCrawler
import io.flutter.plugin.common.EventChannel
import java.util.*


private const val STATE = "state"
private const val STATE_LOADING = "loading"
private const val STATE_SUCCESS = "success"
private const val STATE_ERROR = "error"
private const val STATE_PARSING_ERROR = "parsing_error"
private const val STATE_WRONG_URL = "wrong_url_error"

private const val FIELD_TITLE = "title"
private const val FIELD_DESC = "description"
Expand All @@ -28,26 +27,33 @@ private const val FIELD_IMAGE = "image"

private const val ERROR_TYPE = "Link preview error"

class LinkPreviewPlugin : EventChannel.StreamHandler {
class LinkPreviewPlugin : MethodCallHandler {

companion object {
@JvmStatic
fun registerWith(registrar: Registrar) {
val eventChannel = EventChannel(registrar.messenger(), "link_preview_events")
eventChannel.setStreamHandler(LinkPreviewPlugin())
val channel = MethodChannel(registrar.messenger(), "link_preview_channel")
channel.setMethodCallHandler(LinkPreviewPlugin())
}
}

override fun onListen(arguments: Any, event: EventChannel.EventSink) {
override fun onMethodCall(call: MethodCall, result: Result) {
if (call.method.equals("previewLink")) {
val url: String? = call.argument("url")

previewLink(url, result)
} else {
result.notImplemented()
}
}

private fun previewLink(url: String?, result: Result) {
val data = mutableMapOf<String, String>()

val textCrawler = TextCrawler()

val linkPreviewCallback = object : LinkPreviewCallback {
override fun onPre() {
data[STATE] = STATE_LOADING
event.success(data)
}
override fun onPre() {}

override fun onPos(sourceContent: SourceContent, b: Boolean) {
if (sourceContent.isSuccess) {
Expand All @@ -61,23 +67,19 @@ class LinkPreviewPlugin : EventChannel.StreamHandler {
data[FIELD_ROW] = sourceContent.raw
data[FIELD_HTML_CODE] = sourceContent.htmlCode

event.success(data)
event.endOfStream()
result.success(data)
} else {
event.error(ERROR_TYPE, "Parsing URL error. Check your URL for typos and/or your connection", "")
event.endOfStream()
data[STATE] = STATE_PARSING_ERROR
result.success(data)
}
}
}

val url: String? = arguments.toString()

if (url.isNullOrBlank()) event.error(ERROR_TYPE, "URL is blank", "")
if (url.isNullOrBlank()) {
data[STATE] = STATE_WRONG_URL
result.success(data)
}

textCrawler.makePreview(linkPreviewCallback, url)
}

override fun onCancel(p0: Any?) {

}
}
35 changes: 24 additions & 11 deletions example/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,25 @@ class _MyAppState extends State<MyApp> {

Future<void> getLinks() async {
try {
await LinkPreview.getPreview('https://google.com',
onData: (PreviewResponse data) => _previewData(data),
onError: (error) => _handleError(error));
PreviewResponse previewResponse = await LinkPreview.getPreview('https://google.com');
_previewData(previewResponse);

PreviewResponse previewResponse2 = await LinkPreview.getPreview('https://facebook.com');
_previewData(previewResponse2);

PreviewResponse previewResponse3 = await LinkPreview.getPreview('https://amazon.com');
_previewData(previewResponse3);
} on PlatformException {
print('Error occured!!');
}
}

_previewData(PreviewResponse previewResponse) {
if (previewResponse.status == PreviewStatus.complete) {
_linkTitle = previewResponse.title;
if (previewResponse.status == PreviewStatus.success) {
setState(() {
_linkTitle = previewResponse.title;
});

print('===============================================');
print('Received status: ${previewResponse.status}');
print('Received title: ${previewResponse.title}');
Expand All @@ -45,19 +53,24 @@ class _MyAppState extends State<MyApp> {
print('Received html code: ${previewResponse.htmlCode}');
print('Received row: ${previewResponse.row}');
print('===============================================');
} else if (previewResponse.status == PreviewStatus.wrongUrlError) {
print('===============================================');
print('Received status: ${previewResponse.status}');
print('Wrong URL');
print('===============================================');
} else if (previewResponse.status == PreviewStatus.parsingError) {
print('===============================================');
print('Received status: ${previewResponse.status}');
print('Parsing URL error');
print('===============================================');
} else {
print('===============================================');
print('Received status: ${previewResponse.status}');
print('Other error');
print('===============================================');
}
}

static _handleError(error) {
print('===============================================');
print('Received error: ${error.message}');
print('===============================================');
}

@override
Widget build(BuildContext context) {
return MaterialApp(
Expand Down
94 changes: 39 additions & 55 deletions ios/Classes/SwiftLinkPreviewPlugin.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@ import UIKit
import SwiftLinkPreview

enum ChannelName {
static let linkPreview = "link_preview_events"
static let linkPreview = "link_preview_channel"
}

enum State {
static let state = "state"
static let loading = "loading"
static let success = "success"
static let error = "error"
static let parsingError = "parsing_error"
static let wrongUrlError = "wrong_url_error"
}

enum Field {
Expand All @@ -28,64 +29,47 @@ enum Error {
static let errorType = "Link preview error"
}

public class SwiftLinkPreviewPlugin: NSObject, FlutterPlugin, FlutterStreamHandler {

private var eventSink: FlutterEventSink?
public class SwiftLinkPreviewPlugin: NSObject, FlutterPlugin {

public static func register(with registrar: FlutterPluginRegistrar) {

let linkPreviewChannel = FlutterEventChannel(name: ChannelName.linkPreview,
let linkPreviewChannel = FlutterMethodChannel(name: ChannelName.linkPreview,
binaryMessenger: registrar.messenger())

linkPreviewChannel.setStreamHandler(SwiftLinkPreviewPlugin())

registrar.addMethodCallDelegate(SwiftLinkPreviewPlugin(), channel: linkPreviewChannel)
}

public func onListen(withArguments arguments: Any?, eventSink: @escaping FlutterEventSink) -> FlutterError? {
self.eventSink = eventSink

guard let url = arguments as? String else {
let error = FlutterError(code: Error.errorType, message: "Parsing URL error. Check your URL for typos and/or your connection", details: "")
eventSink(error)
return nil
}

previewLink(url: url)
return nil
}

private func previewLink(url: String) {
guard let eventSink = eventSink else {
return
}

eventSink([State.state : State.loading])

let slp = SwiftLinkPreview(session: URLSession.shared,
workQueue: SwiftLinkPreview.defaultWorkQueue,
responseQueue: DispatchQueue.main,
cache: DisabledCache.instance)

slp.preview(url,
onSuccess: {
result in print("\(result)")
let result = [State.state : State.success,
Field.title : result.title,
Field.description : result.description,
Field.url : result.url?.absoluteString,
Field.finalUrl : result.finalUrl?.absoluteString,
Field.cannonicalUrl : result.canonicalUrl!,
Field.image : result.image]
eventSink(result)
},
onError: {
error in print("\(error)")
eventSink(FlutterError(code: Error.errorType, message: "Parsing URL error. Check your URL for typos and/or your connection", details: ""))
})
}

public func onCancel(withArguments arguments: Any?) -> FlutterError? {
eventSink = nil
return nil
}

public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
if(call.method.elementsEqual("previewLink")){
let arguments = call.arguments as? NSDictionary
guard let url = arguments!["url"] as? String else {
result([State.state : State.wrongUrlError])
return
}

let slp = SwiftLinkPreview(session: URLSession.shared,
workQueue: SwiftLinkPreview.defaultWorkQueue,
responseQueue: DispatchQueue.main,
cache: DisabledCache.instance)

slp.preview(url,
onSuccess: {
res in print("\(res)")
let data = [State.state : State.success,
Field.title : res.title,
Field.description : res.description,
Field.url : res.url?.absoluteString,
Field.finalUrl : res.finalUrl?.absoluteString,
Field.cannonicalUrl : res.canonicalUrl!,
Field.image : res.image]
result(data)

},
onError: {
error in print("\(error)")
result([State.state : State.parsingError])
})
}
}
}
Loading

0 comments on commit 0528156

Please sign in to comment.