flutter-webview-bridge
Version:
A TypeScript/React bridge for seamless communication between Flutter WebView and web applications
57 lines (56 loc) • 2.65 kB
JavaScript
import { useEffect, useState, useCallback, useRef } from "react";
import { flutterBridge, FlutterBridge, } from "./bridge";
/**
* A React hook for interacting with the Flutter WebView bridge.
* It provides a way to send messages to Flutter and receive the last message from it.
*/
export function useFlutterBridge(options) {
if (options === void 0) { options = {}; }
var _a = options.bridge, bridge = _a === void 0 ? flutterBridge : _a, onMessage = options.onMessage;
var _b = useState(null), lastMessage = _b[0], setLastMessage = _b[1];
var _c = useState(function () { return bridge.getConnectionStatus(); }), connectionStatus = _c[0], setConnectionStatus = _c[1];
// Ref для хранения таймера очистки сообщения
var clearMessageTimeoutRef = useRef(null);
useEffect(function () {
var handleMessage = function (message) {
// Очищаем предыдущий таймер если он был
if (clearMessageTimeoutRef.current) {
clearTimeout(clearMessageTimeoutRef.current);
}
setLastMessage(message);
onMessage === null || onMessage === void 0 ? void 0 : onMessage(message);
// Устанавливаем таймер для очистки сообщения через 1 секунду
clearMessageTimeoutRef.current = setTimeout(function () {
setLastMessage(null);
clearMessageTimeoutRef.current = null;
}, 1000);
};
// Subscribe to messages when the component mounts.
var unsubscribe = bridge.subscribe(handleMessage);
// Update connection status periodically
var statusInterval = setInterval(function () {
setConnectionStatus(bridge.getConnectionStatus());
}, 1000);
// Cleanup
return function () {
unsubscribe();
clearInterval(statusInterval);
// Очищаем таймер при размонтировании
if (clearMessageTimeoutRef.current) {
clearTimeout(clearMessageTimeoutRef.current);
}
};
}, [bridge, onMessage]);
// Provide a stable function to send messages to Flutter.
var sendMessage = useCallback(function (data) {
bridge.sendMessage(data);
}, [bridge]);
return {
sendMessage: sendMessage,
lastMessage: lastMessage,
isConnected: connectionStatus.hasPort,
connectionStatus: connectionStatus,
};
}
// Export the bridge instance for direct access
export { flutterBridge, FlutterBridge };