Skip to content

Instantly share code, notes, and snippets.

@kitasuke
Created January 23, 2017 00:30
Show Gist options
  • Star 7 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kitasuke/7e215bc8d3b1d02e6467b8b8b449670e to your computer and use it in GitHub Desktop.
Save kitasuke/7e215bc8d3b1d02e6467b8b8b449670e to your computer and use it in GitHub Desktop.
import Foundation
import RxSwift
import FBSDKCoreKit
import FBSDKLoginKit
enum FacebookSDKError: Error {
case tokenNotFound
}
extension Reactive where Base: FBSDKLoginManager {
func login(from: UIViewController?) -> Observable<FBSDKAccessToken> {
return Observable.create { [weak base] observer in
base?.logIn(withReadPermissions: ["public_profile", "email", "user_birthday", "user_photos"], from: from) { result, error in
if let error = error {
observer.on(.error(error))
return
}
guard let token = result?.token else {
observer.on(.error(FacebookSDKError.tokenNotFound))
return
}
observer.on(.next(token))
observer.on(.completed)
}
return Disposables.create()
}
}
}
extension Reactive where Base: FBSDKGraphRequest {
typealias MeResponse = (name: String?, email: String?, gender: String?, birthday: String?, photos: [String]?)
static func fetchMe() -> Observable<MeResponse> {
return Observable.create { observer in
let request = FBSDKGraphRequest(graphPath: "me", parameters: ["fields": "name, email, gender, birthday, photos"])
let task = request?.start { connection, result, error in
if let error = error {
observer.on(.error(error))
return
}
guard let result = result as? [AnyHashable: Any] else {
observer.on(.error(FacebookSDKError.tokenNotFound))
return
}
let name = result["name"] as? String
let email = result["email"] as? String
let gender = result["gender"] as? String
let birthday = result["birthday"] as? String
let photos = result["photos"] as? [String]
let response = MeResponse(name: name, email: email, gender: gender, birthday: birthday, photos: photos)
observer.on(.next(response))
observer.on(.completed)
}
return Disposables.create {
task?.cancel()
}
}
}
}
@lexuanquynh
Copy link

can you give a sample use your code?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment