Skip to content

Instantly share code, notes, and snippets.

@nukotsuka
Last active May 11, 2022 04:32
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nukotsuka/277d921781480798d7dcb453af819acd to your computer and use it in GitHub Desktop.
Save nukotsuka/277d921781480798d7dcb453af819acd to your computer and use it in GitHub Desktop.
LIFF SDK wrapper for Dart generated by js_facade_gen
@JS()
library liff;
import 'package:js/js.dart';
import 'package:js/js_util.dart' show promiseToFuture;
@JS()
external Liff get liff;
@anonymous
@JS()
abstract class Liff {
external String /*'ios'|'android'|'web'*/ getOS();
external String getVersion();
external String getLanguage();
external bool isInClient();
external bool isLoggedIn();
external void login([LoginConfig loginConfig]);
external void logout();
external String /*String|Null*/ getAccessToken();
external String /*String|Null*/ getIDToken();
external JWTPayload /*JWTPayload|Null*/ getDecodedIDToken();
external Context /*Context|Null*/ getContext();
external void openWindow(OpenWindowParams params);
external void closeWindow();
external List<String> getFeatures();
external bool checkFeature(String feature);
external AIdInterface getAId();
external ProfilePlusInterface getProfilePlus();
external bool getIsVideoAutoPlay();
external String /*String|Null*/ getLineVersion();
external bool isApiAvailable(String /*'shareTargetPicker'*/ apiName);
external PermanentLink get permanentLink;
external set permanentLink(PermanentLink v);
external String /*String|Null*/ get id;
external void JS$_dispatchEvent(String json);
external void JS$_addListener(String type, ClientCallback callback);
external void JS$_removeListener(String type, ClientCallback callback);
external void JS$_postMessage(
String type, [
dynamic /*{}*/ params,
String callbackId,
]);
}
@anonymous
@JS()
abstract class _Liff {
external Promise<void> init(
/*Liff this*/ InitConfig config, [
void Function() successCallback,
void Function(Error error) errorCallback,
]);
external Promise<Friendship> getFriendship();
external Promise<Profile> getProfile();
external Promise<void> sendMessages(List<dynamic> messages);
external Promise<String /*String|Null*/ > userPicker([
UserPickerOptions options,
]);
external Promise<dynamic /*ShareTargetPickerResult|void*/ > shareTargetPicker(
List<dynamic> messages,
);
external Promise<void> get ready;
external set ready(Promise<void> v);
external Promise<dynamic> JS$_call(
String type, [
dynamic params,
CallOptions options,
]);
/// LiffExtendableAll
external Promise<num> addToHomeScreen(AddToHomeScreenParams params);
external Promise<ScanCodeResult> scanCode();
external Promise<String /*Null|String*/ > getAdvertisingId();
external Promise<List<void>> initPlugins(
List<String /*'bluetooth'|'advertisement'*/ > plugins,
);
}
extension LiffExtensions on Liff {
Future<void> init(
/*Liff this*/ InitConfig config, [
void Function() successCallback,
void Function(Error error) errorCallback,
]) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(
tt.init(/*Liff this*/ config, successCallback, errorCallback),
);
}
Future<Friendship> getFriendship() {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.getFriendship());
}
Future<Profile> getProfile() {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.getProfile());
}
Future<void> sendMessages(List<dynamic> messages) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.sendMessages(messages));
}
Future<String /*String|Null*/ > userPicker([UserPickerOptions options]) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.userPicker(options));
}
Future<dynamic /*ShareTargetPickerResult|void*/ > shareTargetPicker(
List<dynamic> messages,
) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.shareTargetPicker(messages));
}
Future<void> get ready {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.ready);
}
set ready(Future<void> v) {
final Object t = this;
final _Liff tt = t;
// ignore: cascade_invocations
tt.ready = Promise<void>(allowInterop((resolve, reject) {
v.then(resolve, onError: reject);
}));
}
Future<dynamic> JS$_call(String type, [dynamic params, CallOptions options]) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.JS$_call(type, params, options));
}
Future<num> addToHomeScreen(AddToHomeScreenParams params) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.addToHomeScreen(params));
}
Future<ScanCodeResult> scanCode() {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.scanCode());
}
Future<String /*Null|String*/ > getAdvertisingId() {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.getAdvertisingId());
}
Future<List<void>> initPlugins(
List<String /*'bluetooth'|'advertisement'*/ > plugins) {
final Object t = this;
final _Liff tt = t;
return promiseToFuture(tt.initPlugins(plugins));
}
}
@anonymous
@JS()
abstract class Error {
external String get name;
external set name(String v);
external String get message;
external set message(String v);
external String get stack;
external set stack(String v);
external factory Error({String name, String message, String stack});
}
typedef ClientCallback = void Function(CustomEvent e);
@anonymous
@JS()
abstract class InitConfig {
external String get liffId;
external set liffId(String v);
external factory InitConfig({String liffId});
}
@anonymous
@JS()
abstract class LoginConfig {
external String get redirectUri;
external set redirectUri(String v);
external factory LoginConfig({String redirectUri});
}
@anonymous
@JS()
abstract class JWTPayload {
external String get iss;
external set iss(String v);
external String get sub;
external set sub(String v);
external String get aud;
external set aud(String v);
external num get exp;
external set exp(num v);
external num get iat;
external set iat(num v);
external num get auth_time;
external set auth_time(num v);
external String get nonce;
external set nonce(String v);
external List<String> get amr;
external set amr(List<String> v);
external String get name;
external set name(String v);
external String get picture;
external set picture(String v);
external String get email;
external set email(String v);
external factory JWTPayload({
String iss,
String sub,
String aud,
num exp,
num iat,
num auth_time,
String nonce,
List<String> amr,
String name,
String picture,
String email,
});
}
@anonymous
@JS()
abstract class Friendship {
external bool get friendFlag;
external set friendFlag(bool v);
external factory Friendship({bool friendFlag});
}
@anonymous
@JS()
abstract class Context {
external String /*'utou'|'room'|'group'|'none'*/ get type;
external set type(String /*'utou'|'room'|'group'|'none'*/ v);
external String get utouId;
external set utouId(String v);
external String get roomId;
external set roomId(String v);
external String get groupId;
external set groupId(String v);
external String get userId;
external set userId(String v);
external String get endpointUrl;
external set endpointUrl(String v);
external String get viewType;
external set viewType(String v);
external String get accessTokenHash;
external set accessTokenHash(String v);
external String /*'replace'|'concat'*/ get permanentLinkPattern;
external set permanentLinkPattern(String /*'replace'|'concat'*/ v);
external ProfilePlusInterface get profilePlus;
external set profilePlus(ProfilePlusInterface v);
external DeviceRelatedSettings get d;
external set d(DeviceRelatedSettings v);
external Availability get availability;
external set availability(Availability v);
external factory Context({
String /*'utou'|'room'|'group'|'none'*/ type,
String utouId,
String roomId,
String groupId,
String userId,
String endpointUrl,
String viewType,
String accessTokenHash,
String /*'replace'|'concat'*/ permanentLinkPattern,
ProfilePlusInterface profilePlus,
DeviceRelatedSettings d,
Availability availability,
});
}
@anonymous
@JS()
abstract class AIdInterface {
external String get id;
external set id(String v);
external bool get t;
external set t(bool v);
external factory AIdInterface({String id, bool t});
}
@anonymous
@JS()
abstract class ProfilePlusInterface {
external String get regionCode;
external set regionCode(String v);
external factory ProfilePlusInterface({String regionCode});
}
@anonymous
@JS()
abstract class Profile {
external String get userId;
external set userId(String v);
external String get displayName;
external set displayName(String v);
external String get pictureUrl;
external set pictureUrl(String v);
external String get statusMessage;
external set statusMessage(String v);
external factory Profile({
String userId,
String displayName,
String pictureUrl,
String statusMessage,
});
}
@anonymous
@JS()
abstract class UserPickerOptions {
external String /*'none'|'hash'|'history'*/ get routerMode;
external set routerMode(String /*'none'|'hash'|'history'*/ v);
external factory UserPickerOptions({
String /*'none'|'hash'|'history'*/ routerMode,
});
}
@anonymous
@JS()
abstract class OpenWindowParams {
external String get url;
external set url(String v);
external bool get external;
external set external(bool v);
external factory OpenWindowParams({String url, bool external});
}
@anonymous
@JS()
abstract class ShareTargetPickerResult {
external String /*'success'*/ get status;
external set status(String /*'success'*/ v);
external factory ShareTargetPickerResult({String /*'success'*/ status});
}
@anonymous
@JS()
abstract class AddToHomeScreenParams {
external String get name;
external set name(String v);
external String get iconUrl;
external set iconUrl(String v);
external String get state;
external set state(String v);
external factory AddToHomeScreenParams({
String name,
String iconUrl,
String state,
});
}
@anonymous
@JS()
abstract class ScanCodeResult {
external String /*String|Null*/ get value;
external set value(String /*String|Null*/ v);
external factory ScanCodeResult({String /*String|Null*/ value});
}
@anonymous
@JS()
abstract class CustomEvent<T> {
external T get detail;
external void initCustomEvent(
String typeArg,
bool canBubbleArg,
bool cancelableArg,
T detailArg,
);
}
@anonymous
@JS()
abstract class PermanentLink {
external String Function() get createUrl;
external set createUrl(String Function() v);
external void Function(String) get setExtraQueryParam;
external set setExtraQueryParam(void Function(String) v);
external factory PermanentLink({
String Function() createUrl,
void Function(String) setExtraQueryParam,
});
}
@anonymous
@JS()
abstract class CallOptions {
external String get callbackId;
external set callbackId(String v);
external bool get once;
external set once(bool v);
external factory CallOptions({String callbackId, bool once});
}
@anonymous
@JS()
abstract class DeviceRelatedSettings {
external bool get autoplay;
external set autoplay(bool v);
external AIdInterface get aId;
external set aId(AIdInterface v);
external factory DeviceRelatedSettings({bool autoplay, AIdInterface aId});
}
@anonymous
@JS()
abstract class ShareTargetPicker {
external bool get permission;
external set permission(bool v);
external String get minVer;
external set minVer(String v);
external factory ShareTargetPicker({bool permission, String minVer});
}
@anonymous
@JS()
abstract class Availability {
external ShareTargetPicker get shareTargetPicker;
external set shareTargetPicker(ShareTargetPicker v);
external factory Availability({ShareTargetPicker shareTargetPicker});
}
@JS()
abstract class Promise<T> {
external factory Promise(
void Function(void Function(T result) resolve, Function reject) executor,
);
external Promise then(
void Function(T result) onFulfilled, [
Function onRejected,
]);
}
@nukotsuka
Copy link
Author

nukotsuka commented Jul 23, 2020

Usage

Add js package to pubspec.yaml.

dependencies:
  js: ^0.6.2

Add script to index.html.

<!DOCTYPE html>
<html>
<head>
  ...
  <script charset="utf-8" src="https://static.line-scdn.net/liff/edge/2.1/sdk.js" defer></script>
  ...
</head>
...
</html>

And add liff.dart listed above to your project, then you can use liff.

liff.init(InitConfig(liffId: 'YOUR_LIFF_APP_ID')).then((_) {
  if (!liff.isLoggedIn()) {
    liff.login();
  }
});

References

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