react-terminal-viewer
Version:
<h1 align="center"> react-terminal-viewer </h1>
294 lines (293 loc) • 15.4 kB
JavaScript
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import React, { forwardRef, useCallback, useState, useImperativeHandle, useRef, useEffect, useMemo } from 'react';
import { createPortal } from 'react-dom';
import useDebounceInput from "../Hooks/useDebounceInput";
import TerminalViewerHeader from "../TerminalViewerHeader";
import TerminalViewerBody from "../TerminalViewerBody";
import TerminalViewerVirtualDom from "../TerminalViewerVirtualDom";
import TerminalViewerToolBar from "../TerminalViewerToolBar";
import globalContext from "../Addon/WorkerLog/GlobalContext";
import "./index.less";
import { jsx as _jsx } from "react/jsx-runtime";
import { jsxs as _jsxs } from "react/jsx-runtime";
var defaultSearchOptions = {
regex: false,
wholeWord: false,
caseSensitive: false,
incremental: false,
decorations: {
matchForegroundColor: '#000000',
matchBackground: '#ffff54',
matchBorder: 'none',
matchOverviewRuler: 'none',
activeMatchBackground: '#ff9540',
activeMatchBorder: 'none',
activeMatchColorOverviewRuler: 'none'
}
};
// eslint-disable-next-line react/display-name
var TerminalViewer = /*#__PURE__*/forwardRef(function (_ref, ref) {
var fit = _ref.fit,
autoScroll = _ref.autoScroll,
scrollToRow = _ref.scrollToRow,
refreshable = _ref.refreshable,
searchPlaceholder = _ref.searchPlaceholder,
header = _ref.header,
inputAddonBefore = _ref.inputAddonBefore,
inputAddonAfter = _ref.inputAddonAfter,
empty = _ref.empty,
icons = _ref.icons,
toolbar = _ref.toolbar,
showFullScreen = _ref.showFullScreen,
className = _ref.className,
style = _ref.style,
defaultFullScreen = _ref.defaultFullScreen,
defaultData = _ref.defaultData,
defaultTabIndex = _ref.defaultTabIndex,
activeTabIndexProp = _ref.activeTabIndex,
logAfter = _ref.logAfter,
tabs = _ref.tabs,
webLinksSupport = _ref.webLinksSupport,
canvasSupport = _ref.canvasSupport,
virtualDomSupport = _ref.virtualDomSupport,
workerPath = _ref.workerPath,
remoteOptions = _ref.remoteOptions,
cacheOptions = _ref.cacheOptions,
searchOptions = _ref.searchOptions,
highlightOptions = _ref.highlightOptions,
terminalOptions = _ref.terminalOptions,
extraOptions = _ref.extraOptions,
getContainer = _ref.getContainer,
onTitleChange = _ref.onTitleChange,
onLoading = _ref.onLoading,
onRefresh = _ref.onRefresh;
var localSearchOptions = searchOptions !== null && searchOptions !== void 0 ? searchOptions : {};
var instanceRef = useRef();
var searchValueRef = useRef('');
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
loading = _useState2[0],
setLoading = _useState2[1];
var _useState3 = useState(defaultFullScreen),
_useState4 = _slicedToArray(_useState3, 2),
fullScreen = _useState4[0],
setFullScreen = _useState4[1];
var _useState5 = useState(activeTabIndexProp || defaultTabIndex || 0),
_useState6 = _slicedToArray(_useState5, 2),
activeTabIndex = _useState6[0],
setActiveTabIndex = _useState6[1];
var _useState7 = useState({
resultIndex: -1,
resultCount: 0
}),
_useState8 = _slicedToArray(_useState7, 2),
searchResult = _useState8[0],
setSearchResult = _useState8[1];
var searchOptionsRef = useRef(_objectSpread(_objectSpread({}, defaultSearchOptions), localSearchOptions));
useEffect(function () {
searchOptionsRef.current = _objectSpread(_objectSpread({}, defaultSearchOptions), localSearchOptions);
});
var cln = ['terminal-viewer', fullScreen && 'terminal-viewer--fullscreen', className].filter(Boolean).join(' ');
var ViewerBody = virtualDomSupport ? TerminalViewerVirtualDom : TerminalViewerBody;
var titles = useMemo(function () {
if (!Array.isArray(tabs)) {
return [];
}
return tabs.map(function (tab, index) {
return tab.title || index;
});
}, [tabs]);
var getQueryElement = useCallback(function (query) {
if (typeof query === 'string') {
return document.querySelector(query);
}
if (typeof query === 'function') {
return query();
}
return query;
}, []);
var mountElement = fullScreen ? document.body : getQueryElement(getContainer);
var handleLoading = useCallback(function (bool) {
setLoading(bool);
if (typeof onLoading === 'function') {
onLoading(bool);
}
}, [onLoading]);
var handleTitleChange = useCallback(function (index) {
setActiveTabIndex(index);
setSearchResult({
resultIndex: -1,
resultCount: 0
});
if (typeof onTitleChange === 'function') {
onTitleChange(index);
}
}, [onTitleChange]);
var handleSearchChange = useDebounceInput(function (value) {
var _instanceRef$current, _instanceRef$current$;
searchValueRef.current = value;
if ((_instanceRef$current = instanceRef.current) !== null && _instanceRef$current !== void 0 && (_instanceRef$current$ = _instanceRef$current.addons) !== null && _instanceRef$current$ !== void 0 && _instanceRef$current$.search) {
var _instanceRef$current$2;
(_instanceRef$current$2 = instanceRef.current.addons.search()) === null || _instanceRef$current$2 === void 0 ? void 0 : _instanceRef$current$2.findNext(value, searchOptionsRef.current);
}
});
var handleSearchClear = useCallback(function () {
var _instanceRef$current2, _instanceRef$current3;
if ((_instanceRef$current2 = instanceRef.current) !== null && _instanceRef$current2 !== void 0 && (_instanceRef$current3 = _instanceRef$current2.addons) !== null && _instanceRef$current3 !== void 0 && _instanceRef$current3.search) {
var _instanceRef$current$3;
(_instanceRef$current$3 = instanceRef.current.addons.search()) === null || _instanceRef$current$3 === void 0 ? void 0 : _instanceRef$current$3.findNext('', searchOptionsRef.current);
}
}, []);
var handleSearchPrev = useCallback(function (value) {
var _instanceRef$current4, _instanceRef$current5;
if ((_instanceRef$current4 = instanceRef.current) !== null && _instanceRef$current4 !== void 0 && (_instanceRef$current5 = _instanceRef$current4.addons) !== null && _instanceRef$current5 !== void 0 && _instanceRef$current5.search) {
var _instanceRef$current6, _instanceRef$current7;
(_instanceRef$current6 = instanceRef.current) === null || _instanceRef$current6 === void 0 ? void 0 : (_instanceRef$current7 = _instanceRef$current6.addons.search()) === null || _instanceRef$current7 === void 0 ? void 0 : _instanceRef$current7.findPrevious(value, searchOptionsRef.current);
}
}, []);
var handleSearchNext = useCallback(function (value) {
var _instanceRef$current8, _instanceRef$current9;
if ((_instanceRef$current8 = instanceRef.current) !== null && _instanceRef$current8 !== void 0 && (_instanceRef$current9 = _instanceRef$current8.addons) !== null && _instanceRef$current9 !== void 0 && _instanceRef$current9.search) {
var _instanceRef$current$4;
(_instanceRef$current$4 = instanceRef.current.addons.search()) === null || _instanceRef$current$4 === void 0 ? void 0 : _instanceRef$current$4.findNext(value, searchOptionsRef.current);
}
}, []);
var handleAddonReady = useCallback(function (terminal, addon) {
var searchAddon = addon;
// 注意需配置 decorations 才会触发
if (searchAddon !== null && searchAddon !== void 0 && searchAddon.onDidChangeResults) {
searchAddon.onDidChangeResults(function (e) {
setSearchResult(e || {
resultIndex: -1,
resultCount: 0
});
});
}
}, []);
var handleScrollTop = useCallback(function () {
var _instanceRef$current10;
if ((_instanceRef$current10 = instanceRef.current) !== null && _instanceRef$current10 !== void 0 && _instanceRef$current10.terminal) {
var _instanceRef$current$5;
(_instanceRef$current$5 = instanceRef.current.terminal()) === null || _instanceRef$current$5 === void 0 ? void 0 : _instanceRef$current$5.scrollToTop();
}
}, []);
var handleScrollBottom = useCallback(function () {
var _instanceRef$current11;
if ((_instanceRef$current11 = instanceRef.current) !== null && _instanceRef$current11 !== void 0 && _instanceRef$current11.terminal) {
var _instanceRef$current$6;
(_instanceRef$current$6 = instanceRef.current.terminal()) === null || _instanceRef$current$6 === void 0 ? void 0 : _instanceRef$current$6.scrollToBottom();
}
}, []);
var handleFullScreen = useCallback(function () {
setFullScreen(function (p) {
return !p;
});
}, []);
var handleRefresh = useCallback(function () {
var _instanceRef$current12;
if (typeof onRefresh === 'function') {
onRefresh();
}
(_instanceRef$current12 = instanceRef.current) === null || _instanceRef$current12 === void 0 ? void 0 : _instanceRef$current12.refresh();
}, [onRefresh]);
useEffect(function () {
setActiveTabIndex(activeTabIndexProp || 0);
}, [activeTabIndexProp]);
useImperativeHandle(ref, function () {
return instanceRef.current;
});
if (virtualDomSupport) {
globalContext.setWorkerPath(workerPath || "" || '/worker');
}
useEffect(function () {
var worker = globalContext.getWorker();
return function () {
worker === null || worker === void 0 ? void 0 : worker.terminate();
globalContext.setWorker(undefined);
};
}, [virtualDomSupport]);
var render = /*#__PURE__*/_jsxs("div", {
className: cln,
style: style,
children: [header || /*#__PURE__*/_jsx(TerminalViewerHeader, {
defaultValue: searchValueRef.current,
refreshable: refreshable,
icons: icons,
loading: loading,
activeTitleIndex: activeTabIndex,
titles: titles,
placeholder: searchPlaceholder,
searchResult: searchResult,
inputAddonBefore: inputAddonBefore,
inputAddonAfter: inputAddonAfter,
onSearchChange: handleSearchChange,
onSearchClear: handleSearchClear,
onSearchPrev: handleSearchPrev,
onSearchNext: handleSearchNext,
onTitleChange: handleTitleChange,
onRefresh: handleRefresh
}), Array.isArray(tabs) && tabs.map(function (tab, index) {
if (activeTabIndex === index) {
return /*#__PURE__*/_jsx(ViewerBody, {
fit: fit,
empty: empty,
autoScroll: autoScroll,
scrollToRow: scrollToRow,
logAfter: logAfter,
webLinksSupport: webLinksSupport,
canvasSupport: canvasSupport,
ref: instanceRef,
defaultData: tab.defaultData,
cacheOptions: tab.cacheOptions || cacheOptions,
remoteOptions: tab.remoteOptions,
highlightOptions: highlightOptions,
terminalOptions: terminalOptions,
extraOptions: extraOptions,
onAddonReady: handleAddonReady,
onLoading: handleLoading
}, tab.key || index);
}
return null;
}).filter(Boolean), !Array.isArray(tabs) && /*#__PURE__*/_jsx(ViewerBody, {
fit: fit,
empty: empty,
autoScroll: autoScroll,
scrollToRow: scrollToRow,
logAfter: logAfter,
webLinksSupport: webLinksSupport,
canvasSupport: canvasSupport,
ref: instanceRef,
defaultData: defaultData,
remoteOptions: remoteOptions,
cacheOptions: cacheOptions,
highlightOptions: highlightOptions,
terminalOptions: terminalOptions,
extraOptions: extraOptions,
onAddonReady: handleAddonReady,
onLoading: handleLoading
}), toolbar || /*#__PURE__*/_jsx(TerminalViewerToolBar, {
icons: icons,
fullScreen: fullScreen,
showFullScreen: showFullScreen,
onScrollTop: handleScrollTop,
onScrollBottom: handleScrollBottom,
onFullScreen: handleFullScreen
})]
});
if (mountElement) {
return /*#__PURE__*/createPortal(render, mountElement);
}
return render;
});
export default TerminalViewer;