mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-29 02:46:25 +02:00
fix auto-index race conditions and orphaned toasts
This commit is contained in:
parent
20ca49087f
commit
dfb1c6534d
2 changed files with 63 additions and 42 deletions
|
|
@ -241,25 +241,27 @@ export const COMPOSIO_TOOLKITS = [
|
||||||
},
|
},
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
// Per-connector defaults for auto-indexing after OAuth (days back, days forward, periodic frequency in minutes)
|
export interface AutoIndexConfig {
|
||||||
export const AUTO_INDEX_DEFAULTS: Record<string, { daysBack: number; daysForward: number; frequencyMinutes: number }> = {
|
daysBack: number;
|
||||||
// Messaging — high volume, recent messages matter most
|
daysForward: number;
|
||||||
[EnumConnectorName.GOOGLE_GMAIL_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
|
frequencyMinutes: number;
|
||||||
[EnumConnectorName.COMPOSIO_GMAIL_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
|
syncDescription: string;
|
||||||
[EnumConnectorName.SLACK_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
|
}
|
||||||
[EnumConnectorName.DISCORD_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
|
|
||||||
[EnumConnectorName.TEAMS_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440 },
|
export const AUTO_INDEX_DEFAULTS: Record<string, AutoIndexConfig> = {
|
||||||
// Calendar — past context + upcoming events
|
[EnumConnectorName.GOOGLE_GMAIL_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 30 days of emails." },
|
||||||
[EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR]: { daysBack: 90, daysForward: 90, frequencyMinutes: 1440 },
|
[EnumConnectorName.COMPOSIO_GMAIL_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 30 days of emails." },
|
||||||
[EnumConnectorName.COMPOSIO_GOOGLE_CALENDAR_CONNECTOR]: { daysBack: 90, daysForward: 90, frequencyMinutes: 1440 },
|
[EnumConnectorName.SLACK_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 30 days of messages." },
|
||||||
// Project management — medium-term relevance
|
[EnumConnectorName.DISCORD_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 30 days of messages." },
|
||||||
[EnumConnectorName.LINEAR_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440 },
|
[EnumConnectorName.TEAMS_CONNECTOR]: { daysBack: 30, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 30 days of messages." },
|
||||||
[EnumConnectorName.JIRA_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440 },
|
[EnumConnectorName.GOOGLE_CALENDAR_CONNECTOR]: { daysBack: 90, daysForward: 90, frequencyMinutes: 1440, syncDescription: "Syncing 90 days of past and upcoming events." },
|
||||||
[EnumConnectorName.CLICKUP_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440 },
|
[EnumConnectorName.COMPOSIO_GOOGLE_CALENDAR_CONNECTOR]: { daysBack: 90, daysForward: 90, frequencyMinutes: 1440, syncDescription: "Syncing 90 days of past and upcoming events." },
|
||||||
// Knowledge bases — evergreen content
|
[EnumConnectorName.LINEAR_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 90 days of issues." },
|
||||||
[EnumConnectorName.NOTION_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440 },
|
[EnumConnectorName.JIRA_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 90 days of issues." },
|
||||||
[EnumConnectorName.CONFLUENCE_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440 },
|
[EnumConnectorName.CLICKUP_CONNECTOR]: { daysBack: 90, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your last 90 days of tasks." },
|
||||||
[EnumConnectorName.AIRTABLE_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440 },
|
[EnumConnectorName.NOTION_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your pages." },
|
||||||
|
[EnumConnectorName.CONFLUENCE_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your documentation." },
|
||||||
|
[EnumConnectorName.AIRTABLE_CONNECTOR]: { daysBack: 365, daysForward: 0, frequencyMinutes: 1440, syncDescription: "Syncing your bases." },
|
||||||
};
|
};
|
||||||
|
|
||||||
export const AUTO_INDEX_CONNECTOR_TYPES = new Set<string>(Object.keys(AUTO_INDEX_DEFAULTS));
|
export const AUTO_INDEX_CONNECTOR_TYPES = new Set<string>(Object.keys(AUTO_INDEX_DEFAULTS));
|
||||||
|
|
|
||||||
|
|
@ -138,7 +138,9 @@ export const useConnectorDialog = () => {
|
||||||
const endDate = new Date(now);
|
const endDate = new Date(now);
|
||||||
endDate.setDate(endDate.getDate() + (defaults?.daysForward ?? 0));
|
endDate.setDate(endDate.getDate() + (defaults?.daysForward ?? 0));
|
||||||
|
|
||||||
setIsOpen(true);
|
const toastId = "auto-index";
|
||||||
|
toast.loading(`Setting up ${connectorTitle}...`, { id: toastId });
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await updateConnector({
|
await updateConnector({
|
||||||
id: connector.id,
|
id: connector.id,
|
||||||
|
|
@ -165,32 +167,24 @@ export const useConnectorDialog = () => {
|
||||||
);
|
);
|
||||||
|
|
||||||
toast.success(`${connectorTitle} connected!`, {
|
toast.success(`${connectorTitle} connected!`, {
|
||||||
description: "Syncing started. Your data will be available shortly.",
|
id: toastId,
|
||||||
|
description: defaults?.syncDescription ?? "Syncing started.",
|
||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Auto-index failed:", error);
|
console.error("Auto-index failed:", error);
|
||||||
toast.success(`${connectorTitle} connected!`, {
|
toast.error(`${connectorTitle} connected, but sync failed`, {
|
||||||
description:
|
id: toastId,
|
||||||
"Connected successfully, but syncing could not start. You can start it from settings.",
|
description: "You can start syncing from settings.",
|
||||||
});
|
});
|
||||||
|
} finally {
|
||||||
|
queryClient.invalidateQueries({
|
||||||
|
queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
|
||||||
|
});
|
||||||
|
await refetchAllConnectors();
|
||||||
|
isAutoIndexingRef.current = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const url = new URL(window.location.href);
|
|
||||||
url.searchParams.delete("success");
|
|
||||||
url.searchParams.delete("connector");
|
|
||||||
url.searchParams.delete("connectorId");
|
|
||||||
url.searchParams.delete("view");
|
|
||||||
url.searchParams.delete("modal");
|
|
||||||
url.searchParams.delete("tab");
|
|
||||||
router.replace(url.pathname + url.search, { scroll: false });
|
|
||||||
|
|
||||||
queryClient.invalidateQueries({
|
|
||||||
queryKey: cacheKeys.logs.summary(Number(searchSpaceId)),
|
|
||||||
});
|
|
||||||
await refetchAllConnectors();
|
|
||||||
isAutoIndexingRef.current = false;
|
|
||||||
},
|
},
|
||||||
[searchSpaceId, indexConnector, updateConnector, refetchAllConnectors, setIsOpen, router]
|
[searchSpaceId, indexConnector, updateConnector, refetchAllConnectors]
|
||||||
);
|
);
|
||||||
|
|
||||||
// Synchronize state with URL query params
|
// Synchronize state with URL query params
|
||||||
|
|
@ -410,8 +404,29 @@ export const useConnectorDialog = () => {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.success === "true" && searchSpaceId && params.modal === "connectors") {
|
if (params.success === "true" && searchSpaceId && params.modal === "connectors") {
|
||||||
|
// For auto-index connectors: close modal and show loading toast before refetch
|
||||||
|
const earlyConnector = params.connector
|
||||||
|
? OAUTH_CONNECTORS.find((c) => c.id === params.connector) ||
|
||||||
|
COMPOSIO_CONNECTORS.find((c) => c.id === params.connector)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
if (earlyConnector && AUTO_INDEX_CONNECTOR_TYPES.has(earlyConnector.connectorType)) {
|
||||||
|
toast.loading(`Setting up ${earlyConnector.title}...`, { id: "auto-index" });
|
||||||
|
const url = new URL(window.location.href);
|
||||||
|
url.searchParams.delete("success");
|
||||||
|
url.searchParams.delete("connector");
|
||||||
|
url.searchParams.delete("connectorId");
|
||||||
|
url.searchParams.delete("view");
|
||||||
|
url.searchParams.delete("modal");
|
||||||
|
url.searchParams.delete("tab");
|
||||||
|
router.replace(url.pathname + url.search, { scroll: false });
|
||||||
|
}
|
||||||
|
|
||||||
refetchAllConnectors().then(async (result) => {
|
refetchAllConnectors().then(async (result) => {
|
||||||
if (!result.data) return;
|
if (!result.data) {
|
||||||
|
toast.dismiss("auto-index");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let newConnector: SearchSourceConnector | undefined;
|
let newConnector: SearchSourceConnector | undefined;
|
||||||
let oauthConnector:
|
let oauthConnector:
|
||||||
|
|
@ -466,6 +481,7 @@ export const useConnectorDialog = () => {
|
||||||
oauthConnector.connectorType
|
oauthConnector.connectorType
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
toast.dismiss("auto-index");
|
||||||
const config = validateIndexingConfigState({
|
const config = validateIndexingConfigState({
|
||||||
connectorType: oauthConnector.connectorType,
|
connectorType: oauthConnector.connectorType,
|
||||||
connectorId: newConnector.id,
|
connectorId: newConnector.id,
|
||||||
|
|
@ -483,8 +499,11 @@ export const useConnectorDialog = () => {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.warn("Invalid connector data after OAuth:", connectorValidation.error);
|
console.warn("Invalid connector data after OAuth:", connectorValidation.error);
|
||||||
|
toast.dismiss("auto-index");
|
||||||
toast.error("Failed to validate connector data");
|
toast.error("Failed to validate connector data");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
toast.dismiss("auto-index");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
@ -492,7 +511,7 @@ export const useConnectorDialog = () => {
|
||||||
// Invalid query params - log but don't crash
|
// Invalid query params - log but don't crash
|
||||||
console.warn("Invalid connector popup query params in OAuth success handler:", error);
|
console.warn("Invalid connector popup query params in OAuth success handler:", error);
|
||||||
}
|
}
|
||||||
}, [searchParams, searchSpaceId, refetchAllConnectors, setIsOpen, handleAutoIndex]);
|
}, [searchParams, searchSpaceId, refetchAllConnectors, setIsOpen, handleAutoIndex, router]);
|
||||||
|
|
||||||
// Handle OAuth connection
|
// Handle OAuth connection
|
||||||
const handleConnectOAuth = useCallback(
|
const handleConnectOAuth = useCallback(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue