Files
zendegi/packages/z-flutter/lib/bridge.dart

38 lines
1.0 KiB
Dart

import 'dart:convert';
import 'dart:js_interop';
@JS('window.__zendegi__')
external _ZendegiBridge? get _bridge;
extension type _ZendegiBridge._(JSObject _) implements JSObject {
external JSString getState();
external void onEvent(JSString json);
external set updateState(JSFunction callback);
}
Map<String, dynamic>? readInitialState() {
final bridge = _bridge;
if (bridge == null) return null;
final json = bridge.getState().toDart;
return jsonDecode(json) as Map<String, dynamic>;
}
void onStateUpdated(void Function(Map<String, dynamic> state) callback) {
final bridge = _bridge;
if (bridge == null) return;
bridge.updateState = ((JSString json) {
final decoded = jsonDecode(json.toDart) as Map<String, dynamic>;
callback(decoded);
}).toJS;
}
void emitEvent(String type, [Map<String, dynamic>? payload]) {
final bridge = _bridge;
if (bridge == null) return;
final event = <String, dynamic>{'type': type};
if (payload != null) {
event['payload'] = payload;
}
bridge.onEvent(jsonEncode(event).toJS);
}