38 lines
1.0 KiB
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);
|
|
}
|