diff --git a/apps/www/content/3.components/1.chatbot/prompt-input.md b/apps/www/content/3.components/1.chatbot/prompt-input.md index 1eb6694..4cefe03 100644 --- a/apps/www/content/3.components/1.chatbot/prompt-input.md +++ b/apps/www/content/3.components/1.chatbot/prompt-input.md @@ -68,9 +68,8 @@ import type { HTMLAttributes } from 'vue' import type { PromptInputMessage } from './types' import { InputGroup } from '@repo/shadcn-vue/components/ui/input-group' import { cn } from '@repo/shadcn-vue/lib/utils' -import { inject, onMounted, onUnmounted, ref } from 'vue' -import { usePromptInputProvider } from './context' -import { PROMPT_INPUT_KEY } from './types' +import { onMounted, onUnmounted, ref } from 'vue' +import { usePromptInput, usePromptInputProvider } from './context' const props = defineProps<{ class?: HTMLAttributes['class'] @@ -90,23 +89,16 @@ const emit = defineEmits<{ const formRef = ref(null) // --- Dual-mode context handling --- -const inheritedContext = inject(PROMPT_INPUT_KEY, null) -const localContext = inheritedContext - ? null - : usePromptInputProvider({ - initialInput: props.initialInput, - maxFiles: props.maxFiles, - maxFileSize: props.maxFileSize, - accept: props.accept, - onSubmit: msg => emit('submit', msg as any), - onError: err => emit('error', err), - }) - -const context = inheritedContext || localContext +const inheritedContext = usePromptInput(null) -if (!context) { - throw new Error('PromptInput context is missing.') -} +const context = inheritedContext ?? usePromptInputProvider({ + initialInput: props.initialInput, + maxFiles: props.maxFiles, + maxFileSize: props.maxFileSize, + accept: props.accept, + onSubmit: msg => emit('submit', msg as any), + onError: err => emit('error', err), +}) const { fileInputRef, addFiles, submitForm } = context diff --git a/packages/elements/src/prompt-input/PromptInput.vue b/packages/elements/src/prompt-input/PromptInput.vue index a63c55e..c3c2a4f 100644 --- a/packages/elements/src/prompt-input/PromptInput.vue +++ b/packages/elements/src/prompt-input/PromptInput.vue @@ -3,9 +3,8 @@ import type { HTMLAttributes } from 'vue' import type { PromptInputMessage } from './types' import { InputGroup } from '@repo/shadcn-vue/components/ui/input-group' import { cn } from '@repo/shadcn-vue/lib/utils' -import { inject, onMounted, onUnmounted, ref } from 'vue' -import { usePromptInputProvider } from './context' -import { PROMPT_INPUT_KEY } from './types' +import { onMounted, onUnmounted, ref } from 'vue' +import { usePromptInput, usePromptInputProvider } from './context' const props = defineProps<{ class?: HTMLAttributes['class'] @@ -25,23 +24,16 @@ const emit = defineEmits<{ const formRef = ref(null) // --- Dual-mode context handling --- -const inheritedContext = inject(PROMPT_INPUT_KEY, null) -const localContext = inheritedContext - ? null - : usePromptInputProvider({ - initialInput: props.initialInput, - maxFiles: props.maxFiles, - maxFileSize: props.maxFileSize, - accept: props.accept, - onSubmit: msg => emit('submit', msg as any), - onError: err => emit('error', err), - }) +const inheritedContext = usePromptInput(null) -const context = inheritedContext || localContext - -if (!context) { - throw new Error('PromptInput context is missing.') -} +const context = inheritedContext ?? usePromptInputProvider({ + initialInput: props.initialInput, + maxFiles: props.maxFiles, + maxFileSize: props.maxFileSize, + accept: props.accept, + onSubmit: msg => emit('submit', msg as any), + onError: err => emit('error', err), +}) const { fileInputRef, addFiles, submitForm } = context diff --git a/packages/elements/src/prompt-input/context.ts b/packages/elements/src/prompt-input/context.ts index 9b4917a..30afc1e 100644 --- a/packages/elements/src/prompt-input/context.ts +++ b/packages/elements/src/prompt-input/context.ts @@ -1,7 +1,11 @@ import type { AttachmentFile, PromptInputContext } from './types' import { nanoid } from 'nanoid' -import { inject, onBeforeUnmount, provide, ref } from 'vue' -import { PROMPT_INPUT_KEY } from './types' +import { + createContext, +} from 'reka-ui' +import { onBeforeUnmount, ref } from 'vue' + +export const [usePromptInput, providePromptInputContext] = createContext('PromptInput') export function usePromptInputProvider(props: { initialInput?: string @@ -178,14 +182,6 @@ export function usePromptInputProvider(props: { submitForm, } - provide(PROMPT_INPUT_KEY, context) - return context -} - -export function usePromptInput() { - const context = inject(PROMPT_INPUT_KEY) - if (!context) { - throw new Error('usePromptInput must be used within a PromptInput component') - } + providePromptInputContext(context) return context } diff --git a/packages/elements/src/prompt-input/types.ts b/packages/elements/src/prompt-input/types.ts index 54b29a6..8999ee7 100644 --- a/packages/elements/src/prompt-input/types.ts +++ b/packages/elements/src/prompt-input/types.ts @@ -24,5 +24,3 @@ export interface PromptInputContext { openFileDialog: () => void submitForm: () => void } - -export const PROMPT_INPUT_KEY = Symbol('PromptInputContext')