- {getConnectorIcon(connectorType, "size-6")}
+ {connectorType ? (
+ getConnectorIcon(connectorType, "size-6")
+ ) : id === "youtube-crawler" ? (
+
+ ) : (
+
+ )}
@@ -101,7 +109,10 @@ export const ConnectorCard: FC = ({
diff --git a/surfsense_web/components/assistant-ui/connector-popup/constants/connector-constants.ts b/surfsense_web/components/assistant-ui/connector-popup/constants/connector-constants.ts
index 189b5cc5c..60126e135 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/constants/connector-constants.ts
+++ b/surfsense_web/components/assistant-ui/connector-popup/constants/connector-constants.ts
@@ -32,6 +32,22 @@ export const OAUTH_CONNECTORS = [
},
] as const;
+// Content Sources (tools that extract and import content from external sources)
+export const CRAWLERS = [
+ {
+ id: "youtube-crawler",
+ title: "YouTube",
+ description: "Crawl YouTube channels and playlists",
+ connectorType: null, // Not a connector, handled separately
+ },
+ {
+ id: "webcrawler-connector",
+ title: "Web Pages",
+ description: "Crawl web content",
+ connectorType: EnumConnectorName.WEBCRAWLER_CONNECTOR,
+ },
+] as const;
+
// Non-OAuth Connectors (redirect to old connector config pages)
export const OTHER_CONNECTORS = [
{
@@ -100,12 +116,6 @@ export const OTHER_CONNECTORS = [
description: "Search ES indexes",
connectorType: EnumConnectorName.ELASTICSEARCH_CONNECTOR,
},
- {
- id: "webcrawler-connector",
- title: "Web Pages",
- description: "Crawl web content",
- connectorType: EnumConnectorName.WEBCRAWLER_CONNECTOR,
- },
{
id: "tavily-api",
title: "Tavily AI",
diff --git a/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts b/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts
index 49b398733..89d8553b6 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts
+++ b/surfsense_web/components/assistant-ui/connector-popup/constants/connector-popup.schemas.ts
@@ -7,7 +7,7 @@ import { searchSourceConnectorTypeEnum } from "@/contracts/types/connector.types
export const connectorPopupQueryParamsSchema = z.object({
modal: z.enum(["connectors"]).optional(),
tab: z.enum(["all", "active"]).optional(),
- view: z.enum(["configure", "edit", "connect"]).optional(),
+ view: z.enum(["configure", "edit", "connect", "youtube"]).optional(),
connector: z.string().optional(),
connectorId: z.string().optional(),
connectorType: z.string().optional(),
diff --git a/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts b/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
index 685d7ad65..a24ada2e3 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
+++ b/surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
@@ -104,6 +104,11 @@ export const useConnectorDialog = () => {
setConnectingConnectorType(params.connectorType);
}
+ // Handle YouTube view
+ if (params.view === "youtube") {
+ // YouTube view is active - no additional state needed
+ }
+
if (params.view === "configure" && params.connector && !indexingConfig) {
const oauthConnector = OAUTH_CONNECTORS.find(c => c.id === params.connector);
if (oauthConnector && allConnectors) {
@@ -177,6 +182,7 @@ export const useConnectorDialog = () => {
if (connectingConnectorType) {
setConnectingConnectorType(null);
}
+ // Clear YouTube view when modal is closed (handled by view param check)
}
} catch (error) {
// Invalid query params - log but don't crash
@@ -270,6 +276,17 @@ export const useConnectorDialog = () => {
[searchSpaceId]
);
+ // Handle creating YouTube crawler (not a connector, shows view in popup)
+ const handleCreateYouTubeCrawler = useCallback(() => {
+ if (!searchSpaceId) return;
+
+ // Update URL to show YouTube view
+ const url = new URL(window.location.href);
+ url.searchParams.set("modal", "connectors");
+ url.searchParams.set("view", "youtube");
+ window.history.pushState({ modal: true }, "", url.toString());
+ }, [searchSpaceId]);
+
// Handle creating webcrawler connector
const handleCreateWebcrawler = useCallback(async () => {
if (!searchSpaceId) return;
@@ -525,6 +542,15 @@ export const useConnectorDialog = () => {
router.replace(url.pathname + url.search, { scroll: false });
}, [router]);
+ // Handle going back from YouTube view
+ const handleBackFromYouTube = useCallback(() => {
+ const url = new URL(window.location.href);
+ url.searchParams.set("modal", "connectors");
+ url.searchParams.set("tab", "all");
+ url.searchParams.delete("view");
+ router.replace(url.pathname + url.search, { scroll: false });
+ }, [router]);
+
// Handle starting indexing
const handleStartIndexing = useCallback(async (refreshConnectors: () => void) => {
if (!indexingConfig || !searchSpaceId) return;
@@ -951,6 +977,7 @@ export const useConnectorDialog = () => {
handleConnectOAuth,
handleConnectNonOAuth,
handleCreateWebcrawler,
+ handleCreateYouTubeCrawler,
handleSubmitConnectForm,
handleStartIndexing,
handleSkipIndexing,
@@ -959,6 +986,7 @@ export const useConnectorDialog = () => {
handleDisconnectConnector,
handleBackFromEdit,
handleBackFromConnect,
+ handleBackFromYouTube,
connectorConfig,
setConnectorConfig,
setIndexingConnectorConfig,
diff --git a/surfsense_web/components/assistant-ui/connector-popup/index.ts b/surfsense_web/components/assistant-ui/connector-popup/index.ts
index 1c5ebc471..7d7b737fd 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/index.ts
+++ b/surfsense_web/components/assistant-ui/connector-popup/index.ts
@@ -12,7 +12,7 @@ export { AllConnectorsTab } from "./tabs/all-connectors-tab";
export { ActiveConnectorsTab } from "./tabs/active-connectors-tab";
// Constants and types
-export { OAUTH_CONNECTORS, OTHER_CONNECTORS } from "./constants/connector-constants";
+export { OAUTH_CONNECTORS, CRAWLERS, OTHER_CONNECTORS } from "./constants/connector-constants";
export type { IndexingConfigState } from "./constants/connector-constants";
// Schemas and validation
diff --git a/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx b/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx
index 330658fbb..b033b5f20 100644
--- a/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx
+++ b/surfsense_web/components/assistant-ui/connector-popup/tabs/active-connectors-tab.tsx
@@ -117,7 +117,7 @@ export const ActiveConnectorsTab: FC
= ({