vzcode 0.58.0 → 0.60.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/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
- <link
24
- href="https://unpkg.com/boxicons@2.0.7/css/boxicons.min.css"
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.58.0",
3
+ "version": "0.60.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.4",
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={handleRenameIconClick}
195
+ onClick={handleModalOpen}
164
196
  className="icon-button"
165
197
  >
166
- <EditSVG />
198
+ <TrashSVG />
167
199
  </i>
168
- ) : null}
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
- <a
160
- href="https://github.com/vizhub-core/vzcode/issues/new"
161
- target="_blank"
162
- rel="noopener noreferrer"
155
+ <OverlayTrigger
156
+ placement="left"
157
+ overlay={
158
+ <Tooltip id="report-bug-tooltip">
159
+ {reportBugTooltipText}
160
+ </Tooltip>
161
+ }
163
162
  >
164
- <i className="icon-button">
165
- <BugSVG />
166
- </i>
167
- </a>
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={handleSettingsClick}
199
+ onClick={handleCreateFile}
172
200
  className="icon-button"
173
201
  >
174
- <GearSVG />
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 below to create
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>
@@ -1,7 +1,7 @@
1
1
  .vz-sidebar {
2
2
  height: 100%;
3
3
  color: var(--vh-color-neutral-04);
4
- background: #1f2022;
4
+ background: var(--vh-color-neutral-01);
5
5
  display: flex;
6
6
  flex-direction: column;
7
7
  justify-content: space-between;
@@ -13,3 +13,5 @@ export {
13
13
  } from './SplitPaneResizeContext';
14
14
  export { useSubmitOperation } from './useSubmitOperation';
15
15
  export { shouldTriggerRun } from './shouldTriggerRun';
16
+
17
+ export * from './Icons';
@@ -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
- tabStateParams.file !== newTabStateParams.file ||
98
- tabStateParams.tabs !== newTabStateParams.tabs
99
- ) {
100
- // Update the URL if the search parameters have changed.
101
- setSearchParams(
102
- (oldSearchParams: URLSearchParams) => {
103
- // Create a copy of the old search params
104
- const updatedSearchParams = new URLSearchParams(
105
- oldSearchParams,
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
- // Set the 'file' parameter
109
- if (newTabStateParams.file) {
110
- updatedSearchParams.set(
111
- 'file',
112
- newTabStateParams.file,
113
- );
114
- } else {
115
- updatedSearchParams.delete('file'); // Remove 'file' if it's not present in newTabStateParams
116
- }
117
-
118
- // Set the 'tabs' parameter
119
- if (newTabStateParams.tabs) {
120
- updatedSearchParams.set(
121
- 'tabs',
122
- newTabStateParams.tabs,
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
  };
package/src/index.ts CHANGED
@@ -1,25 +1,2 @@
1
- export type {
2
- FileId,
3
- Files,
4
- File,
5
- FileTree,
6
- FileTreeFile,
7
- ShareDBDoc,
8
- VZCodeContent,
9
- } from './types';
10
- export type {
11
- ThemeLabel,
12
- ThemeOption,
13
- EditorCache,
14
- } from './client';
15
-
16
- export {
17
- VZCodeProvider,
18
- VZResizer,
19
- VZLeft,
20
- VZMiddle,
21
- SplitPaneResizeProvider,
22
- SplitPaneResizeContext,
23
- useSubmitOperation,
24
- shouldTriggerRun,
25
- } from './client';
1
+ export * from './types';
2
+ export * from './client';