blob: 621e1673d63694c712517c8d1c0293389f88a30f [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@JS()
library gapi_onload;
import 'dart:async';
import 'package:js/js.dart';
import 'package:flutter/foundation.dart' show visibleForTesting;
import 'generated/gapi.dart' as gapi;
import 'utils.dart' show injectJSLibraries;
@JS()
external set gapiOnloadCallback(Function callback);
// This name must match the external setter above
/// This is only exposed for testing. It shouldn't be accessed by users of the
/// plugin as it could break at any point.
@visibleForTesting
const String kGapiOnloadCallbackFunctionName = 'gapiOnloadCallback';
String _addOnloadToScript(String url) => url.startsWith('data:')
? url
: '$url?onload=$kGapiOnloadCallbackFunctionName';
/// Injects the GAPI library by its [url], and other additional [libraries].
///
/// GAPI has an onload API where it'll call a callback when it's ready, JSONP style.
Future<void> inject(String url, {List<String> libraries = const <String>[]}) {
// Inject the GAPI library, and configure the onload global
final Completer<void> gapiOnLoad = Completer<void>();
gapiOnloadCallback = allowInterop(() {
// Funnel the GAPI onload to a Dart future
gapiOnLoad.complete();
});
// Attach the onload callback to the main url
final List<String> allLibraries = <String>[_addOnloadToScript(url)]
..addAll(libraries);
return Future.wait(
<Future<void>>[injectJSLibraries(allLibraries), gapiOnLoad.future]);
}
/// Initialize the global gapi object so 'auth2' can be used.
/// Returns a promise that resolves when 'auth2' is ready.
Future<void> init() {
final Completer<void> gapiLoadCompleter = Completer<void>();
gapi.load('auth2', allowInterop(() {
gapiLoadCompleter.complete();
}));
// After this resolves, we can use gapi.auth2!
return gapiLoadCompleter.future;
}