vzcode 0.58.0 → 0.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{index-NAjxbACe.js → index-iYQ0qHNs.js} +43 -43
- package/dist/assets/{index-aQVpCjcB.css → index-yDxNPcIh.css} +1 -1
- package/dist/assets/worker-DzDiglXJ.js +233 -0
- package/dist/index.html +2 -6
- package/package.json +2 -2
- package/src/client/VZSidebar/Item.tsx +35 -9
- package/src/client/VZSidebar/index.tsx +52 -35
- package/src/client/VZSidebar/styles.scss +1 -1
- package/src/client/index.ts +2 -0
- package/src/client/useURLSync.ts +39 -36
- package/dist/assets/worker-Cl_j3b6K.js +0 -233
package/dist/index.html
CHANGED
|
@@ -20,12 +20,8 @@
|
|
|
20
20
|
href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap"
|
|
21
21
|
rel="stylesheet"
|
|
22
22
|
/>
|
|
23
|
-
<
|
|
24
|
-
|
|
25
|
-
rel="stylesheet"
|
|
26
|
-
/>
|
|
27
|
-
<script type="module" crossorigin src="/assets/index-NAjxbACe.js"></script>
|
|
28
|
-
<link rel="stylesheet" crossorigin href="/assets/index-aQVpCjcB.css">
|
|
23
|
+
<script type="module" crossorigin src="/assets/index-iYQ0qHNs.js"></script>
|
|
24
|
+
<link rel="stylesheet" crossorigin href="/assets/index-yDxNPcIh.css">
|
|
29
25
|
</head>
|
|
30
26
|
<body>
|
|
31
27
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vzcode",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
4
4
|
"description": "Multiplayer code editor system",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
"@types/react-dom": "^18.2.18",
|
|
117
117
|
"@vitejs/plugin-react": "^4.2.1",
|
|
118
118
|
"concurrently": "^8.2.2",
|
|
119
|
-
"prettier": "^3.2.
|
|
119
|
+
"prettier": "^3.2.5",
|
|
120
120
|
"sass": "^1.70.0",
|
|
121
121
|
"typescript": "^5.3.3",
|
|
122
122
|
"vite": "^5.0.12",
|
|
@@ -6,6 +6,8 @@ import {
|
|
|
6
6
|
} from 'react';
|
|
7
7
|
import { EditSVG, FileSVG, TrashSVG } from '../Icons';
|
|
8
8
|
|
|
9
|
+
import { Tooltip, OverlayTrigger } from '../bootstrap';
|
|
10
|
+
|
|
9
11
|
// TODO consider moving this up to a higher level of the component tree
|
|
10
12
|
import { DeleteConfirmationModal } from './DeleteConfirmationModal';
|
|
11
13
|
|
|
@@ -23,6 +25,10 @@ export const Item = ({
|
|
|
23
25
|
handleDeleteClick,
|
|
24
26
|
isDirectory = false,
|
|
25
27
|
isActive = false,
|
|
28
|
+
renameFileTooltipText = 'Rename File',
|
|
29
|
+
deleteFileTooltipText = isDirectory
|
|
30
|
+
? 'Delete Directory'
|
|
31
|
+
: 'Delete File',
|
|
26
32
|
}: {
|
|
27
33
|
name: string;
|
|
28
34
|
children: React.ReactNode;
|
|
@@ -32,6 +38,8 @@ export const Item = ({
|
|
|
32
38
|
handleDeleteClick: () => void;
|
|
33
39
|
isDirectory?: boolean;
|
|
34
40
|
isActive?: boolean;
|
|
41
|
+
renameFileTooltipText?: string;
|
|
42
|
+
deleteFileTooltipText?: string;
|
|
35
43
|
}) => {
|
|
36
44
|
// Tracks whether the mouse is hovering over the file or directory
|
|
37
45
|
const [isHovered, setIsHovered] = useState(false);
|
|
@@ -159,19 +167,37 @@ export const Item = ({
|
|
|
159
167
|
style={{ position: 'relative' }}
|
|
160
168
|
>
|
|
161
169
|
{(isDirectory ? enableRenameDirectory : true) ? (
|
|
170
|
+
<OverlayTrigger
|
|
171
|
+
placement="top"
|
|
172
|
+
overlay={
|
|
173
|
+
<Tooltip id="rename-file-tooltip">
|
|
174
|
+
{renameFileTooltipText}
|
|
175
|
+
</Tooltip>
|
|
176
|
+
}
|
|
177
|
+
>
|
|
178
|
+
<i
|
|
179
|
+
onClick={handleRenameIconClick}
|
|
180
|
+
className="icon-button"
|
|
181
|
+
>
|
|
182
|
+
<EditSVG />
|
|
183
|
+
</i>
|
|
184
|
+
</OverlayTrigger>
|
|
185
|
+
) : null}
|
|
186
|
+
<OverlayTrigger
|
|
187
|
+
placement="top"
|
|
188
|
+
overlay={
|
|
189
|
+
<Tooltip id="delete-file-tooltip">
|
|
190
|
+
{deleteFileTooltipText}
|
|
191
|
+
</Tooltip>
|
|
192
|
+
}
|
|
193
|
+
>
|
|
162
194
|
<i
|
|
163
|
-
onClick={
|
|
195
|
+
onClick={handleModalOpen}
|
|
164
196
|
className="icon-button"
|
|
165
197
|
>
|
|
166
|
-
<
|
|
198
|
+
<TrashSVG />
|
|
167
199
|
</i>
|
|
168
|
-
|
|
169
|
-
<i
|
|
170
|
-
onClick={handleModalOpen}
|
|
171
|
-
className="icon-button"
|
|
172
|
-
>
|
|
173
|
-
<TrashSVG />
|
|
174
|
-
</i>
|
|
200
|
+
</OverlayTrigger>
|
|
175
201
|
</div>
|
|
176
202
|
) : null}
|
|
177
203
|
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
FileTreePath,
|
|
13
13
|
Files,
|
|
14
14
|
} from '../../types';
|
|
15
|
+
import { Tooltip, OverlayTrigger } from '../bootstrap';
|
|
15
16
|
import { getFileTree } from '../getFileTree';
|
|
16
17
|
import { sortFileTree } from '../sortFileTree';
|
|
17
18
|
import { disableSettings } from '../featureFlags';
|
|
@@ -26,20 +27,10 @@ import './styles.scss';
|
|
|
26
27
|
// See https://github.com/vizhub-core/vzcode/issues/456
|
|
27
28
|
const enableConnectionStatus = false;
|
|
28
29
|
|
|
29
|
-
const CreateFileButton = ({ handleCreateFile }) => {
|
|
30
|
-
return (
|
|
31
|
-
<i
|
|
32
|
-
className="bx bxs-file-plus new-btn"
|
|
33
|
-
style={{ color: '#dbdde1' }}
|
|
34
|
-
onClick={handleCreateFile}
|
|
35
|
-
// TODO better tooltip
|
|
36
|
-
title="Create file"
|
|
37
|
-
></i>
|
|
38
|
-
);
|
|
39
|
-
};
|
|
40
30
|
export const VZSidebar = ({
|
|
41
31
|
files,
|
|
42
32
|
createFile,
|
|
33
|
+
createFileTooltipText = 'New File',
|
|
43
34
|
renameFile,
|
|
44
35
|
deleteFile,
|
|
45
36
|
deleteDirectory,
|
|
@@ -49,9 +40,12 @@ export const VZSidebar = ({
|
|
|
49
40
|
isDirectoryOpen,
|
|
50
41
|
toggleDirectory,
|
|
51
42
|
activeFileId,
|
|
43
|
+
openSettingsTooltipText = 'Open Settings',
|
|
44
|
+
reportBugTooltipText = 'Report Bug',
|
|
52
45
|
}: {
|
|
53
46
|
files: Files;
|
|
54
47
|
createFile: (fileName) => void;
|
|
48
|
+
createFileTooltipText?: string;
|
|
55
49
|
renameFile: (fileId: FileId, newName: string) => void;
|
|
56
50
|
deleteFile: (fileId: FileId) => void;
|
|
57
51
|
deleteDirectory: (path: FileTreePath) => void;
|
|
@@ -67,6 +61,8 @@ export const VZSidebar = ({
|
|
|
67
61
|
isDirectoryOpen: (path: string) => boolean;
|
|
68
62
|
toggleDirectory: (path: string) => void;
|
|
69
63
|
activeFileId?: FileId;
|
|
64
|
+
openSettingsTooltipText?: string;
|
|
65
|
+
reportBugTooltipText?: string;
|
|
70
66
|
}) => {
|
|
71
67
|
const fileTree = useMemo(
|
|
72
68
|
() => (files ? sortFileTree(getFileTree(files)) : null),
|
|
@@ -156,31 +152,56 @@ export const VZSidebar = ({
|
|
|
156
152
|
Project Files
|
|
157
153
|
</div>
|
|
158
154
|
<div className="sidebar-section-buttons">
|
|
159
|
-
<
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
155
|
+
<OverlayTrigger
|
|
156
|
+
placement="left"
|
|
157
|
+
overlay={
|
|
158
|
+
<Tooltip id="report-bug-tooltip">
|
|
159
|
+
{reportBugTooltipText}
|
|
160
|
+
</Tooltip>
|
|
161
|
+
}
|
|
163
162
|
>
|
|
164
|
-
<
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
163
|
+
<a
|
|
164
|
+
href="https://github.com/vizhub-core/vzcode/issues/new"
|
|
165
|
+
target="_blank"
|
|
166
|
+
rel="noopener noreferrer"
|
|
167
|
+
>
|
|
168
|
+
<i className="icon-button">
|
|
169
|
+
<BugSVG />
|
|
170
|
+
</i>
|
|
171
|
+
</a>
|
|
172
|
+
</OverlayTrigger>
|
|
169
173
|
{disableSettings ? null : (
|
|
174
|
+
<OverlayTrigger
|
|
175
|
+
placement="left"
|
|
176
|
+
overlay={
|
|
177
|
+
<Tooltip id="open-settings-tooltip">
|
|
178
|
+
{openSettingsTooltipText}
|
|
179
|
+
</Tooltip>
|
|
180
|
+
}
|
|
181
|
+
>
|
|
182
|
+
<i
|
|
183
|
+
onClick={handleSettingsClick}
|
|
184
|
+
className="icon-button"
|
|
185
|
+
>
|
|
186
|
+
<GearSVG />
|
|
187
|
+
</i>
|
|
188
|
+
</OverlayTrigger>
|
|
189
|
+
)}
|
|
190
|
+
<OverlayTrigger
|
|
191
|
+
placement="left"
|
|
192
|
+
overlay={
|
|
193
|
+
<Tooltip id="create-file-tooltip">
|
|
194
|
+
{createFileTooltipText}
|
|
195
|
+
</Tooltip>
|
|
196
|
+
}
|
|
197
|
+
>
|
|
170
198
|
<i
|
|
171
|
-
onClick={
|
|
199
|
+
onClick={handleCreateFile}
|
|
172
200
|
className="icon-button"
|
|
173
201
|
>
|
|
174
|
-
<
|
|
202
|
+
<NewSVG />
|
|
175
203
|
</i>
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
<i
|
|
179
|
-
onClick={handleCreateFile}
|
|
180
|
-
className="icon-button"
|
|
181
|
-
>
|
|
182
|
-
<NewSVG />
|
|
183
|
-
</i>
|
|
204
|
+
</OverlayTrigger>
|
|
184
205
|
</div>
|
|
185
206
|
</div>
|
|
186
207
|
{filesExist ? (
|
|
@@ -209,13 +230,9 @@ export const VZSidebar = ({
|
|
|
209
230
|
<div className="empty">
|
|
210
231
|
<div className="empty-text">
|
|
211
232
|
It looks like you don't have any files yet!
|
|
212
|
-
Click the "Create file" button
|
|
233
|
+
Click the "Create file" button above to create
|
|
213
234
|
your first file.
|
|
214
235
|
</div>
|
|
215
|
-
|
|
216
|
-
<CreateFileButton
|
|
217
|
-
handleCreateFile={handleCreateFile}
|
|
218
|
-
/>
|
|
219
236
|
</div>
|
|
220
237
|
)}
|
|
221
238
|
</div>
|
package/src/client/index.ts
CHANGED
package/src/client/useURLSync.ts
CHANGED
|
@@ -78,6 +78,14 @@ export const useURLSync = ({
|
|
|
78
78
|
contentRef.current = content;
|
|
79
79
|
}, [content]);
|
|
80
80
|
|
|
81
|
+
// track setSearchParams in a ref so that we can use it in the
|
|
82
|
+
// effect below without triggering the effect on each render.
|
|
83
|
+
// The definition of `setSearchParams` changes on every render.
|
|
84
|
+
const setSearchParamsRef = useRef(setSearchParams);
|
|
85
|
+
useEffect(() => {
|
|
86
|
+
setSearchParamsRef.current = setSearchParams;
|
|
87
|
+
}, [setSearchParams]);
|
|
88
|
+
|
|
81
89
|
// Update the URL to match the current state whenever
|
|
82
90
|
// the active file or tab list changes.
|
|
83
91
|
useEffect(() => {
|
|
@@ -93,42 +101,37 @@ export const useURLSync = ({
|
|
|
93
101
|
content: contentRef.current,
|
|
94
102
|
});
|
|
95
103
|
|
|
96
|
-
if
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
// Update the URL if the search parameters have changed.
|
|
105
|
+
setSearchParamsRef.current(
|
|
106
|
+
(oldSearchParams: URLSearchParams) => {
|
|
107
|
+
// Create a copy of the old search params
|
|
108
|
+
const updatedSearchParams = new URLSearchParams(
|
|
109
|
+
oldSearchParams,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
// Set the 'file' parameter
|
|
113
|
+
if (newTabStateParams.file) {
|
|
114
|
+
updatedSearchParams.set(
|
|
115
|
+
'file',
|
|
116
|
+
newTabStateParams.file,
|
|
106
117
|
);
|
|
118
|
+
} else {
|
|
119
|
+
updatedSearchParams.delete('file'); // Remove 'file' if it's not present in newTabStateParams
|
|
120
|
+
}
|
|
107
121
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
);
|
|
124
|
-
} else {
|
|
125
|
-
updatedSearchParams.delete('tabs'); // Remove 'tabs' if it's not present in newTabStateParams
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Return the updated search params
|
|
129
|
-
return updatedSearchParams;
|
|
130
|
-
},
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}, [searchParams, tabList, activeFileId]);
|
|
122
|
+
// Set the 'tabs' parameter
|
|
123
|
+
if (newTabStateParams.tabs) {
|
|
124
|
+
updatedSearchParams.set(
|
|
125
|
+
'tabs',
|
|
126
|
+
newTabStateParams.tabs,
|
|
127
|
+
);
|
|
128
|
+
} else {
|
|
129
|
+
updatedSearchParams.delete('tabs'); // Remove 'tabs' if it's not present in newTabStateParams
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Return the updated search params
|
|
133
|
+
return updatedSearchParams;
|
|
134
|
+
},
|
|
135
|
+
);
|
|
136
|
+
}, [tabList, activeFileId]);
|
|
134
137
|
};
|