+
v.variable)}
/>
)}
+
+ )
+}
+
+const SnippetSidebar = (props: SnippetSidebarProps) => {
+ return (
+
)
}
diff --git a/web/app/components/snippets/store/__tests__/index.spec.ts b/web/app/components/snippets/store/__tests__/index.spec.ts
index 8117db552b7..06005c97a57 100644
--- a/web/app/components/snippets/store/__tests__/index.spec.ts
+++ b/web/app/components/snippets/store/__tests__/index.spec.ts
@@ -1,4 +1,4 @@
-import type { SnippetInputField } from '@/models/snippet'
+import type { SnippetDetail, SnippetInputField } from '@/models/snippet'
import { PipelineInputVarType } from '@/models/pipeline'
import { useSnippetDetailStore } from '..'
@@ -9,6 +9,15 @@ const createField = (variable: string): SnippetInputField => ({
required: true,
})
+const snippet: SnippetDetail = {
+ id: 'snippet-1',
+ name: 'Snippet',
+ description: 'Description',
+ updatedAt: '2026-03-29 10:00',
+ usage: '0',
+ tags: [],
+}
+
describe('useSnippetDetailStore', () => {
beforeEach(() => {
useSnippetDetailStore.getState().reset()
@@ -28,4 +37,32 @@ describe('useSnippetDetailStore', () => {
expect(useSnippetDetailStore.getState().fields).toEqual([])
})
+
+ it('should store and reset snippet navigation state', () => {
+ const onFieldsChange = vi.fn()
+
+ useSnippetDetailStore.getState().setNavigationState({
+ snippetId: 'snippet-1',
+ snippet,
+ readonly: false,
+ onFieldsChange,
+ })
+
+ expect(useSnippetDetailStore.getState()).toMatchObject({
+ snippetId: 'snippet-1',
+ snippet,
+ readonly: false,
+ onFieldsChange,
+ })
+
+ useSnippetDetailStore.getState().reset()
+
+ expect(useSnippetDetailStore.getState()).toMatchObject({
+ fields: [],
+ readonly: true,
+ snippet: undefined,
+ snippetId: undefined,
+ onFieldsChange: undefined,
+ })
+ })
})
diff --git a/web/app/components/snippets/store/index.ts b/web/app/components/snippets/store/index.ts
index db8b41efdba..ee4006f6d7a 100644
--- a/web/app/components/snippets/store/index.ts
+++ b/web/app/components/snippets/store/index.ts
@@ -1,20 +1,33 @@
'use client'
-import type { SnippetInputField } from '@/models/snippet'
+import type { SnippetDetail, SnippetInputField } from '@/models/snippet'
import { create } from 'zustand'
+type SnippetNavigationState = {
+ snippet?: SnippetDetail
+ snippetId?: string
+ readonly: boolean
+ onFieldsChange?: (fields: SnippetInputField[]) => void
+}
+
type SnippetDetailUIState = {
fields: SnippetInputField[]
setFields: (fields: SnippetInputField[]) => void
+ setNavigationState: (state: SnippetNavigationState) => void
reset: () => void
-}
+} & SnippetNavigationState
const initialState = {
fields: [] as SnippetInputField[],
+ readonly: true,
+ snippet: undefined,
+ snippetId: undefined,
+ onFieldsChange: undefined,
}
export const useSnippetDetailStore = create
(set => ({
...initialState,
setFields: fields => set({ fields }),
+ setNavigationState: state => set(state),
reset: () => set(initialState),
}))