UNPKG

flutter-webview-bridge

Version:

A TypeScript/React bridge for seamless communication between Flutter WebView and web applications

57 lines (56 loc) 2.65 kB
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 };