Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ability to create and open URLs to create files #4166

Merged
merged 116 commits into from
Jan 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
401dcf8
Rename `homeMachine` and accessories to `projectsMachine`
franknoirot Oct 4, 2024
5822321
Separate out `/home` route from `projectsMachine`
franknoirot Oct 4, 2024
5bd8904
Add logic to navigate out from deleted or renamed project
franknoirot Oct 4, 2024
049e487
Show a warning in the command palette for deleting a project
franknoirot Oct 4, 2024
d7fe827
Make it navigate when you create a project
franknoirot Oct 4, 2024
4f06524
Update "New project" button to use command bar flow
franknoirot Oct 4, 2024
5d8f3f9
More explicit warning message text
franknoirot Oct 4, 2024
f496d94
Merge branch 'main' into franknoirot/4088/decouple-homeMachine
franknoirot Oct 7, 2024
fe6d1f8
Make projects watching code not run in web
franknoirot Oct 7, 2024
bfccb79
Tests first version: nested loops
franknoirot Oct 7, 2024
238163d
Tests second version: flattened
franknoirot Oct 7, 2024
3fc707a
Remove console logs
franknoirot Oct 7, 2024
f163870
Fix tsc
franknoirot Oct 7, 2024
8ab24ce
@jtran feedback, use the type guard util
franknoirot Oct 7, 2024
d1be6d7
A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest)
github-actions[bot] Oct 7, 2024
7545b61
A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest)
github-actions[bot] Oct 7, 2024
3d2e487
A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest)
github-actions[bot] Oct 7, 2024
f0136a5
Fix tests that relied on one-click, no-navigation project creation
franknoirot Oct 8, 2024
75e3f84
Revert "A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest)"
franknoirot Oct 8, 2024
e22a9ed
Revert "A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest)"
franknoirot Oct 8, 2024
372f2ee
Add a mask to the state indicator to client-side scale test
franknoirot Oct 8, 2024
1f515b7
A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest)
github-actions[bot] Oct 8, 2024
9378d98
A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest)
github-actions[bot] Oct 8, 2024
80e32b3
Merge branch 'main' into franknoirot/4088/decouple-homeMachine
franknoirot Oct 8, 2024
48380be
A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest)
github-actions[bot] Oct 8, 2024
f4ecd16
Merge branch 'main' into franknoirot/4088/decouple-homeMachine
franknoirot Oct 8, 2024
14eeafb
Fix lint
franknoirot Oct 8, 2024
403cee5
Fix tsc
franknoirot Oct 8, 2024
30a24c8
Add menu item to share link to file
franknoirot Oct 8, 2024
8141103
Forward query params while redirecting to /home or /file
franknoirot Oct 8, 2024
5dc983a
Add (broken) event logic and command triggering logic
franknoirot Oct 8, 2024
3a9e0c7
Fix a couple stray tests that still relied on the old way of creating…
franknoirot Oct 8, 2024
524fcb0
Merge branch 'franknoirot/4088/decouple-homeMachine' into franknoirot…
franknoirot Oct 8, 2024
02b249b
Merge branch 'main' into franknoirot/update-download-progress
franknoirot Oct 10, 2024
746ebf8
De-flake another text that could be thrown off by toast-based selectors
franknoirot Oct 10, 2024
15bedd5
FMT
franknoirot Oct 10, 2024
1ce3d8c
Dumb test error because I was rushing
franknoirot Oct 10, 2024
c882e34
Merge branch 'franknoirot/4088/decouple-homeMachine' into franknoirot…
franknoirot Oct 10, 2024
a2330a0
A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest)
github-actions[bot] Oct 10, 2024
698ce67
Merge branch 'main' into franknoirot/4088/decouple-homeMachine
franknoirot Oct 10, 2024
4748c2d
Ahhh more flaky toasts, they're everywhere!
franknoirot Oct 10, 2024
36d49b1
A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu-latest)
github-actions[bot] Oct 10, 2024
96b0624
Side quest: Only register commands once, power their disabled status …
franknoirot Oct 10, 2024
d58a147
Get query-triggered command working in browser too
franknoirot Oct 10, 2024
1e5954e
Merge branch 'main' into franknoirot/4088/decouple-homeMachine
franknoirot Oct 11, 2024
b84d595
Merge branch 'main' into franknoirot/4088/decouple-homeMachine
franknoirot Oct 15, 2024
bb67a9e
Merge branch 'franknoirot/4088/decouple-homeMachine' into franknoirot…
franknoirot Oct 15, 2024
cbb8df5
A snapshot a day keeps the bugs away! 📷🐛 (OS: windows-latest)
github-actions[bot] Oct 15, 2024
2048c26
Tests always run on localhost, don't expect the prod origin
franknoirot Oct 16, 2024
2aa4a01
Merge branch 'franknoirot/4088/decouple-homeMachine' into franknoirot…
franknoirot Oct 16, 2024
713886b
rerun CI
franknoirot Oct 17, 2024
570d159
wip
lf94 Oct 17, 2024
2193d56
wip
lf94 Oct 17, 2024
c29be6e
Everything's pretty much done but url.zoo.dev has been broken and we …
lf94 Oct 19, 2024
28eb99f
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 8, 2025
5cbd11c
Add useCreateFileLinkQuery on Home page
franknoirot Jan 8, 2025
ca09224
Get primary user flow working on desktop
franknoirot Jan 8, 2025
670faac
Rework to open browser app first, then send along to the desktop app …
franknoirot Jan 9, 2025
f05acf9
Styling updates to OpenInDesktopAppHandler
franknoirot Jan 10, 2025
a2ff0ae
Clean up unecessary file
franknoirot Jan 10, 2025
91f0cfe
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 10, 2025
ebc6b64
Separate creating `createFileUrl` and shortlink so it is unit testable
franknoirot Jan 10, 2025
e417e60
Add E2E test for importing file from URL
franknoirot Jan 10, 2025
83e72da
Add a couple component tests for OpenInDesktopAppHandler
franknoirot Jan 10, 2025
af702ae
Fix the "existing project" user flow
franknoirot Jan 10, 2025
8b8a2bc
Add E2E test for "add to existing project" user flow
franknoirot Jan 10, 2025
c06b2b4
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 10, 2025
d64270d
Undo mistaken or unecessary changes
franknoirot Jan 10, 2025
679b65f
Lints, fmt, tsc
franknoirot Jan 10, 2025
82aefec
Fix unit test
franknoirot Jan 10, 2025
b30a37a
Fix broken rename and delete project commands
franknoirot Jan 13, 2025
df01c23
Fix unit test, use kebab-case for url query param
franknoirot Jan 13, 2025
08e7140
Use dev urls everywhere when configured that way
iterion Jan 14, 2025
fa3f934
Clean up unneeded PROD_TOKEN
iterion Jan 14, 2025
5438a98
Fix browser command flow, because we had made the projectMachine desk…
franknoirot Jan 15, 2025
68204bb
Make the test executor a bit more patient (#5004)
iterion Jan 11, 2025
1908383
Fix so that all artifact commands are returned regardless of caching …
jtran Jan 11, 2025
4f02e45
Add new lint to disallow use of confusing isNaN (#4999)
jtran Jan 11, 2025
339de00
Point-and-click Sweep (first PR) (#4989)
pierremtb Jan 11, 2025
f7bae1d
Upgrade typescript-eslint from 5.62.0 to 8.19.1 and remove eslint-con…
jtran Jan 11, 2025
585ca7e
Fix lost lints and add new ones (#5011)
jtran Jan 13, 2025
c208e16
Developer workflow: added auto generated workspace file from vitest e…
nadr0 Jan 13, 2025
ef61d10
Change Dependabot PRs to always be made on Mondays (#5025)
jtran Jan 13, 2025
e3660c7
Add packages to Dependabot updates (#5024)
jtran Jan 13, 2025
634745b
Bump @lezer/generator from 1.7.1 to 1.7.2 (#5018)
dependabot[bot] Jan 13, 2025
e753082
Bump handlebars from 6.2.0 to 6.3.0 in /src/wasm-lib (#5012)
dependabot[bot] Jan 13, 2025
b2485b8
Bump syn from 2.0.95 to 2.0.96 in /src/wasm-lib (#5015)
dependabot[bot] Jan 13, 2025
074fd2b
Fix artifact types to be more accurate (#5022)
jtran Jan 13, 2025
6089b19
Fix Cargo.lock to not have changes (#5034)
jtran Jan 13, 2025
abec2d6
Upgrade all wasm-bindgen dependencies together (#5037)
jtran Jan 13, 2025
82bd046
Disable auto-updater on non-versioned builds (#5042)
pierremtb Jan 13, 2025
96ff1dd
turns on helix from edge (#5036)
jessfraz Jan 13, 2025
c3bc1fa
ci: Add yarn test of packages/codemirror-lang-kcl (#5035)
jtran Jan 14, 2025
f266922
Bump xstate from 5.17.4 to 5.19.2 (#5027)
dependabot[bot] Jan 14, 2025
2a2a31d
Hook up chamfer UI with AST-mod (#4694)
max-mrgrsk Jan 14, 2025
e14cc4a
Remove Redundant Fillet Button State Test (#5009)
max-mrgrsk Jan 14, 2025
82cd106
Bump @types/node from 20.14.9 to 22.10.6 in /packages/codemirror-lsp-…
dependabot[bot] Jan 14, 2025
87c4e6c
custom axis and origin example for helix (#5057)
jessfraz Jan 14, 2025
521a593
Bump typescript from 5.7.2 to 5.7.3 (#5021)
dependabot[bot] Jan 14, 2025
0902517
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 16, 2025
f06873a
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 16, 2025
5c1dfe0
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 16, 2025
f908116
Refactor: break out `copyFileShareLink` into standalone function
franknoirot Jan 17, 2025
fb37bb8
Add "Share file" to command palette
franknoirot Jan 17, 2025
fb56820
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 17, 2025
353eca1
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 17, 2025
907102a
Update dumb use of site URL instead of prod app URL
franknoirot Jan 21, 2025
39c40b2
fmt
franknoirot Jan 22, 2025
30275d8
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 22, 2025
410b4e8
@lf94 nit
franknoirot Jan 22, 2025
1ba8c5a
@pierremtb spinner feedback
franknoirot Jan 22, 2025
0477e46
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 22, 2025
58483b4
Hide share link command and disable menu item for now
franknoirot Jan 22, 2025
04f4d01
Merge branch 'main' into franknoirot/4088/create-file-url
pierremtb Jan 23, 2025
f55f7da
Merge branch 'main' into franknoirot/4088/create-file-url
franknoirot Jan 23, 2025
ad89577
Just comment out the command config for now
franknoirot Jan 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 131 additions & 2 deletions e2e/playwright/command-bar-tests.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { test, expect } from './zoo-test'

import { getUtils } from './test-utils'
import * as fsp from 'fs/promises'
import { executorInputPath, getUtils } from './test-utils'
import { KCL_DEFAULT_LENGTH } from 'lib/constants'
import path from 'path'

test.describe('Command bar tests', () => {
test('Extrude from command bar selects extrude line after', async ({
Expand Down Expand Up @@ -305,4 +306,132 @@ test.describe('Command bar tests', () => {
await arcToolCommand.click()
await expect(arcToolButton).toHaveAttribute('aria-pressed', 'true')
})

test(`Reacts to query param to open "import from URL" command`, async ({
page,
cmdBar,
editor,
homePage,
}) => {
await test.step(`Prepare and navigate to home page with query params`, async () => {
const targetURL = `?create-file&name=test&units=mm&code=ZXh0cnVzaW9uRGlzdGFuY2UgPSAxMg%3D%3D&ask-open-desktop`
await homePage.expectState({
projectCards: [],
sortBy: 'last-modified-desc',
})
await page.goto(page.url() + targetURL)
expect(page.url()).toContain(targetURL)
})

await test.step(`Submit the command`, async () => {
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Import file from URL',
currentArgKey: 'method',
currentArgValue: '',
headerArguments: {
Method: '',
Name: 'test',
Code: '1 line',
},
highlightedHeaderArg: 'method',
})
await cmdBar.selectOption({ name: 'New Project' }).click()
await cmdBar.expectState({
stage: 'review',
commandName: 'Import file from URL',
headerArguments: {
Method: 'New project',
Name: 'test',
Code: '1 line',
},
})
await cmdBar.progressCmdBar()
})

await test.step(`Ensure we created the project and are in the modeling scene`, async () => {
await editor.expectEditor.toContain('extrusionDistance = 12')
})
})

test(`"import from URL" can add to existing project`, async ({
page,
cmdBar,
editor,
homePage,
toolbar,
context,
}) => {
await context.folderSetupFn(async (dir) => {
const testProjectDir = path.join(dir, 'testProjectDir')
await Promise.all([fsp.mkdir(testProjectDir, { recursive: true })])
await Promise.all([
fsp.copyFile(
executorInputPath('cylinder.kcl'),
path.join(testProjectDir, 'main.kcl')
),
])
})
await test.step(`Prepare and navigate to home page with query params`, async () => {
const targetURL = `?create-file&name=test&units=mm&code=ZXh0cnVzaW9uRGlzdGFuY2UgPSAxMg%3D%3D&ask-open-desktop`
await homePage.expectState({
projectCards: [
{
fileCount: 1,
title: 'testProjectDir',
},
],
sortBy: 'last-modified-desc',
})
await page.goto(page.url() + targetURL)
expect(page.url()).toContain(targetURL)
})

await test.step(`Submit the command`, async () => {
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Import file from URL',
currentArgKey: 'method',
currentArgValue: '',
headerArguments: {
Method: '',
Name: 'test',
Code: '1 line',
},
highlightedHeaderArg: 'method',
})
await cmdBar.selectOption({ name: 'Existing Project' }).click()
await cmdBar.expectState({
stage: 'arguments',
commandName: 'Import file from URL',
currentArgKey: 'projectName',
currentArgValue: '',
headerArguments: {
Method: 'Existing project',
Name: 'test',
ProjectName: '',
Code: '1 line',
},
highlightedHeaderArg: 'projectName',
})
await cmdBar.selectOption({ name: 'testProjectDir' }).click()
await cmdBar.expectState({
stage: 'review',
commandName: 'Import file from URL',
headerArguments: {
Method: 'Existing project',
ProjectName: 'testProjectDir',
Name: 'test',
Code: '1 line',
},
})
await cmdBar.progressCmdBar()
})

await test.step(`Ensure we created the project and are in the modeling scene`, async () => {
await editor.expectEditor.toContain('extrusionDistance = 12')
await toolbar.openPane('files')
await toolbar.expectFileTreeState(['main.kcl', 'test.kcl'])
})
})
})
7 changes: 7 additions & 0 deletions e2e/playwright/fixtures/cmdBarFixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,11 @@ export class CmdBarFixture {
chooseCommand = async (commandName: string) => {
await this.cmdOptions.getByText(commandName).click()
}

/**
* Select an option from the command bar
*/
selectOption = (options: Parameters<typeof this.page.getByRole>[1]) => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What a funky type :)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm just curious what does VS Code show for the intellisense?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah haha is this not a good idea? Here's intellisense:

Screenshot 2025-01-21 at 7 43 59 PM

return this.page.getByRole('option', options)
}
}
15 changes: 15 additions & 0 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,28 @@ import Gizmo from 'components/Gizmo'
import { CoreDumpManager } from 'lib/coredump'
import { UnitsMenu } from 'components/UnitsMenu'
import { CameraProjectionToggle } from 'components/CameraProjectionToggle'
import { useCreateFileLinkQuery } from 'hooks/useCreateFileLinkQueryWatcher'
import { maybeWriteToDisk } from 'lib/telemetry'
import { commandBarActor } from 'machines/commandBarMachine'
maybeWriteToDisk()
.then(() => {})
.catch(() => {})

export function App() {
const { project, file } = useLoaderData() as IndexLoaderData

// Keep a lookout for a URL query string that invokes the 'import file from URL' command
useCreateFileLinkQuery((argDefaultValues) => {
commandBarActor.send({
type: 'Find and select command',
data: {
groupId: 'projects',
name: 'Import file from URL',
argDefaultValues,
},
})
})

useRefreshSettings(PATHS.FILE + 'SETTINGS')
const navigate = useNavigate()
const filePath = useAbsoluteFilePath()
Expand Down
52 changes: 32 additions & 20 deletions src/Router.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import {
import SettingsAuthProvider from 'components/SettingsAuthProvider'
import LspProvider from 'components/LspProvider'
import { KclContextProvider } from 'lang/KclProvider'
import { BROWSER_PROJECT_NAME } from 'lib/constants'
import { ASK_TO_OPEN_QUERY_PARAM, BROWSER_PROJECT_NAME } from 'lib/constants'
import { CoreDumpManager } from 'lib/coredump'
import { codeManager, engineCommandManager } from 'lib/singletons'
import { useSettingsAuthContext } from 'hooks/useSettingsAuthContext'
Expand All @@ -46,6 +46,7 @@ import { AppStateProvider } from 'AppState'
import { reportRejection } from 'lib/trap'
import { RouteProvider } from 'components/RouteProvider'
import { ProjectsContextProvider } from 'components/ProjectsContextProvider'
import { OpenInDesktopAppHandler } from 'components/OpenInDesktopAppHandler'

const createRouter = isDesktop() ? createHashRouter : createBrowserRouter

Expand All @@ -57,31 +58,42 @@ const router = createRouter([
/* Make sure auth is the outermost provider or else we will have
* inefficient re-renders, use the react profiler to see. */
element: (
<RouteProvider>
<SettingsAuthProvider>
<LspProvider>
<ProjectsContextProvider>
<KclContextProvider>
<AppStateProvider>
<MachineManagerProvider>
<Outlet />
</MachineManagerProvider>
</AppStateProvider>
</KclContextProvider>
</ProjectsContextProvider>
</LspProvider>
</SettingsAuthProvider>
</RouteProvider>
<OpenInDesktopAppHandler>
<RouteProvider>
<SettingsAuthProvider>
<LspProvider>
<ProjectsContextProvider>
<KclContextProvider>
<AppStateProvider>
<MachineManagerProvider>
<Outlet />
</MachineManagerProvider>
</AppStateProvider>
</KclContextProvider>
</ProjectsContextProvider>
</LspProvider>
</SettingsAuthProvider>
</RouteProvider>
</OpenInDesktopAppHandler>
),
errorElement: <ErrorPage />,
children: [
{
path: PATHS.INDEX,
loader: async () => {
loader: async ({ request }) => {
const onDesktop = isDesktop()
return onDesktop
? redirect(PATHS.HOME)
: redirect(PATHS.FILE + '/%2F' + BROWSER_PROJECT_NAME)
const url = new URL(request.url)
if (onDesktop) {
return redirect(PATHS.HOME + (url.search || ''))
} else {
const searchParams = new URLSearchParams(url.search)
if (!searchParams.has(ASK_TO_OPEN_QUERY_PARAM)) {
return redirect(
PATHS.FILE + '/%2F' + BROWSER_PROJECT_NAME + (url.search || '')
)
}
}
return null
},
},
{
Expand Down
1 change: 1 addition & 0 deletions src/components/CommandBar/CommandArgOptionInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ function CommandArgOptionInput({
<label
htmlFor="option-input"
className="capitalize px-2 py-1 rounded-l bg-chalkboard-100 dark:bg-chalkboard-80 text-chalkboard-10 border-b border-b-chalkboard-100 dark:border-b-chalkboard-80"
data-testid="cmd-bar-arg-name"
>
{argName}
</label>
Expand Down
76 changes: 42 additions & 34 deletions src/components/FileMachineProvider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,9 @@ export const FileMachineProvider = ({
children: React.ReactNode
}) => {
const navigate = useNavigate()
const { settings } = useSettingsAuthContext()
const { project, file } = useRouteLoaderData(PATHS.FILE) as IndexLoaderData
const { settings, auth } = useSettingsAuthContext()
const projectData = useRouteLoaderData(PATHS.FILE) as IndexLoaderData
const { project, file } = projectData
const [kclSamples, setKclSamples] = React.useState<KclSamplesManifestItem[]>(
[]
)
Expand Down Expand Up @@ -295,40 +296,47 @@ export const FileMachineProvider = ({

const kclCommandMemo = useMemo(
() =>
kclCommands(
async (data) => {
if (data.method === 'overwrite') {
codeManager.updateCodeStateEditor(data.code)
await kclManager.executeCode(true)
await codeManager.writeToFile()
} else if (data.method === 'newFile' && isDesktop()) {
send({
type: 'Create file',
data: {
name: data.sampleName,
content: data.code,
makeDir: false,
},
})
}
kclCommands({
authToken: auth?.context?.token ?? '',
projectData,
settings: {
defaultUnit: settings?.context?.modeling.defaultUnit.current ?? 'mm',
},
specialPropsForSampleCommand: {
onSubmit: async (data) => {
if (data.method === 'overwrite') {
codeManager.updateCodeStateEditor(data.code)
await kclManager.executeCode(true)
await codeManager.writeToFile()
} else if (data.method === 'newFile' && isDesktop()) {
send({
type: 'Create file',
data: {
name: data.sampleName,
content: data.code,
makeDir: false,
},
})
}

// Either way, we want to overwrite the defaultUnit project setting
// with the sample's setting.
if (data.sampleUnits) {
settings.send({
type: 'set.modeling.defaultUnit',
data: {
level: 'project',
value: data.sampleUnits,
},
})
}
// Either way, we want to overwrite the defaultUnit project setting
// with the sample's setting.
if (data.sampleUnits) {
settings.send({
type: 'set.modeling.defaultUnit',
data: {
level: 'project',
value: data.sampleUnits,
},
})
}
},
providedOptions: kclSamples.map((sample) => ({
value: sample.pathFromProjectDirectoryToFirstFile,
name: sample.title,
})),
},
kclSamples.map((sample) => ({
value: sample.pathFromProjectDirectoryToFirstFile,
name: sample.title,
}))
).filter(
}).filter(
(command) => kclSamples.length || command.name !== 'open-kcl-example'
),
[codeManager, kclManager, send, kclSamples]
Expand Down
Loading
Loading