import { useEffect, useMemo } from 'react'; import { ControllerRenderProps, useFormContext } from 'react-hook-form'; import { Checkbox } from '@/components/ui/checkbox'; import { Input } from '@/components/ui/input'; import { cn } from '@/lib/utils'; /* ---------------- Token Field ---------------- */ export type ConfluenceTokenFieldProps = ControllerRenderProps & { fieldType: 'username' | 'token'; placeholder?: string; disabled?: boolean; }; const ConfluenceTokenField = ({ fieldType, value, onChange, placeholder, disabled, ...rest }: ConfluenceTokenFieldProps) => { return (
onChange(e.target.value)} placeholder={ placeholder || (fieldType === 'token' ? 'Enter your Confluence access token' : 'Confluence username or email') } disabled={disabled} {...rest} />
); }; /* ---------------- Indexing Mode Field ---------------- */ type ConfluenceIndexingMode = 'everything' | 'space' | 'page'; export type ConfluenceIndexingModeFieldProps = ControllerRenderProps; export const ConfluenceIndexingModeField = ( fieldProps: ConfluenceIndexingModeFieldProps, ) => { const { value, onChange, disabled } = fieldProps; const { watch, setValue } = useFormContext(); const mode = useMemo( () => (value as ConfluenceIndexingMode) || 'everything', [value], ); const spaceValue = watch('config.space'); const pageIdValue = watch('config.page_id'); const indexRecursively = watch('config.index_recursively'); useEffect(() => { if (!value) onChange('everything'); }, [value, onChange]); const handleModeChange = (nextMode?: string) => { const normalized = (nextMode || 'everything') as ConfluenceIndexingMode; onChange(normalized); if (normalized === 'everything') { setValue('config.space', '', { shouldDirty: true, shouldTouch: true }); setValue('config.page_id', '', { shouldDirty: true, shouldTouch: true }); setValue('config.index_recursively', false, { shouldDirty: true, shouldTouch: true, }); } else if (normalized === 'space') { setValue('config.page_id', '', { shouldDirty: true, shouldTouch: true }); setValue('config.index_recursively', false, { shouldDirty: true, shouldTouch: true, }); } else if (normalized === 'page') { setValue('config.space', '', { shouldDirty: true, shouldTouch: true }); } }; return (
{INDEX_MODE_OPTIONS.map((option) => { const isActive = option.value === mode; return ( ); })}
{mode === 'everything' && (

This connector will index all pages the provided credentials have access to.

)} {mode === 'space' && (
Space Key
setValue('config.space', e.target.value, { shouldDirty: true, shouldTouch: true, }) } placeholder="e.g. KB" disabled={disabled} />

The Confluence space key to index.

)} {mode === 'page' && (
Page ID
setValue('config.page_id', e.target.value, { shouldDirty: true, shouldTouch: true, }) } placeholder="e.g. 123456" disabled={disabled} />

The Confluence page ID to index.

setValue('config.index_recursively', Boolean(checked), { shouldDirty: true, shouldTouch: true, }) } disabled={disabled} /> Index child pages recursively
)}
); }; const INDEX_MODE_OPTIONS = [ { label: 'Everything', value: 'everything' }, { label: 'Space', value: 'space' }, { label: 'Page', value: 'page' }, ]; export default ConfluenceTokenField;