- setUrlType(value)
+ selectedValue={
+ urlOptions.find((opt) => opt.value === ingestor.type) || null
+ }
+ onSelect={(selected: { label: string; value: string }) =>
+ handleIngestorTypeChange(selected.value as IngestorType)
}
size="w-full"
rounded="3xl"
/>
- {urlType.label !== 'Reddit' && urlType.label !== 'GitHub' ? (
- <>
- setUrlName(e.target.value)}
- borderVariant="thin"
- >
-
-
- {t('modals.uploadDoc.name')}
-
-
- setUrl(e.target.value)}
- borderVariant="thin"
- >
-
-
- {t('modals.uploadDoc.link')}
-
-
- >
- ) : urlType.label === 'GitHub' ? ( // P3f93
- <>
- setUrlName(e.target.value)}
- borderVariant="thin"
- >
-
-
- {t('modals.uploadDoc.name')}
-
-
- setRepoUrl(e.target.value)}
- borderVariant="thin"
- >
-
-
- {t('modals.uploadDoc.repoUrl')}
-
-
- >
- ) : (
-
-
-
-
-
- {t('modals.uploadDoc.reddit.id')}
-
-
-
-
-
-
-
- {t('modals.uploadDoc.reddit.secret')}
-
-
-
-
-
-
-
- {t('modals.uploadDoc.reddit.agent')}
-
-
-
-
-
-
-
- {t('modals.uploadDoc.reddit.searchQueries')}
-
-
-
-
-
-
-
- {t('modals.uploadDoc.reddit.numberOfPosts')}
-
-
-
-
- )}
+ {/* Dynamically render form fields based on schema */}
+
+
+ setIngestor({ ...ingestor, name: e.target.value })
+ }
+ borderVariant="thin"
+ placeholder="Name"
+ label="Name"
+ />
+ {renderFormFields()}
>
)}
@@ -615,33 +643,8 @@ function Upload({
uploadRemote();
}
}}
- disabled={
- (activeTab === 'file' && (!files.length || !docName)) ||
- (activeTab === 'remote' &&
- ((urlType.label !== 'Reddit' &&
- urlType.label !== 'GitHub' &&
- (!url || !urlName)) ||
- (urlType.label === 'GitHub' && !repoUrl) ||
- (urlType.label === 'Reddit' &&
- (!redditData.client_id ||
- !redditData.client_secret ||
- !redditData.user_agent ||
- !redditData.search_queries ||
- !redditData.number_posts))))
- }
className={`rounded-3xl px-4 py-2 font-medium ${
- (activeTab === 'file' && (!files.length || !docName)) ||
- (activeTab === 'remote' &&
- ((urlType.label !== 'Reddit' &&
- urlType.label !== 'GitHub' &&
- (!url || !urlName)) ||
- (urlType.label === 'GitHub' && !repoUrl) ||
- (urlType.label === 'Reddit' &&
- (!redditData.client_id ||
- !redditData.client_secret ||
- !redditData.user_agent ||
- !redditData.search_queries ||
- !redditData.number_posts))))
+ isUploadDisabled()
? 'cursor-not-allowed bg-gray-300 text-gray-500'
: 'cursor-pointer bg-purple-30 text-white hover:bg-purple-40'
}`}
diff --git a/frontend/src/upload/types/ingestor.ts b/frontend/src/upload/types/ingestor.ts
new file mode 100644
index 00000000..83c74bfd
--- /dev/null
+++ b/frontend/src/upload/types/ingestor.ts
@@ -0,0 +1,136 @@
+export interface BaseIngestorConfig {
+ name: string;
+}
+
+export interface RedditIngestorConfig extends BaseIngestorConfig {
+ client_id: string;
+ client_secret: string;
+ user_agent: string;
+ search_queries: string;
+ number_posts: number;
+}
+
+export interface GithubIngestorConfig extends BaseIngestorConfig {
+ repo_url: string;
+}
+
+export interface CrawlerIngestorConfig extends BaseIngestorConfig {
+ url: string;
+}
+
+export interface UrlIngestorConfig extends BaseIngestorConfig {
+ url: string;
+}
+
+export type IngestorType = 'crawler' | 'github' | 'reddit' | 'url';
+
+export interface IngestorConfig {
+ type: IngestorType;
+ name: string;
+ config:
+ | RedditIngestorConfig
+ | GithubIngestorConfig
+ | CrawlerIngestorConfig
+ | UrlIngestorConfig;
+}
+
+export type IngestorFormData = {
+ name: string;
+ user: string;
+ source: IngestorType;
+ data: string;
+};
+
+export type FieldType = 'string' | 'number' | 'enum' | 'boolean';
+
+export interface FormField {
+ name: keyof BaseIngestorConfig | string;
+ label: string;
+ type: FieldType;
+ options?: { label: string; value: string }[];
+}
+
+export const IngestorFormSchemas: Record = {
+ crawler: [
+ {
+ name: 'url',
+ label: 'URL',
+ type: 'string',
+ },
+ ],
+ url: [
+ {
+ name: 'url',
+ label: 'URL',
+ type: 'string',
+ },
+ ],
+ reddit: [
+ {
+ name: 'client_id',
+ label: 'Client ID',
+ type: 'string',
+ },
+ {
+ name: 'client_secret',
+ label: 'Client Secret',
+ type: 'string',
+ },
+ {
+ name: 'user_agent',
+ label: 'User Agent',
+ type: 'string',
+ },
+ {
+ name: 'search_queries',
+ label: 'Search Queries',
+ type: 'string',
+ },
+ {
+ name: 'number_posts',
+ label: 'Number of Posts',
+ type: 'number',
+ },
+ ],
+ github: [
+ {
+ name: 'repo_url',
+ label: 'Repository URL',
+ type: 'string',
+ },
+ ],
+};
+
+export const IngestorDefaultConfigs: Record<
+ IngestorType,
+ Omit
+> = {
+ crawler: {
+ name: '',
+ config: {
+ url: '',
+ } as CrawlerIngestorConfig,
+ },
+ url: {
+ name: '',
+ config: {
+ url: '',
+ } as UrlIngestorConfig,
+ },
+ reddit: {
+ name: '',
+ config: {
+ client_id: '',
+ client_secret: '',
+ user_agent: '',
+ search_queries: '',
+ number_posts: 10,
+ } as RedditIngestorConfig,
+ },
+ github: {
+ name: '',
+ config: {
+ repo_url: '',
+ } as GithubIngestorConfig,
+ },
+};