diff --git a/.yarn/patches/react-split-pane-npm-0.1.92-93dbf51dff.patch b/.yarn/patches/react-split-pane-npm-0.1.92-93dbf51dff.patch
deleted file mode 100644
index 7b537aea6..000000000
--- a/.yarn/patches/react-split-pane-npm-0.1.92-93dbf51dff.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/index.d.ts b/index.d.ts
-index d116f54d6da12d24b48e24ff3636c9066059aa58..9d62eac28d5480aa6c2e796d603757d5999ea0af 100644
---- a/index.d.ts
-+++ b/index.d.ts
-@@ -25,6 +25,7 @@ export type SplitPaneProps = {
- pane2Style?: React.CSSProperties;
- resizerClassName?: string;
- step?: number;
-+ children: React.ReactNode;
- };
-
- export type SplitPaneState = {
diff --git a/packages/ui-default/components/react-splitpane/SplitPaneFillOverlay.page.styl b/packages/ui-default/components/react-splitpane/SplitPaneFillOverlay.page.styl
deleted file mode 100644
index 445e2a10a..000000000
--- a/packages/ui-default/components/react-splitpane/SplitPaneFillOverlay.page.styl
+++ /dev/null
@@ -1,9 +0,0 @@
-.splitpane-fill
- display: flex
- position: absolute
- overflow: hidden
- left: 0
- width: 100%
- top: 0
- height: 100%
- user-select: none
diff --git a/packages/ui-default/components/react-splitpane/SplitPaneFillOverlayComponent.jsx b/packages/ui-default/components/react-splitpane/SplitPaneFillOverlayComponent.jsx
deleted file mode 100644
index 0576694dc..000000000
--- a/packages/ui-default/components/react-splitpane/SplitPaneFillOverlayComponent.jsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import classNames from 'classnames';
-import PropTypes from 'prop-types';
-
-export default function SplitPaneFillOverlayComponent(props) {
- const {
- className,
- children,
- ...rest
- } = props;
- const cn = classNames(className, 'splitpane-fill');
- return (
-
{children}
- );
-}
-
-SplitPaneFillOverlayComponent.propTypes = {
- className: PropTypes.string,
- children: PropTypes.node,
-};
diff --git a/packages/ui-default/components/react-splitpane/splitpane.page.styl b/packages/ui-default/components/react-splitpane/splitpane.page.styl
deleted file mode 100644
index d66540109..000000000
--- a/packages/ui-default/components/react-splitpane/splitpane.page.styl
+++ /dev/null
@@ -1,27 +0,0 @@
-$resizer-extend = 4px
-$resizer-extend-color = rgba($primary-color, 0.3)
-
-.Resizer
- background: #000
- opacity: .2
- z-index: 1
- box-sizing: border-box
- background-clip: padding-box
-
-.Resizer.horizontal
- height: ($resizer-extend * 2 + 1px)
- margin: -($resizer-extend) 0
- border-top: $resizer-extend solid transparent
- border-bottom: $resizer-extend solid transparent
- cursor: row-resize
- width: 100%
-
-.Resizer.vertical
- width: ($resizer-extend * 2 + 1px)
- margin: 0 -($resizer-extend)
- border-left: $resizer-extend solid transparent
- border-right: $resizer-extend solid transparent
- cursor: col-resize
-
-.Resizer:hover
- border-color: $resizer-extend-color
diff --git a/packages/ui-default/components/scratchpad/PanelComponent.jsx b/packages/ui-default/components/scratchpad/PanelComponent.jsx
index 88908fe85..7323942db 100644
--- a/packages/ui-default/components/scratchpad/PanelComponent.jsx
+++ b/packages/ui-default/components/scratchpad/PanelComponent.jsx
@@ -1,7 +1,6 @@
import classNames from 'classnames';
import PropTypes from 'prop-types';
import React from 'react';
-import SplitPaneFillOverlay from 'vj/components/react-splitpane/SplitPaneFillOverlayComponent';
export default function PanelComponent(props) {
const {
@@ -12,10 +11,10 @@ export default function PanelComponent(props) {
} = props;
const cn = classNames(className, 'flex-col');
return (
-
+
);
}
diff --git a/packages/ui-default/components/scratchpad/index.tsx b/packages/ui-default/components/scratchpad/index.tsx
index 842f2b00b..8bc0f44f1 100644
--- a/packages/ui-default/components/scratchpad/index.tsx
+++ b/packages/ui-default/components/scratchpad/index.tsx
@@ -1,39 +1,17 @@
import ProblemIcon from '@vscode/codicons/src/icons/file.svg?react';
+import { Allotment } from 'allotment';
import $ from 'jquery';
import _ from 'lodash';
import type * as monaco from 'monaco-editor';
import React from 'react';
import { useDispatch, useSelector, useStore } from 'react-redux';
-import SplitPane from 'react-split-pane';
import Dom from 'vj/components/react/DomComponent';
-import SplitPaneFillOverlay from 'vj/components/react-splitpane/SplitPaneFillOverlayComponent';
import { Context, ctx, Service } from 'vj/context';
import ScratchpadEditor from './ScratchpadEditorContainer';
import ScratchpadPretest from './ScratchpadPretestContainer';
import ScratchpadRecords from './ScratchpadRecordsContainer';
import ScratchpadToolbar from './ScratchpadToolbarContainer';
-function buildNestedPane([a, ...panes], mode: 'horizontal' | 'vertical' = 'horizontal') {
- const elements = [
- a,
- ...panes.filter((p) => p.props.visible),
- ];
- if (elements.length === 1) return a;
- return elements
- .reduce((prev, curr) => (
-
- {prev}
- {curr.element}
-
- ));
-}
-
const pages = {
problem: {
icon: () => ,
@@ -88,14 +66,7 @@ export default function ScratchpadContainer() {
const dispatch = useDispatch();
const ui = useSelector((state) => state.ui, _.isEqual);
- const handleChangeSize = _.debounce((uiElement, size) => {
- dispatch({
- type: 'SCRATCHPAD_UI_CHANGE_SIZE',
- payload: {
- uiElement,
- size,
- },
- });
+ const handleChangeSize = _.debounce(() => {
$('#scratchpad').trigger('vjScratchpadRelayout');
forceUpdate();
}, 500);
@@ -109,31 +80,20 @@ export default function ScratchpadContainer() {
const showSidebar = Object.keys(pages).length > 1;
return (
-
-
- {Object.keys(pages).map((key) => {
- const Component = pages[key].icon;
- return (
-
switchToPage(key)}>
-
-
- );
- })}
-
- handleChangeSize('main', size)}
- allowResize={ui.activePage !== null}
- >
+
+
+
+ {Object.keys(pages).map((key) => {
+ const Component = pages[key].icon;
+ return (
+
switchToPage(key)}>
+
+
+ );
+ })}
+
+
+
{Object.keys(pages).map((key) => {
const Component = pages[key].component;
@@ -144,23 +104,19 @@ export default function ScratchpadContainer() {
);
})}
- {buildNestedPane([
-
-
-
- ,
- {
- props: ui.pretest,
- onChange: (size) => handleChangeSize('pretest', size),
- element: ,
- },
- {
- props: ui.records,
- onChange: (size) => handleChangeSize('records', size),
- element: ,
- },
- ])}
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
diff --git a/packages/ui-default/context.ts b/packages/ui-default/context.ts
index 14b22cbf1..04a13ba53 100644
--- a/packages/ui-default/context.ts
+++ b/packages/ui-default/context.ts
@@ -8,7 +8,6 @@ export interface Context {
[Context.events]: Events;
setTimeout: typeof setTimeout;
setInterval: typeof setInterval;
- setImmediate: typeof setImmediate;
api: ApiMixin;
}
@@ -37,10 +36,9 @@ const T = any>(origFunc: F, disposeFunc?) =>
this.caller?.on('dispose', () => (disposeFunc ? disposeFunc(res) : res()));
};
export class ApiMixin extends Service {
- static readonly methods = ['addScript', 'setInterval', 'setTimeout', 'setImmediate', 'provideModule', 'inject', 'broadcast'];
+ static readonly methods = ['setInterval', 'setTimeout'];
setInterval = T(setInterval, clearInterval);
setTimeout = T(setTimeout, clearTimeout);
- setImmediate = T(setImmediate, clearImmediate);
constructor(ctx) {
super(ctx, 'api', true);
}
diff --git a/packages/ui-default/package.json b/packages/ui-default/package.json
index c851c4da1..a3427b8a1 100644
--- a/packages/ui-default/package.json
+++ b/packages/ui-default/package.json
@@ -40,6 +40,7 @@
"@types/sharedworker": "^0.0.91",
"@types/webpack-env": "^1.18.0",
"@vscode/codicons": "^0.0.32",
+ "allotment": "^1.18.1",
"autoprefixer": "^10.4.13",
"browser-update": "^3.3.44",
"chalk": "^5.2.0",
@@ -87,7 +88,6 @@
"react-dom": "^18.2.0",
"react-query": "^3.39.3",
"react-redux": "^8.0.5",
- "react-split-pane": "^0.1.92",
"reconnecting-websocket": "^4.4.0",
"redux": "^4.2.1",
"redux-logger": "^3.0.6",
diff --git a/packages/ui-default/theme/default.js b/packages/ui-default/theme/default.js
index 426c2739a..0c7a2a817 100644
--- a/packages/ui-default/theme/default.js
+++ b/packages/ui-default/theme/default.js
@@ -1,5 +1,6 @@
import 'normalize.css/normalize.css';
import 'vditor/dist/index.css';
+import 'allotment/dist/style.css';
import 'pickadate/lib/themes/classic.css';
import 'pickadate/lib/themes/classic.date.css';
import 'pickadate/lib/themes/classic.time.css';