diff --git a/packages/web/src/components/editor/HttpEditorWithExecution.tsx b/packages/web/src/components/editor/HttpEditorWithExecution.tsx index c203678..10a75fb 100644 --- a/packages/web/src/components/editor/HttpEditorWithExecution.tsx +++ b/packages/web/src/components/editor/HttpEditorWithExecution.tsx @@ -1,5 +1,5 @@ import { type Component, createEffect, createSignal, on, onCleanup, Show } from 'solid-js'; -import { useConnection, useObserver, useWorkspace } from '../../context'; +import { HttpRequestEditorProvider, useConnection, useObserver, useWorkspace } from '../../context'; import { useEditorPanelState } from '../../hooks/useEditorPanelState'; import { useHttpRequestWorkspace } from '../../hooks/useHttpRequestWorkspace'; import { ExecutionDetail } from '../execution/ExecutionDetail'; @@ -116,7 +116,7 @@ export const HttpEditorWithExecution: Component = }); return ( - <> + = void httpWorkspace.drafts.body.onBodyCopy()} - onSaveBody={httpWorkspace.drafts.body.onSave} - onDiscardBody={httpWorkspace.drafts.body.onDiscard} /> } @@ -193,7 +157,7 @@ export const HttpEditorWithExecution: Component = onCollapseChange={panelState.setCollapsed} /> - + ); }; diff --git a/packages/web/src/components/request-workspace/request-workspace-tabs.tsx b/packages/web/src/components/request-workspace/request-workspace-tabs.tsx index 9abb692..e8b4883 100644 --- a/packages/web/src/components/request-workspace/request-workspace-tabs.tsx +++ b/packages/web/src/components/request-workspace/request-workspace-tabs.tsx @@ -1,10 +1,6 @@ import { createMemo, For, Match, Show, Switch } from 'solid-js'; +import { useHttpRequestEditor } from '../../context'; import type { WorkspaceRequest } from '../../sdk'; -import type { - RequestBodyField, - RequestBodySummary, - RequestDetailsRow -} from '../../utils/request-details'; import { toRequestParams } from '../../utils/request-details'; import { REQUEST_WORKSPACE_TABS, type RequestWorkspaceTabId } from './model'; import { @@ -16,42 +12,6 @@ import { interface RequestWorkspaceTabsProps { activeTab: RequestWorkspaceTabId; onTabChange: (tab: RequestWorkspaceTabId) => void; - selectedRequest?: WorkspaceRequest; - requestCount: number; - requestHeaders: RequestDetailsRow[]; - requestBodySummary: RequestBodySummary; - requestBodyDraft: string; - requestBodyFormDataDraft: RequestBodyField[]; - requestBodyFilePathDraft: string; - requestDetailsLoading: boolean; - requestDetailsError?: string; - headerDraftDirty: boolean; - headerDraftSaving: boolean; - headerDraftSaveError?: string; - onHeaderChange: (index: number, field: 'key' | 'value', value: string) => void; - onAddHeader: () => void; - onRemoveHeader: (index: number) => void; - onSaveHeaders: () => void; - onDiscardHeaders: () => void; - bodyDraftDirty: boolean; - bodyDraftSaving: boolean; - bodyDraftSaveError?: string; - bodyDraftValidationError?: string; - bodyDraftIsJsonEditable: boolean; - bodyDraftTemplateWarnings: string[]; - onBodyChange: (value: string) => void; - onBodyFilePathChange: (value: string) => void; - onBodyFormDataNameChange: (index: number, value: string) => void; - onBodyFormDataTypeChange: (index: number, isFile: boolean) => void; - onBodyFormDataValueChange: (index: number, value: string) => void; - onBodyFormDataFilenameChange: (index: number, value: string) => void; - onBodyFormDataAddField: () => void; - onBodyFormDataRemoveField: (index: number) => void; - onBodyPrettify: () => void; - onBodyMinify: () => void; - onBodyCopy: () => void; - onSaveBody: () => void; - onDiscardBody: () => void; } const TAB_LABELS: Record = { @@ -61,14 +21,21 @@ const TAB_LABELS: Record = { }; export function RequestWorkspaceTabs(props: RequestWorkspaceTabsProps) { + const httpWorkspace = useHttpRequestEditor(); + const requestParams = createMemo(() => { - const request = props.selectedRequest; + const request = httpWorkspace.selection.selected(); if (!request) { return []; } return toRequestParams(request.url); }); + const selectedRequest = createMemo((): WorkspaceRequest | undefined => + httpWorkspace.selection.selected() + ); + const requestCount = (): number => httpWorkspace.requests.count(); + return (
- {props.requestCount} req + {requestCount()} req @@ -103,7 +70,7 @@ export function RequestWorkspaceTabs(props: RequestWorkspaceTabsProps) {
Select a request to view {TAB_LABELS[props.activeTab].toLowerCase()}.

} > {(request) => ( @@ -116,59 +83,64 @@ export function RequestWorkspaceTabs(props: RequestWorkspaceTabsProps) { Loading request headers…

} > {props.requestDetailsError}

} + when={!httpWorkspace.drafts.parse.error()} + fallback={

{httpWorkspace.drafts.parse.error()}

} >
- Loading request body…

}> + Loading request body…

} + > {props.requestDetailsError}

} + when={!httpWorkspace.drafts.parse.error()} + fallback={

{httpWorkspace.drafts.parse.error()}

} > void httpWorkspace.drafts.body.onBodyCopy()} + onSaveBody={httpWorkspace.drafts.body.onSave} + onDiscardBody={httpWorkspace.drafts.body.onDiscard} />
diff --git a/packages/web/src/context/httpRequestEditor.tsx b/packages/web/src/context/httpRequestEditor.tsx new file mode 100644 index 0000000..d31c69d --- /dev/null +++ b/packages/web/src/context/httpRequestEditor.tsx @@ -0,0 +1,18 @@ +import type { HttpRequestWorkspaceState } from '../hooks/useHttpRequestWorkspace'; +import { createSimpleContext } from '../utils/createSimpleContext'; + +// Context for HTTP request editor - provides workspace state to child components +// This eliminates prop drilling from HttpEditorWithExecution to RequestWorkspaceTabs + +interface HttpRequestEditorContextProps extends Record { + store: HttpRequestWorkspaceState; +} + +const context = createSimpleContext({ + name: 'HttpRequestEditor', + gate: false, // No async initialization needed + init: (props) => props.store +}); + +export const useHttpRequestEditor = context.use; +export const HttpRequestEditorProvider = context.provider; diff --git a/packages/web/src/context/index.ts b/packages/web/src/context/index.ts index b5617c6..ecc2d49 100644 --- a/packages/web/src/context/index.ts +++ b/packages/web/src/context/index.ts @@ -1,3 +1,4 @@ +export { HttpRequestEditorProvider, useHttpRequestEditor } from './httpRequestEditor'; export { ObserverProvider, useObserver } from './observer'; export { ScriptRunnerProvider, useScriptRunner } from './scriptRunner'; export type { ConnectionState } from './sdk'; diff --git a/packages/web/src/hooks/useHttpRequestWorkspace.ts b/packages/web/src/hooks/useHttpRequestWorkspace.ts index efb2432..46fdefe 100644 --- a/packages/web/src/hooks/useHttpRequestWorkspace.ts +++ b/packages/web/src/hooks/useHttpRequestWorkspace.ts @@ -14,8 +14,8 @@ interface UseHttpRequestWorkspaceInput { workspace: WorkspaceStore; } -// Structured API with domain grouping - prepares for Phase 4 Context -interface HttpRequestWorkspaceState { +// Structured API with domain grouping +export interface HttpRequestWorkspaceState { // Core request selection state selection: { index: Accessor;