-
Notifications
You must be signed in to change notification settings - Fork 782
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor: useHydratedSession instead of built-in useSession #2407
Conversation
The latest updates on your projects. Learn more about Vercel for Git βοΈ
|
# Conflicts: # keep-ui/app/layout.tsx # keep-ui/app/settings/auth/permissions-tab.tsx # keep-ui/app/settings/auth/users-sidebar.tsx # keep-ui/app/settings/settings.client.tsx # keep-ui/components/navbar/InitPostHog.tsx # keep-ui/utils/hooks/useConfig.ts
WalkthroughThe changes introduced in this pull request primarily involve updating the session management method across various components and hooks from Changes
Assessment against linked issues
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? πͺ§ TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
@coderabbitai review |
β Actions performedReview triggered.
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 15
π§Ή Outside diff range and nitpick comments (82)
keep-ui/app/auth-provider.tsx (1)
17-17
: Add JSDoc documentation for the NextAuthProvider componentConsider adding documentation to explain the component's purpose and session hydration mechanism.
+/** + * NextAuthProvider component that handles session hydration for client-side requests. + * It stores the session in the window object to enable faster client-side access + * through the useHydratedSession hook. + * + * @param {Props} props - Component props + * @param {React.ReactNode} props.children - Child components to render + * @param {Session | null} [props.session] - Optional session data to hydrate + */ export const NextAuthProvider = ({ children, session }: Props) => {keep-ui/utils/hooks/useTags.ts (1)
Line range hint
8-17
: LGTM: Efficient implementation with SWRThe hook implementation is well-structured:
- Uses conditional fetching to prevent unnecessary requests
- Leverages SWR's immutable mode for performance
- Properly integrates session token for authentication
Consider adding error boundaries or retry logic if the tag fetching is critical for the application's functionality.
keep-ui/utils/hooks/useRoles.ts (1)
Line range hint
8-17
: Consider adding error boundary for role fetching.While the implementation is correct, adding error handling would improve reliability when role fetching fails.
Consider wrapping the hook with error handling:
export const useRoles = (options: SWRConfiguration = {}) => { const apiUrl = useApiUrl(); const { data: session } = useSession(); + const handleError = (error: Error) => { + console.error('Failed to fetch roles:', error); + // Optionally integrate with error reporting + return []; // Return empty array as fallback + }; + return useSWRImmutable<Role[]>( () => (session ? `${apiUrl}/auth/roles` : null), (url) => fetcher(url, session?.accessToken), - options + { ...options, onError: handleError } ); };keep-ui/utils/hooks/useUsers.ts (1)
Line range hint
11-17
: Consider adding type safety for session access.The session object is used without type checking, which could lead to runtime errors if the session structure changes.
Consider adding type safety:
- const { data: session } = useSession(); + const { data: session } = useSession() as { data: { accessToken?: string } | null };keep-ui/utils/hooks/useMaintenanceRules.ts (1)
Line range hint
13-13
: Consider adding type safety for session data.The destructured
session
object is used to accessaccessToken
, but there's no type checking to ensure its presence.Consider adding type safety:
- const { data: session } = useSession(); + const { data: session } = useSession() as { data: { accessToken: string } | null };keep-ui/shared/lib/hooks/useHydratedSession.tsx (1)
3-3
: Consider using a more descriptive alias name.The alias
useNextAuthSession
is good but could be even more explicit about its source, such asuseNextAuthBuiltInSession
to clearly distinguish it from other session hooks.keep-ui/utils/hooks/useDeduplicationRules.ts (1)
Line range hint
8-24
: Consider optimizing SWR cache configurationSince these hooks fetch relatively static data (deduplication rules and fields), consider enhancing performance further by:
- Adding a longer
dedupingInterval
to prevent redundant requests- Implementing a more aggressive
revalidateOnFocus: false
strategy- Setting appropriate
staleTime
for cache invalidationExample configuration:
const defaultOptions: SWRConfiguration = { dedupingInterval: 60000, // 1 minute revalidateOnFocus: false, staleTime: 300000 // 5 minutes };keep-ui/utils/hooks/useAI.ts (1)
Line range hint
27-42
: Well-structured separation of concerns.The separation between SWR-based data fetching and WebSocket-based real-time updates is well-designed. This architecture allows for efficient data synchronization while maintaining clean code organization.
Consider documenting this pattern in your team's best practices, as it's a good example of:
- Clear separation between initial data loading and real-time updates
- Efficient use of WebSocket for real-time changes
- Clean callback handling with proper cleanup
keep-ui/utils/hooks/useAlertQuality.ts (3)
Line range hint
9-33
: Consider memoizing the session data accessThe hook implementation looks good, but there's room for optimization. Since
session
is used in both the key generation and fetcher function, consider memoizing it to prevent unnecessary re-renders.- const { data: session } = useSession(); + const { data: session } = useSession({ + required: false, + }); + const memoizedSession = useMemo(() => session, [session]);
25-25
: Define proper TypeScript types for the metrics responseThe TODO comment indicates missing type definitions. This should be addressed to improve type safety and developer experience.
Would you like me to help define a proper TypeScript interface for the metrics response? This would replace the current
Record<string, Record<string, any>>
type with a more specific and type-safe definition.
Line range hint
26-32
: Consider error handling for failed requestsThe SWR configuration doesn't specify error handling. Consider adding error boundaries or error handling logic.
return useSWRImmutable<Record<string, Record<string, any>>>( () => session ? `${apiUrl}/alerts/quality/metrics${filters ? `?${filters}` : ""}` : null, (url) => fetcher(url, session?.accessToken), - options + { + ...options, + onError: (error) => { + console.error('Failed to fetch alert quality metrics:', error); + // Add custom error handling here + }, + } );keep-ui/app/rules/CorrelationSidebar/DeleteRule.tsx (1)
Line range hint
14-15
: Consider implementing session revalidation strategy.Since we're using a hydrated session for performance optimization, consider implementing a revalidation strategy to handle session expiration and updates. This could include:
- Periodic background revalidation
- Revalidation on focus/reconnect
- Error boundary for handling expired sessions
This will ensure optimal performance while maintaining session security and consistency.
keep-ui/utils/hooks/useDashboardMetricWidgets.ts (2)
39-39
: Remove debugging console.log statement.This appears to be debugging code that should be removed before merging.
- console.log(filters);
31-38
: Consider adding error handling for session token.The code assumes the session token will always be available when the session exists. Consider adding proper error handling for cases where the token might be missing or expired.
const { data, error, mutate } = useSWR<DashboardDistributionData>( session ? `${apiUrl}/dashboard/metric-widgets${ useFilters && filters ? `?${filters}` : "" }` : null, - (url: string) => fetcher(url, session!.accessToken) + (url: string) => { + if (!session?.accessToken) { + throw new Error('Invalid session token'); + } + return fetcher(url, session.accessToken); + } );keep-ui/app/incidents/[id]/alerts/incident-alert-menu.tsx (1)
Line range hint
15-17
: Consider adding session state validation.The component assumes the session will be available when needed. Consider adding error handling for cases where the session is not available or expired.
export default function IncidentAlertMenu({ incidentId, alert }: Props) { const apiUrl = useApiUrl(); const { data: session } = useSession(); + if (!session?.accessToken) { + return null; // or show an appropriate error state + } const { mutate } = useIncidentAlerts(incidentId);keep-ui/app/topology/model/useTopology.ts (2)
Line range hint
20-33
: Address memoization TODO to prevent unnecessary rerendersThe TODO comment flags a critical performance concern. When this hook is used multiple times in the component tree, each instance could trigger unnecessary rerenders.
Consider these improvements:
- Memoize the options object using
useMemo
- Memoize the return value using
useMemo
- Use
useCallback
for the mutate functionWould you like me to provide an optimized implementation that addresses these concerns?
Line range hint
51-56
: Remove console.log statementThe console.log statement appears to be a debugging artifact and should be removed from production code.
useEffect(() => { if (pollTopology) { mutate(); - console.log("mutate triggered because of pollTopology"); } }, [pollTopology, mutate]);
keep-ui/utils/hooks/useWorkflowExecutions.ts (1)
Line range hint
25-54
: Consider refactoring parameter handling for better maintainability.The current implementation could benefit from some improvements:
- Extract parameter validation logic into a separate function
- Define constants for magic numbers
- Filter relevant search params to prevent unexpected query parameters
Consider this refactor:
+ const LIMITS = { + MAX: 50, + DEFAULT: 25, + OVERFLOW: 100 + }; + + const TAB_LIMITS = { + MIN: 0, + MAX: 3 + }; + + const validateParams = (params: { + limit?: number, + offset?: number, + tab?: number + }) => ({ + limit: Math.min( + Math.max(params.limit ?? LIMITS.DEFAULT, LIMITS.DEFAULT), + params.limit > LIMITS.OVERFLOW ? LIMITS.MAX : LIMITS.OVERFLOW + ), + offset: Math.max(params.offset ?? 0, 0), + tab: Math.min(Math.max(params.tab ?? 0, TAB_LIMITS.MIN), TAB_LIMITS.MAX) + }); export const useWorkflowExecutionsV2 = ( workflowId: string, tab: number = 0, limit: number = 25, offset: number = 0 ) => { const apiUrl = useApiUrl(); const { data: session } = useSession(); const searchParams = useSearchParams(); - limit = searchParams?.get("limit") - ? Number(searchParams?.get("limit")) - : limit; - offset = searchParams?.get("offset") - ? Number(searchParams?.get("offset")) - : offset; - tab = searchParams?.get("tab") ? Number(searchParams?.get("tab")) : tab; - limit = limit > 100 ? 50 : limit; - limit = limit <= 0 ? 25 : limit; - offset = offset < 0 ? 0 : offset; - tab = tab < 0 ? 0 : tab; - tab = tab > 3 ? 3 : tab; + const params = validateParams({ + limit: Number(searchParams?.get("limit")) || limit, + offset: Number(searchParams?.get("offset")) || offset, + tab: Number(searchParams?.get("tab")) || tab + }); + + // Filter only relevant search params + const relevantParams = new URLSearchParams(); + ['sort', 'order', 'search'].forEach(param => { + const value = searchParams?.get(param); + if (value) relevantParams.append(param, value); + }); return useSWR<PaginatedWorkflowExecutionDto>( () => session - ? `${apiUrl}/workflows/${workflowId}/runs?v2=true&tab=${tab}&limit=${limit}&offset=${offset}${ - searchParams ? `&${searchParams.toString()}` : "" - }` + ? `${apiUrl}/workflows/${workflowId}/runs?v2=true&tab=${params.tab}&limit=${params.limit}&offset=${params.offset}${ + relevantParams.toString() ? `&${relevantParams.toString()}` : "" + }` : null, (url: string) => fetcher(url, session?.accessToken) ); };keep-ui/app/incidents/[id]/activity/ui/IncidentActivityComment.tsx (1)
Line range hint
22-36
: Enhance error handling for API requests.Consider extracting more specific error information from the response for better error reporting.
const response = await fetch(`${apiUrl}/incidents/${incident.id}/comment`, { method: "POST", headers: { Authorization: `Bearer ${session?.accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ status: incident.status, comment: comment, }), }); if (response.ok) { toast.success("Comment added!", { position: "top-right" }); setComment(""); mutator(); } else { - toast.error("Failed to add comment", { position: "top-right" }); + const errorData = await response.json().catch(() => ({})); + const errorMessage = errorData.message || "Failed to add comment"; + toast.error(errorMessage, { position: "top-right" }); }keep-ui/app/workflows/dragndrop.tsx (2)
Line range hint
7-7
: Add session validation before upload.The component uses the session token for authorization but doesn't validate if the session exists before attempting the upload. This could lead to failed requests if the session is not available.
Consider adding session validation:
const { data: session } = useSession(); const [error, setError] = useState<string | null>(null); const fileInputRef = useRef<HTMLInputElement | null>(null); const onDrop = async (files: any) => { + if (!session?.accessToken) { + setError("Please sign in to upload files"); + return; + } const formData = new FormData(); formData.append("file", files[0]); try { const response = await fetch(`${apiUrl}/workflows`, {Also applies to: 15-21
Line range hint
22-38
: Enhance error handling with specific error types.The current error handling uses generic messages and doesn't distinguish between different types of failures (e.g., file size limits, format validation, network issues).
Consider enhancing the error handling:
if (response.ok) { setError(null); if (fileInputRef.current) { fileInputRef.current.value = ""; } window.location.reload(); } else { const errorMessage = await response.text(); + // Parse error response for specific error types + let userMessage = "Failed to upload the file"; + try { + const errorData = JSON.parse(errorMessage); + userMessage = errorData.message || userMessage; + } catch { + userMessage = errorMessage; + } - setError(errorMessage); + setError(userMessage); if (fileInputRef.current) { fileInputRef.current.value = ""; } } } catch (error) { - setError("An error occurred during file upload"); + setError("Network error: Please check your connection and try again"); if (fileInputRef.current) { fileInputRef.current.value = ""; } }keep-ui/app/alerts/alert-run-workflow-modal.tsx (1)
Line range hint
52-54
: Consider enhancing error feedback for better debugging.The error toast could be more informative by including the error details from the response.
- toast.error("Failed to start workflow", { position: "top-left" }); + const errorData = await response.json().catch(() => ({})); + toast.error(`Failed to start workflow: ${errorData.message || response.statusText || 'Unknown error'}`, { position: "top-left" });keep-ui/app/workflows/[workflow_id]/executions.tsx (3)
Line range hint
37-47
: Consider optimizing authentication flowThe current implementation has some redundancy in handling unauthenticated states. Consider consolidating the logic to avoid the potential flash of loading screen.
- useEffect(() => { - if (status === "unauthenticated") { - router.push("/signin"); - } - }, [status, router]); - // Render loading state if session is loading - // If the user is unauthenticated, display a loading state until the side effect is processed; after that, it will automatically redirect. - if (status === "loading" || status === "unauthenticated") return <Loading />; + useEffect(() => { + if (status === "unauthenticated") { + router.replace("/signin"); + } + }, [status, router]); + + if (status === "loading") return <Loading />; + if (status === "unauthenticated") return null;
Line range hint
49-59
: Enhance error handling with specific messages and retryConsider improving the error handling by:
- Displaying specific error messages from the API
- Adding a retry mechanism for transient failures
if (error) { return ( <Callout className="mt-4" title="Error" icon={ExclamationCircleIcon} color="rose" + action={<button onClick={() => mutate()}>Retry</button>} > - Failed to load workflow + {error.message || 'Failed to load workflow'} </Callout> ); }
Line range hint
76-92
: Consider additional performance optimizationsTo further improve performance, consider:
- Lazy loading the builder and YAML viewer components
- Using URL-based navigation instead of local state to enable direct linking and better caching
Example implementation:
import dynamic from 'next/dynamic'; const LazyBuilder = dynamic(() => import('./PageClient'), { loading: () => <Loading /> }); const LazyYAMLViewer = dynamic(() => import('./BuilderModalContent'), { loading: () => <Loading /> });keep-ui/app/workflows/manual-run-workflow-modal.tsx (1)
Line range hint
31-31
: Consider adding type safety for session access.The session access could benefit from type safety to ensure the
accessToken
is always available when needed.Consider this improvement:
- const { data: session } = useSession(); + const { data: session } = useSession({ required: true });This ensures the component only renders when a valid session is available, preventing potential undefined access to
session?.accessToken
.Also applies to: 54-54
keep-ui/app/alerts/alert-note-modal.tsx (3)
Line range hint
63-82
: Enhance error handling and API interaction.The current implementation has several areas for improvement:
- No user feedback for success/error states
- Missing loading state during API call
- No type checking for API response
Consider implementing these improvements:
+ const [isLoading, setIsLoading] = useState(false); + const saveNote = async () => { + setIsLoading(true); try { // build the formData const requestData = { enrichments: { note: noteContent, }, fingerprint: alert.fingerprint, }; const response = await fetch(`${apiUrl}/alerts/enrich`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${session?.accessToken}`, }, body: JSON.stringify(requestData), }); + const data = await response.json(); if (response.ok) { - console.log("Note saved successfully"); + toast.success("Note saved successfully"); handleNoteClose(); } else { - console.error("Failed to save note"); + toast.error(`Failed to save note: ${data.message}`); } } catch (error) { - console.error("An unexpected error occurred"); + toast.error("An unexpected error occurred. Please try again."); + } finally { + setIsLoading(false); } };
Line range hint
84-88
: Avoid direct prop mutation.The
handleNoteClose
function directly mutates thealert
prop. This is against React's principles of immutability.Consider using a callback pattern instead:
- const handleNoteClose = () => { - alert.note = noteContent; - setNoteContent(""); - handleClose(); - }; + const handleNoteClose = () => { + handleClose(); + setNoteContent(""); + };The parent component should handle updating the alert's note content through a separate callback prop.
Line range hint
91-117
: Enhance accessibility and user experience.The modal implementation could benefit from improved accessibility features.
Consider these improvements:
<Modal isOpen={isOpen} onClose={handleClose}> + <div role="dialog" aria-label="Add Note"> <ReactQuill value={noteContent} onChange={(value: string) => setNoteContent(value)} theme="snow" placeholder="Add your note here..." modules={modules} formats={formats} + aria-label="Note editor" /> <div className="mt-4 flex justify-end"> <Button onClick={saveNote} color="orange" className="mr-2" + disabled={isLoading || !noteContent.trim()} + aria-busy={isLoading} > - Save + {isLoading ? 'Saving...' : 'Save'} </Button> <Button onClick={handleNoteClose} variant="secondary" color="orange" + disabled={isLoading} > Cancel </Button> </div> + </div> </Modal>keep-ui/utils/hooks/useAlerts.ts (1)
Line range hint
17-121
: Consider additional performance optimizations.While the current implementation is solid, consider these performance enhancements:
- Add SWR cache configuration to persist data across page navigations
- Implement request deduplication for concurrent calls
- Add error boundaries for better error handling
Example SWR configuration:
const globalConfig: SWRConfiguration = { revalidateOnFocus: false, dedupingInterval: 2000, // Dedupe requests within 2s window shouldRetryOnError: false, revalidateOnReconnect: false };keep-ui/app/alerts/ViewAlertModal.tsx (1)
Line range hint
31-63
: Consider adding performance monitoring.Since this change is part of a performance improvement initiative, consider adding performance metrics to validate the improvement:
- Track API request latency
- Monitor client-side rendering time
- Measure time to first API call after component mount
This will help quantify the benefits of using
useHydratedSession
and identify any potential bottlenecks.keep-ui/app/workflows/builder/page.client.tsx (2)
Line range hint
31-31
: Consider adding error handling for session failures.The component uses non-null assertion (
session?.accessToken!
) when passing the access token toBuilderCard
. Consider adding proper error handling:- accessToken={session?.accessToken!} + accessToken={session?.accessToken ?? (() => { + console.error('Session access token is missing'); + return null; + })()}Also consider adding error state handling alongside the loading state:
- if (status === "loading" || status === "unauthenticated") + if (status === "loading") { return ( <div> <Loading /> </div> ); + } + + if (status === "unauthenticated" || !session?.accessToken) { + return ( + <div> + <p>Please sign in to access this page</p> + </div> + ); + }Also applies to: 143-143
Line range hint
33-36
: Fix useEffect dependency array to prevent continuous state reset.The current useEffect implementation will reset
fileContents
andfileName
on every render as it's missing a dependency array. This could lead to unexpected behavior where file data is cleared continuously.useEffect(() => { setFileContents(null); setFileName(""); - }); + }, []); // Add empty dependency array to run only on mountkeep-ui/app/alerts/alert-change-status-modal.tsx (1)
Line range hint
89-139
: Add error handling for session state.The
handleChangeStatus
function should handle cases where the session is invalid or expired. Currently, it only checks for the selected status but not the session state.Consider adding session state validation:
const handleChangeStatus = async () => { if (!selectedStatus) { toast.error("Please select a new status."); return; } + if (!session?.accessToken) { + toast.error("Session expired. Please refresh the page."); + return; + } try { const response = await fetch(keep-ui/app/providers/page.client.tsx (1)
Line range hint
15-91
: Consider memoizing provider transformations for better performance.The provider transformations in the
useEffect
could benefit from memoization to prevent unnecessary re-computations, especially for larger provider lists.Consider applying this optimization:
+ import { useMemo } from 'react'; useEffect(() => { if (data) { - const fetchedInstalledProviders = data.installed_providers.map( - (provider) => ({ - ...provider, - installed: true, - validatedScopes: provider.validatedScopes ?? {}, - }) - ); - - const fetchedProviders = data.providers.map((provider) => ({ - ...defaultProvider, - ...provider, - id: provider.type, - installed: provider.installed ?? false, - })); - - const fetchedLinkedProviders = data.linked_providers?.map((provider) => ({ - ...defaultProvider, - ...provider, - linked: true, - validatedScopes: provider.validatedScopes ?? {}, - })); + const transformedData = useMemo(() => { + return { + installed: data.installed_providers.map((provider) => ({ + ...provider, + installed: true, + validatedScopes: provider.validatedScopes ?? {}, + })), + providers: data.providers.map((provider) => ({ + ...defaultProvider, + ...provider, + id: provider.type, + installed: provider.installed ?? false, + })), + linked: data.linked_providers?.map((provider) => ({ + ...defaultProvider, + ...provider, + linked: true, + validatedScopes: provider.validatedScopes ?? {}, + })) ?? [] + }; + }, [data]); - setInstalledProviders(fetchedInstalledProviders); - setProviders(fetchedProviders); - setLinkedProviders(fetchedLinkedProviders); + setInstalledProviders(transformedData.installed); + setProviders(transformedData.providers); + setLinkedProviders(transformedData.linked); } }, [data]);keep-ui/utils/hooks/useWorkflowRun.ts (2)
Line range hint
134-136
: Remove duplicate state updateThere's a redundant
setIsRunning(false)
call after thefinally
block. This could cause unnecessary re-renders.Apply this fix:
} finally { setIsRunning(false); } - setIsRunning(false);
Line range hint
127-130
: Enhance error handling for better user feedbackCurrently, workflow execution failures are only logged to the console. Consider adding proper error state management and user notifications for a better user experience.
Consider implementing error handling like this:
} else { - console.error("Failed to start workflow"); + const errorData = await response.json(); + throw new Error(`Failed to start workflow: ${errorData.message}`); } } catch (error) { - console.error("An error occurred while starting workflow", error); + setError(error.message); + // Assuming you're using a notification system like toast + showErrorNotification(`Failed to run workflow: ${error.message}`);keep-ui/app/rules/CorrelationSidebar/CorrelationSidebarBody.tsx (2)
10-10
: Consider removing the alias for better code clarity.While using
as useSession
maintains backward compatibility, it might mask the actual implementation being used. Consider updating all references to explicitly useuseHydratedSession
for better code clarity and maintainability.-import { useHydratedSession as useSession } from "@/shared/lib/hooks/useHydratedSession"; +import { useHydratedSession } from "@/shared/lib/hooks/useHydratedSession";
Line range hint
65-89
: Enhance error handling and type safety in form submission.The API call implementation could benefit from:
- Better error handling with specific error messages
- Type-safe response handling
- Loading state management during submission
Consider applying these improvements:
const onCorrelationFormSubmit: SubmitHandler<CorrelationFormType> = async ( correlationFormData ) => { const { name, query, timeUnit, description, groupedAttributes, requireApprove, resolveOn, } = correlationFormData; if (session) { + try { + const requestBody = { + sqlQuery: formatQuery(query, "parameterized_named"), + groupDescription: description, + ruleName: name, + celQuery: formatQuery(query, "cel"), + timeframeInSeconds, + timeUnit: timeUnit, + groupingCriteria: alertsFound.length ? groupedAttributes : [], + requireApprove: requireApprove, + resolveOn: resolveOn, + }; + const response = await fetch( `${apiUrl}/rules${selectedId ? `/${selectedId}` : ""}`, { method: selectedId ? "PUT" : "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${session.accessToken}`, }, - body: JSON.stringify({ - sqlQuery: formatQuery(query, "parameterized_named"), - groupDescription: description, - ruleName: name, - celQuery: formatQuery(query, "cel"), - timeframeInSeconds, - timeUnit: timeUnit, - groupingCriteria: alertsFound.length ? groupedAttributes : [], - requireApprove: requireApprove, - resolveOn: resolveOn, - }), + body: JSON.stringify(requestBody), } ); - if (response.ok) { + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); toggle(); mutate(); router.replace("/rules"); - } + } catch (error) { + console.error('Failed to submit correlation form:', error); + // Handle error appropriately (e.g., show error message to user) + } } };keep-ui/utils/hooks/useIncidents.ts (1)
Line range hint
35-203
: Consider creating a base hook for shared functionalityThe hooks share similar patterns for session handling and API calls. Consider extracting this into a base hook to reduce code duplication and improve maintainability.
Example implementation:
const useAuthenticatedSWR = <T>( urlFactory: (session: Session) => string | null, options?: SWRConfiguration ) => { const apiUrl = useApiUrl(); const { data: session, status: sessionStatus } = useSession(); return { ...useSWR<T>( () => session ? urlFactory(session) : null, (url) => fetcher(apiUrl + url, session?.accessToken), options ), isLoading: !options?.fallbackData && sessionStatus === "loading" }; };keep-ui/app/incidents/[id]/activity/incident-activity.tsx (1)
Line range hint
82-84
: Consider implementing server-side data loading.The TODO comment indicates a potential optimization. Since this PR focuses on performance improvements, implementing server-side data loading could further enhance the application's performance by reducing client-side data fetching.
Would you like help creating an issue to track the server-side data loading implementation?
keep-ui/app/settings/auth/permissions-tab.tsx (1)
Line range hint
55-84
: Consider memoizing resource combinations for better performance.While the hydrated session will help with request performance, the resource combination logic in the useEffect could be optimized further.
Consider this optimization:
+ const memoizedResources = useMemo(() => { if (!presets || !incidents || !permissions) return []; return [ ...(presets?.map((preset) => ({ id: preset.id, name: preset.name, type: "preset", assignments: permissions ?.filter((p) => p.resource_id === preset.id) .flatMap((p) => p.permissions.map((perm) => `${perm.type}_${perm.id}`) ) || [], })) || []), ...(incidents?.items.map((incident) => ({ id: incident.id, name: incident.user_generated_name || incident.ai_generated_name, type: "incident", assignments: permissions ?.filter((p) => p.resource_id === incident.id) .flatMap((p) => p.permissions.map((perm) => `${perm.type}_${perm.id}`) ) || [], })) || []), ]; + }, [presets, incidents, permissions]); useEffect(() => { - if (presets && incidents && permissions) { - const allResources = [/* ... */]; - const resourcesString = JSON.stringify(allResources); - const currentResourcesString = JSON.stringify(resources); - if (resourcesString !== currentResourcesString) { - setResources(allResources); - } setLoading(false); - } + }, [memoizedResources]);keep-ui/utils/hooks/usePusher.ts (1)
Line range hint
7-7
: Consider these improvements to the WebSocket implementation.
The global
PUSHER
variable could cause issues in scenarios like:
- Multiple tenant switches within the same session
- Hot module reloading during development
- Testing environments
The TODO comment about
useMemo
should be addressed. The Pusher initialization logic should indeed be wrapped inuseMemo
to prevent unnecessary recreations.Consider replacing console.log statements with a proper logging utility that can be controlled based on environment.
Here's a suggested refactor for the Pusher initialization:
-let PUSHER: Pusher | null = null; +export const useWebsocket = () => { + const [pusher, setPusher] = useState<Pusher | null>(null); + const apiUrl = useApiUrl(); + const { data: configData } = useConfig(); + const { data: session } = useSession(); + + const channelName = useMemo(() => + session?.tenantId ? `private-${session.tenantId}` : null + , [session?.tenantId]); + + useEffect(() => { + if (!configData || !session || configData.PUSHER_DISABLED || !channelName) { + return; + } + + // Pusher initialization logic here... + const newPusher = new Pusher(/*...*/); + setPusher(newPusher); + + return () => { + newPusher.disconnect(); + }; + }, [configData, session, channelName]);Also applies to: 19-22
keep-ui/app/maintenance/maintenance-rules-table.tsx (1)
Line range hint
115-131
: Consider enhancing the delete operation implementation.While the session token usage is correct, there are several opportunities for improvement:
- Consider using a more user-friendly confirmation dialog instead of the browser's native
confirm
- Add more specific error handling by parsing the error response
- Implement optimistic updates to improve the user experience
Here's a suggested implementation:
- const deleteMaintenanceRule = (maintenanceRuleId: number) => { - if (confirm("Are you sure you want to delete this maintenance rule?")) { - fetch(`${apiUrl}/maintenance/${maintenanceRuleId}`, { - method: "DELETE", - headers: { - Authorization: `Bearer ${session?.accessToken}`, - }, - }).then((response) => { - if (response.ok) { - toast.success("Maintenance rule deleted successfully"); - } else { - toast.error( - "Failed to delete maintenance rule, contact us if this persists" - ); - } - }); - } + const deleteMaintenanceRule = async (maintenanceRuleId: number) => { + try { + const confirmed = await showConfirmDialog({ + title: "Delete Maintenance Rule", + message: "Are you sure you want to delete this maintenance rule?", + confirmText: "Delete", + cancelText: "Cancel", + }); + + if (!confirmed) return; + + // Optimistically update UI + const originalRules = [...maintenanceRules]; + setMaintenanceRules(rules => + rules.filter(rule => rule.id !== maintenanceRuleId) + ); + + const response = await fetch(`${apiUrl}/maintenance/${maintenanceRuleId}`, { + method: "DELETE", + headers: { + Authorization: `Bearer ${session?.accessToken}`, + }, + }); + + if (!response.ok) { + const error = await response.json(); + throw new Error(error.message || "Failed to delete maintenance rule"); + } + + toast.success("Maintenance rule deleted successfully"); + } catch (error) { + // Revert optimistic update + setMaintenanceRules(originalRules); + toast.error(error.message || "Failed to delete maintenance rule"); + } };keep-ui/app/alerts/alert-dismiss-modal.tsx (2)
Line range hint
89-94
: Add error handling for missing session token.The API request uses the session token without validating its presence. Consider adding error handling to gracefully handle cases where the session token is missing.
- return fetch(`${apiUrl}/alerts/enrich`, { + if (!session?.accessToken) { + toast.error('Session expired. Please login again.'); + return Promise.reject(new Error('No session token available')); + } + return fetch(`${apiUrl}/alerts/enrich`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${session.accessToken}`, },
Line range hint
95-103
: Improve error handling in API response.The current implementation clears and closes the modal regardless of API success/failure. Consider providing more specific error feedback and only clearing on success.
const responses = await Promise.all(requests); const responsesOk = responses.every((response) => response.ok); if (responsesOk) { toast.success(`${alerts.length} alerts dismissed successfully!`, { position: "top-right", }); await alertsMutator(); + clearAndClose(); + } else { + const errors = await Promise.all( + responses.filter(r => !r.ok).map(r => r.text()) + ); + toast.error(`Failed to dismiss alerts: ${errors.join(', ')}`); } - } else { - clearAndClose(); - } await presetsMutator();keep-ui/app/workflows/builder/workflow-execution-results.tsx (1)
Line range hint
37-65
: Consider optimizing the refresh interval logic.The current implementation manages the refresh interval state and updates it based on execution status. Consider these improvements:
- Use SWR's built-in condition for refresh interval
- Centralize error handling logic
Here's a suggested refactor:
- const [refreshInterval, setRefreshInterval] = useState(1000); const { data: executionData, error: executionError } = useSWR( status === "authenticated" ? `${apiUrl}/workflows/${workflow_id}/runs/${workflow_execution_id}` : null, async (url) => { const fetchedData = await fetcher(url, session?.accessToken!); if (fetchedData.status === "in_progress") { setChecks((c) => c + 1); } return fetchedData; }, { - refreshInterval: refreshInterval, + refreshInterval: (data) => + data?.status === "in_progress" ? 1000 : 0, + onError: (err) => setError(err.message), } ); - // disable refresh interval when execution is complete - useEffect(() => { - if (!executionData) return; - if (executionData?.status !== "in_progress") { - console.log("Stopping refresh interval"); - setRefreshInterval(0); - } - if (executionData.error) { - setError(executionData?.error); - console.log("Stopping refresh interval"); - setRefreshInterval(0); - } else if (executionData?.status === "success") { - setError(executionData?.error); - setRefreshInterval(0); - } - }, [executionData]);keep-ui/utils/hooks/usePresets.ts (5)
Line range hint
13-26
: Add type safety improvementsThe hook's implementation could benefit from explicit type definitions:
-export const usePresets = (type?: string, useFilters?: boolean) => { +type PresetType = 'dashboard' | 'default'; +export const usePresets = (type?: PresetType, useFilters?: boolean) => {This would prevent potential errors from passing invalid type values.
Line range hint
95-107
: Refactor subscription condition for better maintainabilityThe subscription condition combines multiple checks in a single line. Consider extracting this logic for better readability:
+const shouldEnableSubscription = (config: any, session: any, isReady: boolean) => + config?.PUSHER_DISABLED === false && session && isReady; useSWRSubscription( - () => - configData?.PUSHER_DISABLED === false && session && isLocalStorageReady - ? "presets" - : null, + () => shouldEnableSubscription(configData, session, isLocalStorageReady) + ? "presets" + : null, // ... rest of the implementation
Line range hint
134-146
: Extract repeated filter conditions into constantsThe preset type filters are duplicated across multiple functions. Consider extracting these into constants:
+const STATIC_PRESET_TYPES = ['feed', 'deleted', 'dismissed', 'without-incident', 'groups'] as const; +type StaticPresetType = typeof STATIC_PRESET_TYPES[number]; -![ - "feed", - "deleted", - "dismissed", - "without-incident", - "groups", -].includes(p.name) +!STATIC_PRESET_TYPES.includes(p.name as StaticPresetType)This would improve maintainability and reduce the risk of inconsistencies.
Line range hint
148-181
: Add error handling to mergePresetsWithLocalStorageThe merging function should handle potential errors when accessing preset properties:
const mergePresetsWithLocalStorage = ( serverPresets: Preset[], localPresets: Preset[], setter: (presets: Preset[]) => void ) => { + try { // ... existing implementation setter(combinedPresets); setIsLocalStorageReady(true); + } catch (error) { + console.error('Failed to merge presets:', error); + // Fallback to server presets + setter(serverPresets); + setIsLocalStorageReady(true); + } };
Line range hint
183-219
: Consider memoizing filtered resultsThe filtering operations in
useAllPresets
anduseStaticPresets
could benefit from memoization to prevent unnecessary recalculations:+import { useMemo } from 'react'; const useAllPresets = (options?: SWRConfiguration) => { const { data: presets, error, isValidating, mutate, } = useFetchAllPresets(options); - const filteredPresets = presets?.filter(/* ... */); + const filteredPresets = useMemo( + () => presets?.filter(/* ... */), + [presets] + ); return { data: filteredPresets, error, isValidating, mutate, }; };keep-ui/app/alerts/alert-assign-ticket-modal.tsx (3)
Line range hint
42-42
: Add error handling for missing session token.The component should handle cases where the session or access token is undefined to prevent runtime errors.
Consider adding a check:
const { data: session } = useSession(); + if (!session?.accessToken) { + console.error("No valid session found"); + // Handle the error appropriately (e.g., redirect to login) + return; + } const response = await fetch(`${apiUrl}/alerts/enrich`, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${session.accessToken}`, }, body: JSON.stringify(requestData), });Also applies to: 63-67
Line range hint
56-76
: Enhance error handling and state management.Several improvements could be made to the API integration:
- Direct mutation of the alert object should be avoided
- Loading state should be managed during API calls
- User feedback should be provided for success/error cases
Consider implementing these improvements:
+ const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState<string | null>(null); const onSubmit: SubmitHandler<FormData> = async (data) => { + setIsLoading(true); + setError(null); try { // ... existing request code ... if (response.ok) { - console.log("Ticket assigned successfully"); - alert.ticket_url = data.ticket_url; + // Notify parent component to update alert + onAlertUpdate({ ...alert, ticket_url: data.ticket_url }); handleClose(); } else { - console.error("Failed to assign ticket"); + const errorData = await response.json(); + setError(errorData.message || "Failed to assign ticket"); } } catch (error) { - console.error("An unexpected error occurred"); + setError("An unexpected error occurred"); } finally { + setIsLoading(false); } };
Line range hint
13-21
: Strengthen TypeScript types.The component's type definitions could be improved for better type safety.
Consider these TypeScript improvements:
interface AlertAssignTicketModalProps { handleClose: () => void; ticketingProviders: Providers; alert: AlertDto | null; + // Add callback for alert updates + onAlertUpdate?: (updatedAlert: AlertDto) => void; } interface OptionType { - value: string; + value: string | 'add_provider'; label: string; id: string; - type: string; + type: string | ''; icon?: string; isAddProvider?: boolean; }keep-ui/app/alerts/alert-presets.tsx (1)
Line range hint
89-106
: Add error handling for API calls using session token.The
deletePreset
andaddOrUpdatePreset
functions should handle cases where the session token is undefined or expired.Consider applying this improvement:
async function deletePreset(presetId: string) { if ( confirm( `You are about to delete preset ${presetNameFromApi}, are you sure?` ) ) { + if (!session?.accessToken) { + toast.error('Authentication required'); + return; + } const response = await fetch(`${apiUrl}/preset/${presetId}`, { method: "DELETE", headers: { Authorization: `Bearer ${session?.accessToken}`, }, }); if (response.ok) { toast(`Preset ${presetNameFromApi} deleted!`, { position: "top-left", type: "success", }); presetsMutator(); router.push("/alerts/feed"); + } else { + toast.error('Failed to delete preset'); } } } async function addOrUpdatePreset() { if (presetName) { + if (!session?.accessToken) { + toast.error('Authentication required'); + return; + } // ... rest of the function } }Also applies to: 126-146
keep-ui/app/maintenance/create-or-update-maintenance-rule.tsx (2)
Line range hint
91-106
: Consider implementing request error handling middleware.The API request error handling is duplicated between
addMaintenanceRule
andupdateMaintenanceRule
. This pattern of setting auth headers and handling errors is likely repeated across other components.Consider extracting the common API request logic into a reusable authenticated fetch utility:
// utils/api.ts export const authenticatedFetch = async ( url: string, options: RequestInit, session: Session | null ) => { const response = await fetch(url, { ...options, headers: { Authorization: `Bearer ${session?.accessToken}`, 'Content-Type': 'application/json', ...options.headers, }, }); if (!response.ok) { toast.error('Operation failed, please contact us if this issue persists.'); throw new Error(`HTTP error! status: ${response.status}`); } return response; };This would simplify the maintenance rule operations to:
const addMaintenanceRule = async (e: FormEvent) => { e.preventDefault(); try { await authenticatedFetch( `${apiUrl}/maintenance`, { method: 'POST', body: JSON.stringify({ name: maintenanceName, description, cel_query: celQuery, start_time: startTime, duration_seconds: calculateDurationInSeconds(), enabled, }), }, session ); clearForm(); mutate(); toast.success('Maintenance rule created successfully'); } catch (error) { // Error already handled by authenticatedFetch } };Also applies to: 127-142
Line range hint
168-170
: Consider adding aria-label for accessibility.The text input for maintenance name lacks an aria-label, which could impact accessibility for screen readers.
<TextInput placeholder="Maintenance Name" required={true} + aria-label="Maintenance Name" value={maintenanceName} onValueChange={setMaintenanceName} />
keep-ui/app/ai/ai.tsx (1)
Line range hint
44-57
: Enhance error handling for better user experience.The current error handling could be improved:
- Add specific error messages based on response status
- Reset loading state on error
- Consider adding a retry mechanism for transient failures
const mineIncidents = async (e: FormEvent) => { e.preventDefault(); setAnimate(true); setNewText("Mining πππ ..."); - const response = await fetch(`${apiUrl}/incidents/mine`, { - method: "POST", - headers: { - Authorization: `Bearer ${session?.accessToken}`, - "Content-Type": "application/json", - }, - body: JSON.stringify({}), - }); - if (!response.ok) { + try { + const response = await fetch(`${apiUrl}/incidents/mine`, { + method: "POST", + headers: { + Authorization: `Bearer ${session?.accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify({}), + }); + if (!response.ok) { + const errorData = await response.json().catch(() => ({})); + throw new Error( + errorData.message || `HTTP error! status: ${response.status}` + ); + } + } catch (error) { + setAnimate(false); toast.error( - "Failed to mine incidents, please contact us if this issue persists." + `Failed to mine incidents: ${error.message}. Please try again or contact support if the issue persists.` ); + return; } - setAnimate(false); setNewText("Mine incidents"); };keep-ui/app/dashboard/[id]/dashboard.tsx (2)
83-101
: Consider refactoring widget dimension calculations for better maintainability.The nested ternary expressions make the dimension calculations hard to read and maintain. Consider extracting these into a configuration object or utility function.
Here's a suggested refactor:
+ const WIDGET_DIMENSIONS = { + [WidgetType.GENERICS_METRICS]: { w: 12, h: 20, minH: 15 }, + [WidgetType.METRIC]: { w: 6, h: 8, minH: 7 }, + default: { w: 3, h: 3, minH: 3 } + }; + const newItem: LayoutItem = { i: uniqueId, x: (layout.length % 12) * 2, y: Math.floor(layout.length / 12) * 2, - w: - widgetType === WidgetType.GENERICS_METRICS - ? 12 - : widgetType === WidgetType.METRIC - ? 6 - : 3, - h: - widgetType === WidgetType.GENERICS_METRICS - ? 20 - : widgetType === WidgetType.METRIC - ? 8 - : 3, + ...WIDGET_DIMENSIONS[widgetType] || WIDGET_DIMENSIONS.default, minW: widgetType === WidgetType.GENERICS_METRICS ? 10 : 2, - minH: - widgetType === WidgetType.GENERICS_METRICS - ? 15 - : widgetType === WidgetType.METRIC - ? 7 - : 3, static: false, };
Line range hint
171-175
: Enhance error handling for better user experience.The current error handling could be improved to:
- Show more specific error messages to users
- Handle different types of errors (network, validation, etc.)
- Consider implementing retry logic for transient failures
Here's a suggested improvement:
} catch (error) { - console.error("Error saving dashboard", error); + const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; + console.error("Error saving dashboard:", error); + toast.error(`Failed to save dashboard: ${errorMessage}`); }keep-ui/app/alerts/alert-menu.tsx (1)
Line range hint
89-102
: Verify error handling in API callThe
callAssignEndpoint
function makes an authenticated API call but could benefit from better error handling.Consider enhancing the error handling:
const callAssignEndpoint = async (unassign: boolean = false) => { if ( confirm( "After assigning this alert to yourself, you won't be able to unassign it until someone else assigns it to himself. Are you sure you want to continue?" ) ) { - const res = await fetch( - `${apiUrl}/alerts/${fingerprint}/assign/${alert.lastReceived.toISOString()}`, - { - method: "POST", - headers: { - Authorization: `Bearer ${session!.accessToken}`, - "Content-Type": "application/json", - }, - } - ); - if (res.ok) { - await mutate(); - } + try { + const res = await fetch( + `${apiUrl}/alerts/${fingerprint}/assign/${alert.lastReceived.toISOString()}`, + { + method: "POST", + headers: { + Authorization: `Bearer ${session?.accessToken}`, + "Content-Type": "application/json", + }, + } + ); + if (!res.ok) { + throw new Error(`HTTP error! status: ${res.status}`); + } + await mutate(); + } catch (error) { + console.error('Failed to assign alert:', error); + // Handle error appropriately (e.g., show user feedback) + } } };keep-ui/app/mapping/create-or-edit-mapping.tsx (1)
Line range hint
141-155
: Consider enhancing error handling for API callsWhile the implementation is secure, consider improving error handling for better user experience:
- Handle token expiration scenarios
- Provide more specific error messages based on response status
- Add retry logic for transient failures
Example enhancement:
const response = await fetch(`${apiUrl}/mapping`, { method: "POST", headers: { Authorization: `Bearer ${session?.accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ priority: priority, name: mapName, description: mapDescription, file_name: fileName, type: mappingType, matchers: selectedLookupAttributes.map((attr) => attr.trim()), rows: mappingType === "csv" ? parsedData : null, }), }); -if (response.ok) { +const data = await response.json(); +if (response.status === 401) { + toast.error("Session expired. Please refresh the page to continue."); +} else if (response.status === 403) { + toast.error("You don't have permission to perform this action."); +} else if (response.ok) { clearForm(); mutate(); toast.success("Mapping created successfully"); } else { toast.error( - "Failed to create mapping, please contact us if this issue persists." + data.message || "Failed to create mapping, please contact us if this issue persists." ); }Also applies to: 169-183
keep-ui/app/settings/auth/users-sidebar.tsx (2)
106-108
: Consider adding user feedback for disabled creationWhile the early return is good for control flow, consider showing a toast notification or feedback message when a user attempts to submit while creation is disabled.
if (!userCreationAllowed) { + toast.error("User creation is not allowed in the current configuration"); return; }
Line range hint
106-150
: Consider standardizing error handling patternsThe error handling in the
onSubmit
function could be more consistent. Consider extracting the error handling logic into a reusable utility function that can be shared across components.// utils/errorHandling.ts export const handleApiError = (error: any, setError: Function) => { if (error.response) { const errorData = error.response.data; setError("root.serverError", { type: "manual", message: errorData.detail || errorData.message || "Failed to process request" }); } else { setError("root.serverError", { type: "manual", message: "An unexpected error occurred" }); } };This would simplify the error handling in the component:
} catch (error) { - setError("root.serverError", { - type: "manual", - message: "An unexpected error occurred", - }); + handleApiError(error, setError); }keep-ui/app/deduplication/DeduplicationSidebar.tsx (2)
Line range hint
156-169
: Consider adding session token validationWhile the session token is correctly used for authorization, consider adding validation to handle cases where the session or token might be undefined.
Consider updating the fetch call with this pattern:
- const response = await fetch(url, { - method: method, - headers: { - Authorization: `Bearer ${session?.accessToken}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }); + if (!session?.accessToken) { + throw new Error('No valid session token available'); + } + const response = await fetch(url, { + method: method, + headers: { + Authorization: `Bearer ${session.accessToken}`, + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + });
Line range hint
115-124
: Consider memoizing form reset callbackThe form reset effect could benefit from memoization to prevent unnecessary re-renders.
Consider updating the implementation:
- useEffect(() => { + const resetForm = useCallback(() => { if (isOpen && selectedDeduplicationRule) { reset(selectedDeduplicationRule); } else if (isOpen) { reset({ name: "", description: "", provider_type: "", provider_id: "", fingerprint_fields: [], full_deduplication: false, ignore_fields: [], }); } - }, [isOpen, selectedDeduplicationRule, reset]); + }, [selectedDeduplicationRule, reset]); + useEffect(() => { + if (isOpen) { + resetForm(); + } + }, [isOpen, resetForm]);keep-ui/app/workflows/workflows.client.tsx (3)
Line range hint
93-93
: Replacevar
withlet
for block scoping.Using
let
instead ofvar
ensures proper block scoping and avoids potential issues with variable hoisting.Apply this diff:
-var reload = false; +let reload = false;
Line range hint
89-93
: Rename thefiles
parameter toevent
for clarity.The parameter
files
in theonDrop
function is actually an event object from the file input'sonChange
handler. Renaming it toevent
improves readability and reduces confusion.Apply this diff:
-const onDrop = async (files: any) => { +const onDrop = async (event: any) => {And update references inside the function:
- for (let i = 0; i < files.target.files.length; i++) { - const file = files.target.files[i]; + const selectedFiles = event.target.files; + for (let i = 0; i < selectedFiles.length; i++) { + const file = selectedFiles[i];
Line range hint
185-191
: Refactor to avoid passing synthetic events toonDrop
.In
handleStaticExampleSelect
, a synthetic event object is created to pass the file toonDrop
. This approach can be error-prone and less readable. Consider refactoringonDrop
to accept a list of files directly.
Modify
onDrop
to acceptFileList
:-const onDrop = async (files: any) => { - for (let i = 0; i < files.target.files.length; i++) { - const file = files.target.files[i]; +const onDrop = async (files: FileList) => { + for (let i = 0; i < files.length; i++) { + const file = files[i];Update the
onChange
handler:-onChange={(e) => { - onDrop(e); +onChange={(e) => { + onDrop(e.target.files);Update
handleStaticExampleSelect
to pass the file directly:-const event = { - target: { - files: [file], - }, -}; -onDrop(event as any); +onDrop([file] as unknown as FileList);Note: You may need to adjust the type casting to match
FileList
or modifyonDrop
to accept an array ofFile
objects.keep-ui/app/alerts/alert-create-incident-ai-modal.tsx (2)
4-4
: Consider importinguseHydratedSession
without aliasing for clarityAliasing
useHydratedSession
asuseSession
might lead to confusion with the built-inuseSession
fromnext-auth/react
. Importing and usinguseHydratedSession
directly can improve code readability and make it explicit which hook is being utilized.Apply this diff to update the import statement:
-import { useHydratedSession as useSession } from "@/shared/lib/hooks/useHydratedSession"; +import { useHydratedSession } from "@/shared/lib/hooks/useHydratedSession";
Line range hint
46-46
: Update hook usage to reflect the direct import ofuseHydratedSession
If you decide to import
useHydratedSession
directly without aliasing, ensure that you update its usage in the code to match the import, preventing any reference errors.Apply this diff to update the hook usage:
-const { data: session } = useSession(); +const { data: session } = useHydratedSession();keep-ui/app/workflows/workflow-tile.tsx (4)
3-3
: Consider avoiding aliasing the custom hook asuseSession
Aliasing
useHydratedSession
asuseSession
might cause confusion with the originaluseSession
hook fromnext-auth/react
. It's better to importuseHydratedSession
without aliasing to improve code clarity and avoid potential confusion among developers.Apply this diff to rename the import:
- import { useHydratedSession as useSession } from "@/shared/lib/hooks/useHydratedSession"; + import { useHydratedSession } from "@/shared/lib/hooks/useHydratedSession";And update the usage:
- const { data: session } = useSession(); + const { data: session } = useHydratedSession();
Line range hint
197-199
: Avoid using array index as key in list renderingIn the
ProvidersCarousel
component, when rendering thedisplayedProviders
list, usingkey={index}
can lead to issues if the list changes. It's recommended to use a unique identifier from theprovider
object, such asprovider.id
orprovider.type
, as the key to ensure stable and predictable rendering.Apply this diff to fix the issue:
-{displayedProviders.map((provider, index) => ( - <div key={index} ...> +{displayedProviders.map((provider) => ( + <div key={provider.id || provider.type} ...>
Line range hint
274-284
: Improve error handling inhandleDeleteClick
Currently, when the delete request fails, only an error is logged to the console, and the user is not notified. Consider providing feedback to the user to inform them of the failure.
Apply this diff to improve user feedback:
if (response.ok) { // Workflow deleted successfully window.location.reload(); } else { console.error("Failed to delete workflow"); + alert("Failed to delete the workflow. Please try again."); }
Line range hint
379-425
: Consider movingDynamicIconForTrigger
outside ofWorkflowTile
componentThe
DynamicIconForTrigger
component is defined inside theWorkflowTile
component. Defining components inside other components can lead to performance issues due to re-creation on every render. Consider movingDynamicIconForTrigger
to a separate component or file to improve performance and readability.keep-ui/app/providers/provider-form.tsx (6)
Line range hint
85-87
: Refactor Suggestion: Replace deprecatedsubstr
withslice
indec2hex
The
substr
method is deprecated. To enhance code maintainability and future-proofing, consider usingslice
instead.Suggested Change:
function dec2hex(dec) { - return ("0" + dec.toString(16)).substr(-2); + return ("0" + dec.toString(16)).slice(-2); }
Line range hint
139-160
: Refactor Suggestion: Correct event type inhandleOauth
The event parameter
e
inhandleOauth
is typed asMouseEvent
. In React, it should beReact.MouseEvent<HTMLButtonElement>
for accurate type definitions.Suggested Change:
- async function handleOauth(e: MouseEvent) { + async function handleOauth(e: React.MouseEvent<HTMLButtonElement>) {Ensure that React types are properly imported if not already available.
Line range hint
145-151
: Critical Issue:groupedConfigs
used before declarationThe
groupedConfigs
variable is used inside theuseEffect
hook before it's declared later in the code. This will cause aReferenceError
at runtime.Suggested Fix:
Move the declaration of
groupedConfigs
above its usage in theuseEffect
hook.+ const groupedConfigs = groupConfigsByMainGroup(provider.config); useEffect(() => { // Set initial active tabs for each main group const initialActiveTabsState = {}; Object.keys(groupedConfigs).forEach((mainGroup) => { const subGroups = getSubGroups(groupedConfigs[mainGroup]); if (subGroups.length > 0) { initialActiveTabsState[mainGroup] = subGroups[0]; } }); setActiveTabsState(initialActiveTabsState); }, []);
Line range hint
205-223
: Critical Issue: Inconsistent use offormValues
andupdatedFormValues
invalidateForm
Within the
validateForm
function,formValues
is used instead of the passedupdatedFormValues
. This may result in validation being performed on outdated data.Suggested Fix:
Use
updatedFormValues
consistently within thevalidateForm
function.const validateForm = (updatedFormValues) => { const errors = {}; for (const [configKey, method] of Object.entries(provider.config)) { - if (!formValues[configKey] && method.required) { + if (!updatedFormValues[configKey] && method.required) { errors[configKey] = true; } if ( "validation" in method && - formValues[configKey] && + updatedFormValues[configKey] && !method.validation(updatedFormValues[configKey]) ) { errors[configKey] = true; } - if (!formValues.provider_name) { + if (!updatedFormValues.provider_name) { errors["provider_name"] = true; } } setInputErrors(errors); return errors; };
Line range hint
190-201
: Nitpick: Avoid usingconfirm
for better user experienceUsing the browser's
confirm
function can disrupt user experience. Consider implementing a custom modal dialog to confirm deletion, which allows for better styling and integration with your application's UI.
Line range hint
246-252
: Offer Assistance: Missingdisabled
prop handling inDictInput
componentThe
DictInput
component is being passed adisabled
prop, but it doesn't handle this prop. This could lead to unintended behavior when the provider is provisioned.Suggested Change:
Update the
DictInput
component to accept and handle thedisabled
prop, and pass it to the childTextInput
components.const DictInput = ({ name, value, onChange, error, disabled }) => { // ... return ( <div> {value.map((entry, index) => ( <div key={index} className="flex items-center mb-2"> <TextInput value={entry.key} onChange={(e) => handleEntryChange(index, "key", e.target.value)} placeholder="Key" className="mr-2" + disabled={disabled} /> <TextInput value={entry.value} onChange={(e) => handleEntryChange(index, "value", e.target.value)} placeholder="Value" className="mr-2" + disabled={disabled} /> <Button icon={TrashIcon} variant="secondary" color="orange" size="xs" onClick={() => removeEntry(index)} + disabled={disabled} /> </div> ))} </div> ); };Let me know if you'd like assistance implementing this change.
π Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
π Files selected for processing (73)
keep-ui/app/ai/ai.tsx
(1 hunks)keep-ui/app/alerts/ViewAlertModal.tsx
(1 hunks)keep-ui/app/alerts/alert-assign-ticket-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-associate-incident-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-change-status-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-create-incident-ai-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-dismiss-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-menu.tsx
(1 hunks)keep-ui/app/alerts/alert-note-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-presets.tsx
(1 hunks)keep-ui/app/alerts/alert-push-alert-to-server-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-run-workflow-modal.tsx
(1 hunks)keep-ui/app/alerts/alert-tab-modal.tsx
(2 hunks)keep-ui/app/alerts/alert-tabs.tsx
(1 hunks)keep-ui/app/auth-provider.tsx
(1 hunks)keep-ui/app/dashboard/[id]/dashboard.tsx
(5 hunks)keep-ui/app/deduplication/DeduplicationSidebar.tsx
(1 hunks)keep-ui/app/deduplication/DeduplicationTable.tsx
(1 hunks)keep-ui/app/extraction/create-or-update-extraction-rule.tsx
(1 hunks)keep-ui/app/extraction/extractions-table.tsx
(1 hunks)keep-ui/app/frigade-provider.tsx
(2 hunks)keep-ui/app/incidents/[id]/activity/incident-activity.tsx
(1 hunks)keep-ui/app/incidents/[id]/activity/ui/IncidentActivityComment.tsx
(1 hunks)keep-ui/app/incidents/[id]/alerts/incident-alert-menu.tsx
(1 hunks)keep-ui/app/layout.tsx
(2 hunks)keep-ui/app/maintenance/create-or-update-maintenance-rule.tsx
(1 hunks)keep-ui/app/maintenance/maintenance-rules-table.tsx
(1 hunks)keep-ui/app/mapping/create-or-edit-mapping.tsx
(1 hunks)keep-ui/app/mapping/rules-table.tsx
(1 hunks)keep-ui/app/providers/page.client.tsx
(1 hunks)keep-ui/app/providers/provider-form.tsx
(1 hunks)keep-ui/app/rules/CorrelationSidebar/CorrelationSidebarBody.tsx
(1 hunks)keep-ui/app/rules/CorrelationSidebar/DeleteRule.tsx
(1 hunks)keep-ui/app/settings/auth/permissions-tab.tsx
(1 hunks)keep-ui/app/settings/auth/users-sidebar.tsx
(3 hunks)keep-ui/app/settings/settings.client.tsx
(6 hunks)keep-ui/app/topology/model/useTopology.ts
(1 hunks)keep-ui/app/topology/model/useTopologyApplications.ts
(1 hunks)keep-ui/app/workflows/[workflow_id]/executions.tsx
(1 hunks)keep-ui/app/workflows/builder/page.client.tsx
(1 hunks)keep-ui/app/workflows/builder/workflow-execution-results.tsx
(2 hunks)keep-ui/app/workflows/dragndrop.tsx
(1 hunks)keep-ui/app/workflows/manual-run-workflow-modal.tsx
(1 hunks)keep-ui/app/workflows/workflow-tile.tsx
(1 hunks)keep-ui/app/workflows/workflows.client.tsx
(1 hunks)keep-ui/entities/incidents/model/useIncidentActions.tsx
(1 hunks)keep-ui/shared/lib/hooks/useHydratedSession.tsx
(1 hunks)keep-ui/utils/apiUrl.ts
(1 hunks)keep-ui/utils/hooks/useAI.ts
(1 hunks)keep-ui/utils/hooks/useAlertQuality.ts
(2 hunks)keep-ui/utils/hooks/useAlerts.ts
(1 hunks)keep-ui/utils/hooks/useDashboardMetricWidgets.ts
(2 hunks)keep-ui/utils/hooks/useDashboardPresets.ts
(3 hunks)keep-ui/utils/hooks/useDashboards.ts
(1 hunks)keep-ui/utils/hooks/useDeduplicationRules.ts
(1 hunks)keep-ui/utils/hooks/useExtractionRules.ts
(1 hunks)keep-ui/utils/hooks/useGroups.ts
(1 hunks)keep-ui/utils/hooks/useIncidents.ts
(1 hunks)keep-ui/utils/hooks/useMaintenanceRules.ts
(1 hunks)keep-ui/utils/hooks/useMappingRules.ts
(1 hunks)keep-ui/utils/hooks/usePermissions.ts
(1 hunks)keep-ui/utils/hooks/usePresets.ts
(1 hunks)keep-ui/utils/hooks/useProviders.ts
(1 hunks)keep-ui/utils/hooks/usePusher.ts
(1 hunks)keep-ui/utils/hooks/useRoles.ts
(1 hunks)keep-ui/utils/hooks/useRules.ts
(1 hunks)keep-ui/utils/hooks/useScopes.ts
(1 hunks)keep-ui/utils/hooks/useSearchAlerts.ts
(1 hunks)keep-ui/utils/hooks/useTags.ts
(1 hunks)keep-ui/utils/hooks/useUsers.ts
(1 hunks)keep-ui/utils/hooks/useWorkflowExecutions.ts
(1 hunks)keep-ui/utils/hooks/useWorkflowRun.ts
(1 hunks)keep-ui/utils/hooks/useWorkflows.ts
(1 hunks)
π§° Additional context used
πͺ Biome
keep-ui/app/settings/settings.client.tsx
[error] 122-122: expected >
but instead found <
Remove <
(parse)
[error] 122-123: Expected a JSX attribute but instead found '======='.
Expected a JSX attribute here.
(parse)
[error] 125-125: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 125-125: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 125-125: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 125-125: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 125-125: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 125-125: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 270-271: Expected a JSX attribute but instead found '======='.
Expected a JSX attribute here.
(parse)
[error] 270-271: Expected corresponding JSX closing tag for 'HEAD'.
Opening tag
closing tag
(parse)
[error] 303-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 304-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 304-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 304-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 304-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 304-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 304-304: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 400-400: Expected a type parameter but instead found '<<<<<<'.
Expected a type parameter here.
(parse)
[error] 400-400: expected ,
but instead found HEAD
Remove HEAD
(parse)
[error] 400-401: expected ,
but instead found ===
Remove ===
(parse)
[error] 408-408: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 408-408: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 408-408: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 408-408: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 408-408: Unexpected token. Did you mean {'>'}
or >
?
(parse)
[error] 408-408: Unexpected token. Did you mean {'>'}
or >
?
(parse)
π Additional comments (118)
keep-ui/app/auth-provider.tsx (3)
3-3
: LGTM: Type import addition is appropriate
The Session type import provides proper type safety for the session prop.
14-14
: LGTM: Props type is well-defined
The session prop type is correctly defined with proper nullability handling.
17-21
: Security and cleanup considerations for session hydration
While the implementation works, there are several important considerations:
- Exposing the session on the window object could pose security risks if sensitive data is included
- Consider cleaning up the window object when the component unmounts
- Add validation before storing the session data
Consider this safer implementation:
export const NextAuthProvider = ({ children, session }: Props) => {
- // Hydrate session on mount
if (typeof window !== "undefined" && !!session) {
- window.__NEXT_AUTH_SESSION__ = session;
+ // Only store necessary session data
+ const safeSession = {
+ expires: session.expires,
+ user: {
+ id: session.user?.id,
+ email: session.user?.email,
+ },
+ };
+ window.__NEXT_AUTH_SESSION__ = safeSession;
}
+
+ // Cleanup on unmount
+ React.useEffect(() => {
+ return () => {
+ if (typeof window !== "undefined") {
+ delete window.__NEXT_AUTH_SESSION__;
+ }
+ };
+ }, []);
return <SessionProvider>{children}</SessionProvider>;
};
Let's verify the session usage across the codebase:
keep-ui/utils/hooks/useTags.ts (1)
1-1
: Verify the useHydratedSession implementation
The import change aligns with the PR objective to enhance client-side request performance. However, we should verify that the custom implementation maintains the same interface as the original useSession
.
β Verification successful
Import change is correct and properly implemented
The useHydratedSession
hook maintains full compatibility with the original useSession
interface while adding performance optimizations:
- It wraps the original
useNextAuthSession
from next-auth/react - Returns the same interface with
data
,status
, andupdate
- Adds hydration optimization for first render
- Is consistently used across the entire codebase (60+ files) with proper aliasing
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession matches useSession interface
# Check the implementation of useHydratedSession
echo "Checking useHydratedSession implementation..."
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for any other usages to ensure consistent migration
echo "Checking remaining useSession imports..."
rg "import.*useSession.*from 'next-auth/react'" --type ts
Length of output: 2034
Script:
#!/bin/bash
# Let's verify the complete interface by checking the imports and usage in useTags.ts
# Check the complete implementation of useTags to understand session usage
echo "Checking useTags implementation..."
ast-grep --pattern 'export function useTags() {
$$$
}'
# Check imports in useHydratedSession to verify next-auth session usage
echo "Checking useHydratedSession imports..."
rg "import.*from 'next-auth/react'" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check the type definitions to ensure interface compatibility
echo "Checking type definitions..."
rg "type|interface" -A 3 keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 610
Script:
#!/bin/bash
# Let's check both files more comprehensively
# Check the complete useHydratedSession file content
echo "Checking complete useHydratedSession implementation..."
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check the complete useTags file content
echo "Checking complete useTags implementation..."
cat keep-ui/utils/hooks/useTags.ts
# Check for any other files using useHydratedSession
echo "Checking other useHydratedSession usages..."
rg "useHydratedSession" --type ts
Length of output: 11046
keep-ui/utils/hooks/useRoles.ts (1)
2-2
: LGTM! Verify the session hook interface.
The change aligns with the PR objective of using useHydratedSession
. Using the alias maintains backward compatibility.
Let's verify that useHydratedSession
provides the same interface as the original useSession
:
β Verification successful
Based on the shell script results, I can now verify the interface compatibility. The implementation of useHydratedSession
shows that it:
- Returns the same session object from
useNextAuthSession
- Adds hydration state handling
- Returns an object with the same interface:
data
property (from window.NEXT_AUTH_SESSION or session)status
property ("authenticated" or from session)update
method (from session)
Let's verify the usage in useRoles:
Interface compatibility verified - safe to use useHydratedSession
The hook only uses data
property from the session object to check its existence and the interface is fully compatible as useHydratedSession
provides the same session shape with data
, status
, and update
properties.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the interface of useHydratedSession matches useSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check all properties accessed on the session object
rg -A 2 'session\.'
Length of output: 95275
Script:
#!/bin/bash
# Check how session is used in useRoles
rg -A 3 'useSession' keep-ui/utils/hooks/useRoles.ts
Length of output: 401
keep-ui/utils/hooks/useUsers.ts (1)
2-2
: LGTM! Verify hook interface compatibility.
The change aligns with the PR objective of using hydrated sessions for better performance.
Let's verify that useHydratedSession
maintains the same interface as the original useSession
:
β Verification successful
Let me gather more information about the useHydratedSession
implementation to verify its interface compatibility.
Let me check the complete implementation of useHydratedSession as the previous output was truncated.
Interface compatibility verified - safe to use useHydratedSession
The useHydratedSession
hook maintains complete interface compatibility with the original useSession
from next-auth:
- Returns the same session object structure with
data
,status
, andupdate
- Adds hydration handling for better client-side performance
- Falls back to the original session behavior when hydrated session is not available
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the interface compatibility between useSession and useHydratedSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export $_ useHydratedSession() {
$$$
}'
# Check other usages of useHydratedSession to confirm consistent interface
rg -A 3 "useHydratedSession"
Length of output: 27438
Script:
#!/bin/bash
# Check the implementation of useHydratedSession
rg -A 10 "export function useHydratedSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check the original useSession interface
rg -A 10 "useSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 761
Script:
#!/bin/bash
# Get the complete implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 794
keep-ui/utils/hooks/useGroups.ts (2)
Line range hint 8-17
: LGTM: Implementation remains robust
The hook implementation correctly:
- Uses SWR's immutable fetching strategy
- Maintains proper session-based authentication
- Handles null cases when session isn't available
2-2
: Verify useHydratedSession interface compatibility
The change aligns with the PR objective to enhance client-side request performance. However, we should verify that useHydratedSession
maintains the same interface as the original useSession
.
β Verification successful
Import change is safe and maintains interface compatibility
The useHydratedSession
hook is a drop-in replacement that wraps next-auth's useSession
and maintains the exact same interface. It returns the same session object with data
, status
, and update
properties, while adding client-side hydration optimization. The useGroups
hook correctly uses the session data and accessToken in the same way as before.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify that useHydratedSession maintains the same interface as next-auth's useSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export $_ useHydratedSession() {
$$$
}'
# Check for any other usages to verify consistent implementation
rg -l "useHydratedSession"
Length of output: 3127
Script:
#!/bin/bash
# Let's check the implementation of useHydratedSession and its interface
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Let's also check one of the consuming hooks to understand usage pattern
cat keep-ui/utils/hooks/useGroups.ts
Length of output: 1430
keep-ui/utils/hooks/useMappingRules.ts (2)
2-2
: LGTM! Clean import replacement with proper aliasing.
The change maintains API compatibility while switching to the hydrated session implementation.
Let's verify the consistency of the hydrated session implementation:
β Verification successful
Let me generate additional scripts to verify the session behavior consistency:
This will help us understand the implementation details of the hydrated session hook and how it's being used in the codebase.
Based on the implementation details revealed by the scripts, I can now provide the final response:
β Import change is safe and maintains session behavior
The useHydratedSession
hook is a proper wrapper around useNextAuthSession
that:
- Maintains the same API interface through consistent return types
- Adds hydration optimization by using
window.__NEXT_AUTH_SESSION__
on first render - Falls back to original session behavior when hydrated
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the hydrated session implementation matches the original behavior
# Expected: The new implementation should maintain similar structure and exports
# Check the implementation of useHydratedSession
rg -A 10 "export.*useHydratedSession"
# Verify all other files have been migrated consistently
rg "from 'next-auth/react'"
rg "from \"next-auth/react\""
Length of output: 37956
Script:
#!/bin/bash
# Check the implementation of useHydratedSession hook
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check how the session is used in the mapping rules
ast-grep --pattern 'const { data: session } = useSession();
$$$'
Length of output: 1845
Line range hint 11-24
: Verify session hydration timing for data fetching.
The hook's functionality depends on proper session hydration for both URL construction and authentication. Ensure the hydrated session is available when needed.
Let's check the implementation details and usage patterns:
β Verification successful
Let me gather more information about the session hydration implementation to verify its timing and impact.
Let me check how the useMappingRules hook handles the session state and loading conditions.
Session hydration is properly handled for data fetching
The implementation is correct and safe because:
- The hook uses
useHydratedSession
which handles initial hydration state - SWR's data fetching is properly gated by the session presence in the key function
- The access token is correctly passed to the fetcher only when available
- The hook follows the same pattern used across other data fetching hooks in the codebase
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Analyze the session hydration implementation and usage patterns
# Expected: Consistent hydration handling across components
# Check how other SWR hooks handle the hydrated session
rg -l "useSWR.*session" | xargs rg -A 5 "useHydratedSession"
# Look for any conditional rendering or loading states related to session
ast-grep --pattern 'if ($session) { $$$ }'
Length of output: 37956
Script:
#!/bin/bash
# Check the implementation of useHydratedSession hook
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Look for any loading states or conditional rendering related to session
rg -A 3 "useHydratedSession.*session" keep-ui/utils/hooks/useMappingRules.ts
Length of output: 873
Script:
#!/bin/bash
# Check the implementation of useMappingRules hook
cat keep-ui/utils/hooks/useMappingRules.ts
# Look for any SWR configurations or loading states in the component
rg -A 5 "useSWR.*session" keep-ui/utils/hooks/useMappingRules.ts
Length of output: 708
keep-ui/utils/hooks/useWorkflows.ts (2)
2-2
: LGTM: Import change aligns with performance objectives
The switch to useHydratedSession
with aliasing maintains compatibility while implementing the performance improvements targeted in issue #2406.
Line range hint 8-16
: Verify session hydration timing for workflow fetching
Since this hook depends on session availability for fetching workflows, we should verify that the hydrated session is available when needed.
β Verification successful
Let me gather more information about how the useSession
hook is being used in the codebase, particularly in relation to workflow fetching.
Based on the analysis of the codebase, I can now provide a final response regarding the session hydration timing for workflow fetching.
Session hydration is properly handled for workflow fetching
The implementation is safe because:
- The
useWorkflows
hook usesuseHydratedSession
instead of the basicuseSession
, which ensures proper hydration handling - The
useHydratedSession
hook includes proper hydration checks and returns the session only when it's ready - The workflow fetching is conditionally executed only when the session is available through the SWR key function:
() => (session ? ${apiUrl}/workflows : null)
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check the implementation of useHydratedSession and its hydration timing
# to ensure workflows are fetched at the right moment
# Check useHydratedSession implementation
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Look for any hydration-related error handling
rg -A 5 'hydrat(e|ion|ed)' --type ts
Length of output: 3688
Script:
#!/bin/bash
# Check where useSession is imported from and how it's used with workflows
rg -A 3 "useSession" --type ts
# Check for any workflow-related components that might use this hook
rg -A 5 "useWorkflows" --type ts
# Check for any error boundaries or loading states around workflow fetching
ast-grep --pattern 'if ($session.status === "loading") {
$$$
}'
Length of output: 56491
keep-ui/utils/hooks/useScopes.ts (2)
2-2
: LGTM! Verify session interface compatibility.
The import change aligns with the PR objective of using hydrated sessions for better performance. The aliasing maintains API compatibility, minimizing the impact on the existing code.
Let's verify that the new useHydratedSession
hook provides the same interface:
β Verification successful
Let me gather more information about the useHydratedSession
hook implementation to verify interface compatibility.
Based on the gathered information, I can now provide the final response:
Interface compatibility verified β
The useHydratedSession
hook maintains complete interface compatibility with the original useSession
:
- It returns the same session object structure with
accessToken
property - Preserves the session status and update functionality
- Adds hydration optimization without breaking the API contract
The widespread usage of session?.accessToken
across the codebase continues to work as expected with the new implementation.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify session interface compatibility between useSession and useHydratedSession
# Check the interface of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for session.accessToken usage patterns
rg -A 2 'session\?\.accessToken'
Length of output: 24909
Script:
#!/bin/bash
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for any type definitions related to session
rg -A 5 'type.*Session'
# Check the original useSession implementation
ast-grep --pattern 'export function useSession() {
$$$
}'
Length of output: 2923
Line range hint 11-17
: Verify hydration behavior with SWR cache.
Since we're switching to a hydrated session, we should ensure this change positively impacts the SWR caching behavior and doesn't cause unnecessary revalidations.
β Verification successful
Let me gather more information about the SWR caching behavior.
Based on the analysis of the codebase, I can now provide a definitive response about the SWR caching behavior with the hydrated session.
The hydration change positively impacts SWR caching behavior.
The useScopes
hook uses useSWRImmutable
which is specifically designed for data that doesn't change frequently and should be cached permanently. The implementation:
- Correctly uses
useSWRImmutable
to prevent unnecessary revalidations - Properly handles session dependency in the key generation:
() => (session ? ${apiUrl}/auth/permissions/scopes : null)
- Maintains consistent caching behavior with other similar hooks in the codebase that use hydrated sessions
The hydrated session ensures stable cache keys and prevents unnecessary revalidations while maintaining data consistency.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for potential SWR configuration or revalidation patterns
# Look for SWR cache configuration patterns
rg -A 5 'useSWRImmutable.*revalidate'
# Check for other uses of useHydratedSession with SWR
rg -A 5 'useHydratedSession.*useSWR'
Length of output: 24909
Script:
#!/bin/bash
# Check for SWR configuration and cache patterns
# Look for useSWRImmutable usage and configuration
rg -A 5 'useSWRImmutable.*options'
# Look for SWR cache configuration
rg -A 5 'SWRConfig|swrConfig'
# Look for revalidation patterns
rg -A 5 'revalidate|mutate'
Length of output: 116048
keep-ui/utils/hooks/useExtractionRules.ts (2)
2-2
: LGTM! Verify interface compatibility.
The import change aligns with the PR objectives to enhance performance. The alias maintains backward compatibility, reducing the risk of introducing bugs.
Let's verify that useHydratedSession
maintains the same interface as the original useSession
:
β Verification successful
Let me gather more specific information about the interface compatibility.
Interface compatibility verified - safe to use
The useHydratedSession
hook maintains full interface compatibility with the original useSession
:
- Returns the same session object structure with
data
,status
, andupdate
- Adds hydration optimization without breaking the API
- Properly handles the loading state and session updates
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the interface compatibility of useHydratedSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for any additional exports that might affect usage
rg -A 5 "export.*useHydratedSession"
Length of output: 12710
Script:
#!/bin/bash
# Check the implementation and interface of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check the original useSession import and usage
rg -A 5 "from 'next-auth/react'" --type ts
Length of output: 1827
Line range hint 2-24
: Verify performance improvement with useHydratedSession.
Since this change is part of a performance improvement initiative, let's ensure the new implementation enhances client-side request handling.
β Verification successful
Let me gather more information about the implementation of useHydratedSession to verify its performance benefits.
Performance improvement with useHydratedSession is verified and beneficial
The implementation shows clear performance benefits by:
- Avoiding hydration mismatches by tracking hydration state
- Providing immediate access to session data on first render through
window.__NEXT_AUTH_SESSION__
- Preventing unnecessary re-renders by returning cached session data during loading states
This change aligns with performance best practices for Next.js applications by optimizing client-side session handling and reducing hydration issues.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Analyze the implementation details of useHydratedSession to verify performance benefits
# Check for any caching or hydration logic
rg -A 10 "hydrat(e|ion)" --type ts
# Look for related performance tests
fd -e test.ts -e spec.ts -e test.tsx -e spec.tsx | xargs rg "useHydratedSession"
Length of output: 12710
Script:
#!/bin/bash
# Get the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for any performance-related comments or documentation
rg -B 2 -A 2 "useHydratedSession" --type ts --type tsx | grep -v "^import"
Length of output: 1879
keep-ui/utils/hooks/usePermissions.ts (2)
Line range hint 11-17
: Verify security implications of using hydrated session.
Since this hook handles permissions and uses access tokens, please ensure that:
- The hydrated session maintains secure token handling
- Token validation and refresh mechanisms work as expected
- The session hydration doesn't expose sensitive data client-side
Let's verify the security aspects:
2-2
: LGTM! Verify the hydrated session hook implementation.
The change aligns with the PR objective of improving performance through hydrated sessions. The aliasing maintains API compatibility, minimizing the impact on the existing code.
Let's verify the implementation and type compatibility:
β Verification successful
The first script didn't find the file, but the rg
results showed its actual location. Let's examine the implementation and compare it with the usage pattern to verify type compatibility and proper implementation.
Import change is correct and implementation is properly verified
The useHydratedSession
hook is a well-implemented wrapper around next-auth's useSession
that maintains full type compatibility while adding hydration optimization. It correctly:
- Returns the same interface as next-auth's
useSession
- Provides hydrated session data on first render
- Falls back to regular session behavior after hydration
The change in usePermissions.ts
is safe as evidenced by:
- Consistent usage pattern across 60+ files in the codebase
- Identical session data structure usage (
session?.accessToken
) - Proper type preservation through the aliased import
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the useHydratedSession hook implementation and its type compatibility with next-auth's useSession
# Check if the implementation file exists
fd "useHydratedSession.ts" "shared/lib/hooks"
# Check the hook's type definition
ast-grep --pattern 'export function useHydratedSession(): $return_type { $$$'
# Check for any other usages to ensure consistent adoption
rg -l "useHydratedSession"
Length of output: 3408
Script:
#!/bin/bash
# Let's examine the implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Let's also check its usage pattern in a few files
head -n 20 keep-ui/utils/hooks/usePermissions.ts
head -n 20 keep-ui/utils/hooks/useAlerts.ts
Length of output: 2141
keep-ui/utils/hooks/useMaintenanceRules.ts (1)
2-2
: LGTM! Verify the session hook interface.
The change aligns with the PR objectives to improve client-side request performance.
Let's verify that useHydratedSession
maintains the same interface as the original useSession
:
β Verification successful
Let me gather more information about the session hooks to verify their interface compatibility.
Interface compatibility verified - safe to use
The useHydratedSession
hook maintains full compatibility with the original useSession
:
- Returns the same session object shape with
data
,status
, andupdate
- Preserves all required session properties (
accessToken
,user
,tenantId
,userRole
) - Adds client-side hydration optimization without breaking the interface
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the interface compatibility of useHydratedSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export $_ useHydratedSession() {
$$$
}'
# Check for any type definitions
rg -A 5 "type.*Session"
Length of output: 1148
Script:
#!/bin/bash
# Search for useHydratedSession implementation and its imports
rg -g '!*.test.*' -g '!*.spec.*' -A 10 "export.*useHydratedSession"
# Search for original useSession usage patterns
rg -g '!*.test.*' -g '!*.spec.*' "useSession.*=.*useSession"
# Look for session-related type definitions
fd -e ts -e tsx --exec grep -l "Session.*{" {} \; | xargs cat
Length of output: 4906
keep-ui/utils/hooks/useProviders.ts (2)
Line range hint 11-20
: Verify session hydration behavior
Since we're switching to a hydrated session implementation, we should ensure proper hydration timing and data availability for the provider fetching.
Let's check the implementation details:
1-1
: LGTM! Verify integration with useHydratedSession
The import change aligns with the PR objective of replacing useSession
with useHydratedSession
. The aliasing maintains API compatibility.
Let's verify the integration across the codebase:
β Verification successful
The implementation of useHydratedSession
shows it's a proper wrapper around useNextAuthSession
that handles hydration correctly and maintains API compatibility. It returns the same shape of data as the original useSession
hook, making it a safe replacement. Let me verify one final aspect - the usage pattern in the providers hook:
Import change is safe and correctly integrated
The verification confirms that:
useHydratedSession
maintains the same API shape as the originaluseSession
useProviders
uses the standard destructuring patternconst { data: session }
which is compatible- The session data is correctly used for both the URL condition and token passing
- The hydration wrapper properly handles the loading state and session data
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent session hook usage and implementation
# Check if there are any remaining direct useSession imports from next-auth
echo "Checking for remaining next-auth/react useSession imports..."
rg "import.*useSession.*from ['\"]next-auth/react['\"]"
# Verify the implementation of useHydratedSession
echo "Checking useHydratedSession implementation..."
rg -A 10 "export.*useHydratedSession"
Length of output: 2110
Script:
#!/bin/bash
# Check how useProviders uses the session data
echo "Checking useProviders implementation..."
rg -A 10 "export.*useProviders" keep-ui/utils/hooks/useProviders.ts
# Verify if the session usage pattern matches
echo "Checking session usage pattern..."
ast-grep --pattern 'const { data: session } = useSession()' keep-ui/utils/hooks/useProviders.ts
Length of output: 746
keep-ui/app/frigade-provider.tsx (2)
4-4
: Verify the implementation of useHydratedSession
The change aligns with the PR objectives to improve client-side request performance. Let's verify the implementation of the custom hook.
β Verification successful
Custom hook implementation verified and looks correct
The useHydratedSession
hook is properly implemented with the following key aspects:
- Wraps next-auth's
useSession
with hydration handling - Uses window.NEXT_AUTH_SESSION for initial render optimization
- Maintains the same interface as original useSession
- Properly handles client-side hydration state
The implementation aligns with the PR's performance optimization goals by avoiding hydration mismatches and providing cached session data on first render.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession hook
# Expected: Hook should handle session hydration properly
# Check the hook implementation
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for any direct useSession usage that might have been missed
rg "useSession.*next-auth/react"
Length of output: 1807
Script:
#!/bin/bash
# Let's check the implementation of useHydratedSession in the shared hooks directory
fd "useHydratedSession.ts" --type f
# Check the actual implementation if found
rg -A 10 "export.*useHydratedSession"
# Check for any remaining direct useSession imports
rg "import.*useSession.*next-auth/react"
Length of output: 1280
Script:
#!/bin/bash
# Let's see the complete implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check where else this hook is being used
rg "useHydratedSession" --type ts --type tsx
Length of output: 867
17-17
: π οΈ Refactor suggestion
Consider strengthening the user identifier logic
The current implementation falls back to using potentially non-unique identifiers (email or name). Consider using a more reliable unique identifier like session?.user.id
if available, or implement a composite key approach.
- : (session?.user.email ?? session?.user.name)
+ : (session?.user.id ?? session?.user.email)
keep-ui/shared/lib/hooks/useHydratedSession.tsx (1)
20-31
: Verify SSR behavior and hydration strategy.
The current implementation might cause hydration mismatches between server and client renders. We should verify this behavior across different scenarios.
β Verification successful
The hydration strategy is correctly implemented
The implementation is safe and follows Next.js best practices for handling hydration:
- The hook properly handles the initial SSR render by checking for
window.__NEXT_AUTH_SESSION__
- It uses a hydration state flag to track client-side hydration completion
- The hook is widely used across the application in a consistent manner
- The only pages with
getServerSideProps
(signin.tsx
and_error.jsx
) are not using this hook - The hook correctly falls back to the NextAuth session after hydration is complete
The current implementation prevents hydration mismatches by:
- Using
typeof window !== "undefined"
check for SSR safety - Providing consistent session data during the initial render
- Properly transitioning to the client-side session after hydration
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for potential SSR-related issues in components using this hook
# Look for components using useHydratedSession in pages directory
echo "Checking for usage in pages..."
rg -l "useHydratedSession" --type tsx
# Look for getServerSideProps usage alongside this hook
echo "\nChecking for getServerSideProps usage..."
ast-grep --pattern 'export const getServerSideProps = async ($$$) => { $$$ }'
# Look for potential hydration warnings in components
echo "\nChecking for hydration-related comments..."
rg -i "hydration|mismatch|warning" --type tsx
Length of output: 486
Script:
#!/bin/bash
# Let's try a different approach without relying on file type filters
# Look for components using useHydratedSession
echo "Checking for usage of useHydratedSession..."
rg -l "useHydratedSession"
# Look for getServerSideProps usage
echo "\nChecking for getServerSideProps usage..."
rg -A 5 "export (async )?function getServerSideProps|export const getServerSideProps"
# Look for hydration-related comments and warnings
echo "\nChecking for hydration-related patterns..."
rg -i "hydration|mismatch|warning"
# Check the implementation details of useHydratedSession
echo "\nChecking useHydratedSession implementation..."
rg -A 10 "export (function|const) useHydratedSession"
Length of output: 168722
Script:
#!/bin/bash
# Let's check the actual usage patterns and implementation details
# Look for the actual usage of useHydratedSession in components
echo "Checking component usage patterns..."
rg -A 5 "useHydratedSession\("
# Check for any hydration-related comments or error handling
echo "\nChecking for hydration error handling..."
rg -B 2 -A 2 "hydration|mismatch" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Look for NextAuth session usage
echo "\nChecking NextAuth session implementation..."
rg "__NEXT_AUTH_SESSION__" keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 1046
Script:
#!/bin/bash
# Let's check how this hook is being used in the application
# Look for imports and actual usage in components
echo "Checking component implementations..."
rg -B 2 -A 5 "import.*useHydratedSession|const.*=.*useHydratedSession\(\)" --type tsx
# Check for any SSR-specific code or getServerSideProps
echo "\nChecking for SSR implementations..."
rg -l "getServerSideProps|getInitialProps" $(rg -l "useHydratedSession" --type tsx)
# Look for any hydration-related error boundaries or error handling
echo "\nChecking for error handling..."
rg "ErrorBoundary|componentDidCatch|error\s*=|catch\s*\(|try\s*{" $(rg -l "useHydratedSession" --type tsx)
Length of output: 841
Script:
#!/bin/bash
# Let's try with simpler commands without file type filters
# Check component implementations
echo "Checking component implementations..."
rg -B 2 -A 5 "import.*useHydratedSession|const.*=.*useHydratedSession"
# Check for SSR implementations
echo "\nChecking for SSR implementations..."
rg -l "getServerSideProps|getInitialProps" keep-ui/
# Check for error handling around the hook usage
echo "\nChecking for error handling..."
rg "try|catch|error" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check the complete implementation
echo "\nChecking complete hook implementation..."
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 48608
keep-ui/utils/apiUrl.ts (1)
Line range hint 1-1
: Verify server-side API URL generation with hydrated sessions
Since this is a server-only utility and the PR aims to unblock client-side requests using hydrated sessions, we should verify that this implementation aligns with the new session handling approach.
Let's check for any client-side imports or usage of this utility:
β Verification successful
Let me analyze the usage of getApiURL()
further to understand the context better:
Server-side API URL generation is correctly implemented and used
The verification shows that getApiURL()
is only used in server-side contexts:
- Server components (
.tsx
files without 'use client' directive) - API routes (
pages/api/
) - Middleware
- Server-side configuration (
getConfig.ts
)
The utility correctly handles both production and preview environments on Vercel, and the "server only!" comment is accurate as it relies on environment variables only available server-side. The implementation aligns with the new session handling approach as it's not exposed to client components.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for potential client-side usage of getApiURL
# Look for imports of apiUrl.ts
rg -l "apiUrl" --type ts
# Look for usage of getApiURL function
ast-grep --pattern 'getApiURL()'
Length of output: 4686
Script:
#!/bin/bash
# Check the content of files using getApiURL() to understand the context
rg -A 5 "getApiURL\(\)" --type ts
# Check if there are any client components using this
rg "'use client'" -A 10 -l keep-ui/app/incidents/page.tsx keep-ui/app/workflows/builder/\[workflowId\]/page.tsx keep-ui/app/providers/oauth2/\[providerType\]/page.tsx keep-ui/app/topology/page.tsx
# Check the actual apiUrl.ts file content
cat keep-ui/utils/apiUrl.ts
Length of output: 5448
keep-ui/utils/hooks/useDeduplicationRules.ts (2)
Line range hint 8-24
: Verify session behavior consistency
The hooks correctly handle session state for API requests. However, we should verify that useHydratedSession
provides the same session structure as the original useSession
to ensure session?.accessToken
remains valid.
β Verification successful
Based on the shell script results, I can now generate the final response:
Session structure is consistent across the codebase
The verification shows that:
- The
Session
interface is properly defined inkeep-ui/types/next-auth.d.ts
withaccessToken
as an optional string property - All usages of
session?.accessToken
across the codebase follow the same optional chaining pattern, indicating consistent handling - The session structure is used uniformly in API requests, authentication headers, and data fetching hooks
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify session structure usage across the codebase
# Check all usages of session.accessToken to ensure consistency
echo "Checking session.accessToken usage patterns:"
rg -B 2 -A 2 "session\?\.accessToken"
# Check for any type definitions or interfaces for the session
echo "Checking session type definitions:"
fd -e ts -e tsx | xargs ast-grep --pattern 'interface Session {
$$$
}'
Length of output: 41350
2-2
: Verify the implementation of useHydratedSession
The change aligns with the PR objectives to improve client-side request performance. Let's verify the implementation of the new hook.
β Verification successful
The verification results show that useHydratedSession
is a wrapper around next-auth/react
's useSession
that adds hydration state tracking. Let's verify how it's being used in the codebase to ensure consistent behavior.
Import change is safe and implementation is verified
The verification shows that useHydratedSession
is a well-implemented wrapper around next-auth's useSession
that:
- Maintains API compatibility by returning the same session object structure
- Adds client-side hydration optimization using
window.__NEXT_AUTH_SESSION__
- Is consistently used across the codebase with the same alias pattern
- Properly handles loading states and SSR scenarios
The import change in useDeduplicationRules.ts
follows the established pattern seen in 40+ other files, making it a safe and consistent modification.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession and its differences from next-auth's useSession
# Check the implementation of useHydratedSession
echo "Checking useHydratedSession implementation:"
rg -A 10 "export.*useHydratedSession"
# Check if there are any other files still using the original useSession
echo "Checking for remaining next-auth/react useSession usage:"
rg "from 'next-auth/react'"
rg 'from "next-auth/react"'
Length of output: 2028
Script:
#!/bin/bash
# Check usage patterns of useHydratedSession
echo "Checking useHydratedSession usage patterns:"
rg -A 5 "useHydratedSession"
# Check the complete implementation of useHydratedSession
echo "Full implementation of useHydratedSession:"
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 38866
keep-ui/utils/hooks/useRules.ts (2)
Line range hint 28-29
: Verify session usage pattern with hydrated session.
The session destructuring pattern remains unchanged. Let's verify this matches the expected usage pattern of the hydrated session implementation.
β Verification successful
Based on the search results, I can now provide a definitive response about the session usage pattern:
Session usage pattern is consistent with the hydrated session implementation.
The codebase shows a consistent pattern where:
- All components import
useHydratedSession
from@/shared/lib/hooks/useHydratedSession
- The session is destructured uniformly as
const { data: session } = useSession()
- The
useSession
is aliased touseHydratedSession
in imports
The implementation in useRules.ts
follows this exact pattern, matching the established hydrated session usage across the entire codebase.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent session usage pattern across components
# Search for similar session destructuring patterns
ast-grep --pattern 'const { $_ : session } = useHydratedSession()'
# Check for any different usage patterns that might indicate inconsistency
ast-grep --pattern 'useHydratedSession().data'
Length of output: 211
Script:
#!/bin/bash
# Search for session usage patterns across the codebase
rg "useSession" -A 2 -B 2
# Search for any hydrated session patterns
rg "useHydratedSession" -A 2 -B 2
# Look for session-related hooks or utilities
fd "session" --type f
Length of output: 94551
1-1
: Verify the custom hook implementation.
The import change aligns with the PR objective of replacing useSession
with useHydratedSession
. However, let's verify the custom hook implementation.
β Verification successful
Import change is correct and implementation is verified
The useHydratedSession
hook is properly implemented in keep-ui/shared/lib/hooks/useHydratedSession.tsx
. It wraps Next.js's useSession
with hydration support, maintaining the same interface while adding client-side performance optimizations. The hook is consistently imported and aliased as useSession
across multiple files in the codebase, making this a safe and verified change.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the custom hook implementation and its exports
# Check if the custom hook file exists and exports useHydratedSession
fd "useHydratedSession.ts" --exec cat {} \; | grep -A 5 "export.*useHydratedSession"
# Verify consistent usage pattern across the codebase
ast-grep --pattern 'import { useHydratedSession $_ } from "@/shared/lib/hooks/useHydratedSession"'
Length of output: 211
Script:
#!/bin/bash
# Let's try a different approach to verify the hook implementation
# Check if the file exists in the shared lib hooks directory
fd "useHydratedSession.ts" -p "shared/lib/hooks"
# If file exists, let's see its content
fd "useHydratedSession.ts" -p "shared/lib/hooks" --exec cat {}
# Let's also check for any references to this hook in the codebase
rg "useHydratedSession" --type ts
Length of output: 9637
Script:
#!/bin/bash
# Let's check the implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Let's also check its usage pattern in a few files to verify consistency
rg -A 3 "useHydratedSession as useSession" keep-ui/utils/hooks/useRules.ts
Length of output: 1091
keep-ui/utils/hooks/useAI.ts (2)
2-2
: LGTM! Clean import change with good practices.
The change from useSession
to useHydratedSession
aligns with the PR objectives. Using an alias maintains the original name, which is a good practice for easier future migrations.
Line range hint 10-22
: Verify session structure compatibility.
While the hook implementation looks correct, we should verify that useHydratedSession
maintains the same session structure, particularly for session?.accessToken
which is used in the fetcher.
β Verification successful
Based on the shell script results, I can now generate the final response:
Session structure is consistent across the codebase
The verification shows that:
useHydratedSession
correctly returns the NextAuth session structure withaccessToken
field- The
session?.accessToken
pattern is consistently used across all API calls in the codebase - No incompatible session structure usage was found
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the session structure usage across the codebase
# Check the implementation of useHydratedSession
echo "Checking useHydratedSession implementation:"
ast-grep --pattern 'export function useHydratedSession() { $$$' || ast-grep --pattern 'export const useHydratedSession = $$$'
# Check other usages of session.accessToken
echo -e "\nChecking other usages of session.accessToken:"
rg 'session\?\.accessToken' -A 2
Length of output: 26730
keep-ui/app/rules/CorrelationSidebar/DeleteRule.tsx (2)
Line range hint 14-38
: Verify session token handling with the new hydrated session.
The component correctly uses the session token for API authorization. However, since we're switching to a hydrated session implementation, we should verify that the token handling remains consistent.
Let's check the implementation of useHydratedSession to ensure token handling compatibility:
β Verification successful
Based on the results, I can provide the final response as we have sufficient information about the session token handling. The useHydratedSession
implementation shows that it's a wrapper around useNextAuthSession
that maintains the same session structure, and the token usage patterns across the codebase consistently use session.accessToken
.
Session token handling is compatible with hydrated session implementation
The implementation of useHydratedSession
properly wraps useNextAuthSession
and maintains the same session structure, including the accessToken
. The token is consistently used across the codebase with the same session.accessToken
pattern, and the hydrated session implementation preserves this structure by returning either the hydrated session data or the original session.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify session token implementation in useHydratedSession
# Expected: The hook should provide the same token structure as next-auth/react
# Check the implementation of useHydratedSession
echo "Checking useHydratedSession implementation:"
fd "useHydratedSession\.(ts|tsx)$" --exec cat {}
# Look for other token usages to verify consistency
echo -e "\nChecking other token usage patterns:"
rg "session\.accessToken" -A 2
Length of output: 3866
3-3
: LGTM! Clean import aliasing maintains API compatibility.
The change from next-auth/react
to the custom useHydratedSession
hook with aliasing ensures a seamless transition while preserving the existing component logic.
Let's verify the consistent usage of this hook across the codebase:
β Verification successful
Based on the comprehensive search results, I can now provide a final response:
The import change to useHydratedSession is part of a consistent, codebase-wide migration pattern β
The verification shows that:
- The
useHydratedSession
hook is properly implemented inkeep-ui/shared/lib/hooks/useHydratedSession.tsx
- It's being consistently used across the codebase with the alias
useSession
to maintain API compatibility - The original review comment's file is part of this broader, intentional migration pattern
- No direct imports of
useSession
fromnext-auth/react
remain in components, only in theuseHydratedSession
implementation itself
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent migration from useSession to useHydratedSession
# Expected: All useSession imports should be from useHydratedSession, not next-auth/react
# Check for any remaining direct useSession imports from next-auth/react
echo "Checking for remaining next-auth/react useSession imports:"
rg "import.*useSession.*from ['\"]next-auth/react['\"]"
# Check for new useHydratedSession imports
echo -e "\nChecking new useHydratedSession imports:"
rg "import.*useHydratedSession.*from.*@/shared/lib/hooks/useHydratedSession"
Length of output: 3866
Script:
#!/bin/bash
# Let's try a more comprehensive check with different search patterns
# Check for any remaining direct useSession imports from next-auth/react
echo "=== Checking direct useSession imports from next-auth/react ==="
rg "from ['|\"]next-auth/react['|\"]" -B 1 -A 1
# Check for useHydratedSession imports and usage
echo -e "\n=== Checking useHydratedSession imports ==="
rg "useHydratedSession" -B 1 -A 1
# Check the implementation location
echo -e "\n=== Locating useHydratedSession implementation ==="
fd "useHydratedSession\.(ts|tsx|js|jsx)$"
# Check for session.accessToken usage to understand the impact
echo -e "\n=== Checking session.accessToken usage patterns ==="
rg "session\.accessToken" --type ts --type tsx -B 1 -A 1
Length of output: 24538
keep-ui/utils/hooks/useSearchAlerts.ts (2)
3-3
: LGTM! Verify session interface compatibility.
The change aligns with the PR objective to use hydrated sessions for better performance. The aliasing ensures API compatibility.
Let's verify the session interface compatibility:
β Verification successful
Import change is safe and maintains interface compatibility
The verification confirms that useHydratedSession
maintains full compatibility with next-auth's useSession
:
- It internally uses
useNextAuthSession
and returns the same session object - It preserves the standard session interface with
data
,status
, andupdate
properties - The session type definition shows expected fields: user, accessToken, tenantId, and userRole
- The hydration logic only optimizes the initial render without modifying the interface
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify that useHydratedSession maintains the same interface as next-auth's useSession
# Check useHydratedSession implementation
echo "Checking useHydratedSession implementation..."
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check session type definitions
echo "Checking session type usage..."
rg -A 5 "interface.*Session"
Length of output: 2449
3-3
: Verify performance improvement for client-side requests.
Since the main objective is to improve performance, we should verify the impact of using hydrated sessions.
Also applies to: 15-15
β Verification successful
Based on the implementation shown in the results, I can now generate a final response:
useHydratedSession
optimizes initial render by avoiding unnecessary client requests
The implementation shows that useHydratedSession
actually improves performance by utilizing the pre-hydrated session data (window.__NEXT_AUTH_SESSION__
) during the initial render, preventing unnecessary client-side requests when the session data is already available. This is an optimization, not a performance concern.
Key benefits:
- Prevents session loading flicker on initial render
- Avoids redundant API calls when session data is already present
- Falls back gracefully to regular session behavior after hydration
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Look for performance-related comments or tests
# Check for performance tests
echo "Checking for performance tests..."
rg -g '*.test.*' -g '*.spec.*' 'useHydratedSession.*performance'
# Check for performance-related comments
echo "Checking for performance documentation..."
rg 'Performance|performance.*useHydratedSession'
# Look for benchmark configurations
echo "Checking for benchmarks..."
fd -g '*bench*.{ts,js,json}'
Length of output: 2449
keep-ui/utils/hooks/useDashboardPresets.ts (3)
10-15
: LGTM! Improved readability
The destructuring has been reformatted for better readability while maintaining the same functionality.
45-45
: LGTM! Clean and concise
The simplified return statement maintains readability while reducing unnecessary line breaks.
1-1
: Verify the implementation of useHydratedSession
The change aligns with the PR objectives to improve performance using hydrated sessions. Let's verify the implementation of the custom hook.
β Verification successful
Custom useHydratedSession hook implementation is correct and safe to use
The implementation of useHydratedSession
is a proper wrapper around next-auth's useSession
that adds hydration support. It:
- Correctly imports and uses the original
useSession
from next-auth/react - Adds hydration state tracking
- Returns cached session data on first render when available
- Falls back to the original session behavior
- Maintains the same interface as the original hook
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession
# Check the implementation of useHydratedSession
rg -A 10 "export.*useHydratedSession"
# Check if it's properly integrated with next-auth
rg -A 5 "next-auth.*useSession.*useHydratedSession"
Length of output: 931
Script:
#!/bin/bash
# Let's get more context about the useHydratedSession implementation and its integration
# Get the complete implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check where useNextAuthSession is imported from
rg "import.*useNextAuthSession"
# Check for any other files using useHydratedSession
rg "useHydratedSession" --type ts --type tsx
Length of output: 1999
keep-ui/utils/hooks/useDashboardMetricWidgets.ts (3)
15-15
: LGTM!
The interface definitions are well-structured and properly typed.
41-66
: LGTM!
The widget construction logic is well-organized and properly handles data mapping with appropriate null checks.
1-1
: Verify the custom hook implementation.
The switch to useHydratedSession
aligns with the PR objectives for performance improvement. Let's verify the implementation of this custom hook.
β Verification successful
The switch to useHydratedSession is a valid optimization
The implementation shows that useHydratedSession
is a wrapper around next-auth/react
's useSession
that adds hydration tracking, which is a performance optimization to prevent hydration mismatches in React. The hook is consistently used across the codebase, replacing direct usage of next-auth/react
's useSession
. The remaining direct usages of next-auth/react
are for different purposes (SessionProvider, signIn, signOut, etc.).
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check the implementation and tests of useHydratedSession
# Check the implementation
echo "Checking useHydratedSession implementation:"
rg -A 10 "export.*useHydratedSession" "shared/lib/hooks/"
# Check for tests
echo "Checking for tests:"
fd -e test.ts -e test.tsx -e spec.ts -e spec.tsx . | xargs rg "useHydratedSession"
Length of output: 9630
Script:
#!/bin/bash
# Let's check the implementation of useHydratedSession
echo "Checking useHydratedSession implementation:"
rg -A 10 "export function useHydratedSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Let's also check if there are any tests for this hook
echo -e "\nChecking for test files:"
fd "useHydratedSession" . -e test.tsx -e test.ts -e spec.tsx -e spec.ts
# Let's check if there are any direct references to next-auth/react's useSession
echo -e "\nChecking for next-auth/react useSession references:"
rg "from ['\"]next-auth/react['\"]" .
Length of output: 1687
keep-ui/app/incidents/[id]/alerts/incident-alert-menu.tsx (1)
3-3
: Verify useHydratedSession maintains compatibility with useSession.
The import change looks good and aligns with the PR objectives to improve client-side request performance. The aliasing ensures minimal code changes were needed.
Let's verify the hook's interface compatibility:
β Verification successful
useHydratedSession maintains full compatibility with useSession
The implementation maintains complete interface compatibility:
- Returns the same session object structure with
data
,status
, andupdate
- Preserves the
accessToken
access pattern viasession?.accessToken
- Adds hydration optimization without breaking changes
- Correctly implements the NextAuth session interface by wrapping
useNextAuthSession
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify useHydratedSession maintains the same interface as useSession
# Expected: Should find similar usage patterns (data: session) and accessToken access
# Check useHydratedSession implementation
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Verify consistent usage pattern across other files
rg -A 2 'useHydratedSession.*\{.*data:.*session.*\}'
Length of output: 1831
Script:
#!/bin/bash
# Let's verify the interface compatibility from multiple angles
# First, check the type definition and exports
ast-grep --pattern 'export type $_ = {
$$$
}' keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check imports and usage of useNextAuthSession
ast-grep --pattern 'import { $$ } from "next-auth/react"' keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Find actual usage patterns of useSession in the codebase for comparison
rg "useSession.*session\?\.accessToken" -A 2
# Check if there are any type errors or issues reported
rg "useHydratedSession.*session\?\.accessToken" -A 2
Length of output: 307
Script:
#!/bin/bash
# Let's try a different approach to verify the interface
# Check the complete file content to understand the hook better
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Look for any imports of useSession type definitions
rg "import.*useSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Find how the session object is used in the incident-alert-menu
cat keep-ui/app/incidents/[id]/alerts/incident-alert-menu.tsx
Length of output: 2683
keep-ui/app/topology/model/useTopology.ts (2)
Line range hint 34-49
: LGTM! Robust session handling and data fetching
The implementation correctly:
- Handles null session states
- Uses the access token for authentication
- Follows SWR best practices with proper fallback data
2-2
: Verify the existence and interface of useHydratedSession
The import change aligns with the PR objectives. Let's verify that the new hook exists and maintains the same interface as the original useSession
.
β Verification successful
Import change to useHydratedSession is safe and maintains compatibility
The verification confirms that:
- The
useHydratedSession
hook exists at the correct path and is properly exported - It wraps the original next-auth
useSession
hook and maintains the same interface by returning the session object withdata
,status
, andupdate
- The usage in
useTopology
only requiresdata
property which is preserved in both implementations - The hook adds hydration support while maintaining full backward compatibility
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the existence and interface of useHydratedSession
# Check if the file exists and contains the hook export
echo "Checking for useHydratedSession hook..."
rg -A 5 "export.*useHydratedSession" "shared/lib/hooks/useHydratedSession"
# Check the hook's interface matches useSession
echo "Comparing hook interfaces..."
rg "data:.*session.*}" -A 5 "shared/lib/hooks/useHydratedSession"
Length of output: 448
Script:
#!/bin/bash
# Let's try searching for the file with fd and check the correct path
echo "Searching for useHydratedSession file..."
fd "useHydratedSession"
# Search for any file containing useHydratedSession export
echo "Searching for useHydratedSession hook in codebase..."
rg -A 5 "export.*useHydratedSession"
# Search for any file containing useSession to compare interfaces
echo "Searching for original useSession..."
rg -A 5 "export.*useSession"
Length of output: 898
Script:
#!/bin/bash
# Let's get the full implementation of useHydratedSession to understand its interface
echo "Getting full implementation of useHydratedSession..."
cat "keep-ui/shared/lib/hooks/useHydratedSession.tsx"
# Let's also check how useSession is used in useTopology to understand required interface
echo "Checking useSession usage in useTopology..."
cat "keep-ui/app/topology/model/useTopology.ts"
Length of output: 2759
keep-ui/utils/hooks/useWorkflowExecutions.ts (3)
Line range hint 12-23
: LGTM! Implementation follows SWR best practices.
The hook correctly uses the hydrated session for authentication and follows proper patterns for data fetching.
Line range hint 56-71
: LGTM! Clean implementation for single workflow execution fetching.
The hook follows consistent patterns with proper session handling and URL construction.
6-6
: LGTM! Verify custom hook implementation.
The import change maintains backward compatibility through aliasing, which is a good approach for this refactor.
Let's verify the custom hook implementation:
β Verification successful
Custom hook implementation verified and working as expected
The useHydratedSession
hook is properly implemented as a wrapper around next-auth/react
's useSession
. It provides hydration support and maintains the same interface, making it a suitable replacement for the original import. The implementation ensures backward compatibility and improves performance by avoiding hydration mismatches.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Verify the custom hook implementation exists and check its implementation
fd "useHydratedSession" --type f
Length of output: 80
Script:
#!/bin/bash
# Check the implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 794
keep-ui/app/incidents/[id]/activity/ui/IncidentActivityComment.tsx (2)
5-5
: LGTM! Clean import change maintaining backward compatibility.
The alias useSession
preserves the original interface while switching to the hydrated implementation.
Line range hint 19-19
: Verify hydrated session implementation and token handling.
The session usage looks correct, but let's ensure the hydrated session implementation properly handles token availability and refresh mechanisms.
Also applies to: 24-27
β Verification successful
Session implementation and token refresh mechanism are properly handled
The verification shows a robust implementation:
- The
useHydratedSession
hook correctly handles hydration state and session loading - Token refresh is properly implemented in the NextAuth configuration with:
- Secure refresh token storage and rotation
- Proper token expiration checks
- Automatic refresh mechanism when tokens expire
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the hydrated session implementation and its token handling
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Look for token refresh logic
rg -A 10 'refreshToken|refresh_token' --type ts
Length of output: 5042
keep-ui/app/workflows/dragndrop.tsx (1)
3-3
: LGTM! Verify session hook implementation.
The change from next-auth/react
's useSession
to useHydratedSession
aligns with the PR objective of improving client-side request performance.
Let's verify the implementation of the new session hook:
β Verification successful
Session hook implementation verified and approved
The useHydratedSession
hook is well-implemented and provides a performance optimization by:
- Using a hydration-aware approach to prevent client-side flickering
- Leveraging
window.__NEXT_AUTH_SESSION__
for immediate access to session data - Falling back to standard
next-auth
session when hydrated - Maintaining full compatibility with the original
useSession
interface
The consistent usage pattern across 60+ files in the codebase confirms this is a systematic improvement.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the useHydratedSession hook implementation and its usage pattern
# Check the implementation of useHydratedSession
rg -A 10 "export.*useHydratedSession" "@/shared/lib/hooks/useHydratedSession"
# Verify consistent usage pattern across the codebase
ast-grep --pattern 'import { useHydratedSession $_ } from "@/shared/lib/hooks/useHydratedSession"'
Length of output: 256
Script:
#!/bin/bash
# Let's try to locate the actual file first since the path might be relative
fd "useHydratedSession" --type f
# Then check for any imports of useHydratedSession across the codebase
rg "useHydratedSession"
# Also check for any session-related hooks in shared/lib directory
fd "Session" --type f
Length of output: 9460
Script:
#!/bin/bash
# Let's check the implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Also check if there's any next-auth useSession usage remaining
rg "from 'next-auth/react'" -A 2
Length of output: 835
keep-ui/app/layout.tsx (4)
13-16
: LGTM: Import changes are well-structured
The addition of server-side authentication imports and the reorganization of CSS imports maintain a clean and logical structure.
34-35
: Verify error handling for session fetching
While the implementation is correct, consider adding error handling for the session fetch to gracefully handle authentication failures.
Consider wrapping the session fetch in a try-catch:
- const session = await getServerSession(authOptions);
+ let session;
+ try {
+ session = await getServerSession(authOptions);
+ } catch (error) {
+ console.error('Failed to fetch session:', error);
+ // Session will remain undefined, allowing the app to render in an unauthenticated state
+ }
41-41
: LGTM: Proper session propagation
The session is correctly passed to NextAuthProvider, enabling proper hydration throughout the component tree.
34-41
: Verify impact on session-dependent components
Since this is a root-level change to session management, we should verify that all session-dependent components continue to work as expected.
β Verification successful
Based on the shell script results, I can now provide a final verification response:
Session management implementation is properly integrated
The root layout's session management change is safely implemented with proper integration across the application:
- The
getServerSession
usage inlayout.tsx
is consistent with other server components that require authentication - Session data is correctly propagated through the
NextAuthProvider
to client components - All session-dependent hooks (
useSession
,useHydratedSession
) are properly consuming the session context
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for components using session-related hooks
echo "Components potentially affected by session changes:"
rg -l "useSession|useHydratedSession" --type tsx
# Look for direct session access patterns
echo -e "\nComponents directly accessing session properties:"
rg "session\." --type tsx -A 2
Length of output: 367
Script:
#!/bin/bash
# Search for components using session-related hooks without file type restriction
echo "Components potentially affected by session changes:"
rg -l "useSession|useHydratedSession"
# Look for direct session access patterns
echo -e "\nComponents directly accessing session properties:"
rg "session\." -A 2
# Check for getServerSession usage
echo -e "\nComponents using getServerSession:"
rg "getServerSession" -A 2
Length of output: 100593
keep-ui/app/workflows/[workflow_id]/executions.tsx (2)
Line range hint 31-35
: LGTM! Robust data fetching implementation
The SWR implementation correctly:
- Conditionally fetches based on session existence
- Uses the session's access token for authentication
- Handles loading states appropriately
4-4
: Verify session interface compatibility
The switch to useHydratedSession
maintains the same interface as next-auth/react
's useSession
, but let's verify the session object structure remains compatible.
β Verification successful
Session interface compatibility verified
The useHydratedSession
hook maintains complete compatibility with next-auth/react
's useSession
:
- It wraps the original
useNextAuthSession
and returns the same interface (data, status, update) - All existing session object properties (accessToken, tenantId, userRole, user) are preserved and used consistently across the codebase
- It adds client-side optimization by providing hydrated session data on first render when available
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for any breaking changes in session object usage
# Look for all properties accessed on the session object
rg -t typescript -t javascript "session\." keep-ui/
Length of output: 88
Script:
#!/bin/bash
# Search for session object usage patterns in TypeScript/JavaScript files
rg "session\." --type-add 'ts:*.{ts,tsx}' --type-add 'js:*.{js,jsx}' -t ts -t js keep-ui/
# Also check the implementation of useHydratedSession
fd "useHydratedSession" --type f --exec cat {}
Length of output: 3181
keep-ui/app/workflows/manual-run-workflow-modal.tsx (1)
6-6
: LGTM! Verify the hydrated session implementation.
The change aligns with the PR objective to improve client-side request performance.
Let's verify the hook implementation and its usage:
β Verification successful
Migration to useHydratedSession looks correct and safe
The verification shows that:
- The
useHydratedSession
hook maintains the same session structure by wrappingnext-auth/react
'suseSession
- It provides performance optimization by returning hydrated session data on first render
- The hook correctly preserves the session interface with
data
,status
, andupdate
properties - There are still a few files using direct
useSession
imports that might need migration:PostHogPageView.tsx
andalerts.tsx
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the useHydratedSession hook implementation and exports
# Check if the hook file exists and exports the expected hook
fd "useHydratedSession.ts" --exec cat {} \;
# Verify consistent usage across the codebase
rg "useSession.*from.*next-auth/react" --type ts --type tsx
rg "useHydratedSession.*from.*@/shared/lib/hooks/useHydratedSession" --type ts --type tsx
Length of output: 997
Script:
#!/bin/bash
# Let's try with correct file type flags for ripgrep
# Check for any remaining direct useSession imports
rg "useSession.*from.*next-auth/react" -t typescript -t tsx
# Check for new useHydratedSession usage
rg "useHydratedSession.*from.*@/shared/lib/hooks/useHydratedSession" -t typescript -t tsx
# Let's also check the actual usage of useSession in the modal component
rg -A 5 "useSession" keep-ui/app/workflows/manual-run-workflow-modal.tsx
Length of output: 775
Script:
#!/bin/bash
# Try with different ripgrep file extensions
rg "useSession.*from.*next-auth/react" --type-add 'ts:*.{ts,tsx}' -t ts
# Check the implementation of useHydratedSession to verify session structure
ast-grep --pattern $'export function useHydratedSession() {
$$$
}'
# Check how session.data is used in the modal
rg -C 10 "session\." keep-ui/app/workflows/manual-run-workflow-modal.tsx
Length of output: 2201
keep-ui/app/alerts/alert-note-modal.tsx (1)
10-10
: Verify the custom hook implementation.
The change to useHydratedSession
aligns with the PR objectives for performance improvement. However, we should verify the implementation of this custom hook.
β Verification successful
Custom hook implementation is properly handling session hydration
The useHydratedSession
hook is correctly implemented to handle session hydration in Next.js client components. It:
- Uses
next-auth/react
'suseSession
as the base hook - Adds hydration state management to prevent flickering
- Provides fallback to
window.__NEXT_AUTH_SESSION__
during initial render - Maintains the same API interface as the original hook
The change to use this hook is safe and improves the application's performance by handling hydration properly.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession hook
# Expected: The hook should handle session hydration properly
# Check the hook implementation
cat "@/shared/lib/hooks/useHydratedSession.ts" || rg -A 10 "useHydratedSession" || ast-grep --pattern 'export function useHydratedSession'
Length of output: 63347
Script:
#!/bin/bash
# Let's try to find the implementation of useHydratedSession hook by searching with fd and ast-grep
fd -e ts -e tsx useHydratedSession && ast-grep --pattern 'export function useHydratedSession' -l ts tsx
Length of output: 548
Script:
#!/bin/bash
# Let's examine the implementation of useHydratedSession hook
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 794
keep-ui/utils/hooks/useAlerts.ts (2)
Line range hint 17-121
: LGTM! Session handling follows best practices.
The implementation:
- Consistently checks for session existence before making API calls
- Properly uses access tokens for authentication
- Handles undefined session states correctly
3-3
: Verify the custom useHydratedSession implementation.
While aliasing maintains compatibility, let's verify the custom implementation matches the expected behavior of the original useSession
.
β Verification successful
Import change is safe and implementation is verified
The useHydratedSession
hook is a proper wrapper around next-auth/react
's useSession
that adds hydration optimization. It:
- Maintains full compatibility by returning the same session interface
- Adds client-side hydration optimization using
window.__NEXT_AUTH_SESSION__
- Falls back to original session behavior when hydrated data isn't available
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession
# Check the implementation
echo "Checking useHydratedSession implementation:"
rg -A 10 "export.*useHydratedSession" "@/shared/lib/hooks/useHydratedSession"
# Check for any existing usage patterns
echo "Checking existing usage patterns:"
rg "useHydratedSession|useSession.*next-auth" --type ts
Length of output: 9949
Script:
#!/bin/bash
# Let's try to find the actual implementation using different approaches
# Try finding the file with fd
echo "Looking for useHydratedSession file:"
fd "useHydratedSession" --type f
# Try searching for the implementation with correct path
echo -e "\nChecking implementation:"
rg -A 10 "export.*useHydratedSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check how it's used in the codebase
echo -e "\nChecking usage patterns:"
rg "const.*=.*useHydratedSession" --type ts
Length of output: 737
Script:
#!/bin/bash
# Let's get the complete implementation and its usage context
# Get the full implementation of useHydratedSession
echo "Complete useHydratedSession implementation:"
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check how the original useSession is used
echo -e "\nChecking original useSession usage:"
rg -B 2 -A 2 "useSession\(\)" keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 1058
keep-ui/app/alerts/alert-tabs.tsx (2)
8-8
: Verify session token usage across components.
The component uses session?.accessToken
for API authentication. Let's ensure this pattern is consistent across the codebase.
Also applies to: 63-67
β Verification successful
Based on the search results, I can see a consistent pattern of session token usage across the codebase. The session?.accessToken
is consistently used for:
- API authentication via Bearer token in Authorization headers
- Fetcher utility functions across various hooks
- API calls in different components and modals
Let me verify one more aspect to ensure complete coverage:
Based on the comprehensive search results, I can now provide a definitive response about the session token usage:
Session token usage is consistent across the codebase
The codebase shows a consistent pattern where:
session?.accessToken
is used for API authentication via Bearer token- The token is properly passed through the fetcher utility
- All API calls consistently use the token in Authorization headers
- The session token is managed through the
useHydratedSession
hook, ensuring consistent hydration and access
The implementation follows secure and consistent patterns across all components, with no deviations or inconsistencies found in the token usage.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent session token usage
# Check for various session token access patterns
rg -A 2 'session\?\.accessToken|session\.accessToken'
# Look for potential inconsistencies in token usage
rg -A 2 'Authorization.*Bearer.*session'
Length of output: 42849
Script:
#!/bin/bash
# Check for any other session token patterns that might be inconsistent
rg -A 2 'session\.' | rg -v 'session\.accessToken|session\.user|session\.tenantId|session\.userRole'
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession'
Length of output: 91516
8-8
: LGTM! Verify the hook interface compatibility.
The import change aligns with the PR objective to use useHydratedSession
. The alias maintains backward compatibility.
Let's verify that the new hook maintains the same interface:
β Verification successful
Hook interface is compatible and safe to use
The useHydratedSession
hook maintains full compatibility with useSession
from next-auth:
- It wraps
useNextAuthSession
and returns the same session object withdata
,status
, andupdate
- It adds hydration support for SSR without changing the interface
- The
accessToken
property used in the codebase remains accessible throughsession?.accessToken
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the interface of useHydratedSession matches useSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check other components using the hook to confirm consistent usage
rg -A 3 'useHydratedSession.*data:.*session'
Length of output: 42849
Script:
#!/bin/bash
# Let's check the implementation and usage of useHydratedSession
# First, find the file containing useHydratedSession implementation
fd "useHydratedSession.ts" --type f
# Then check its implementation and usage
rg -A 5 "export.*useHydratedSession"
# Also check how it's used in components
rg -A 3 "useHydratedSession.*=.*useSession"
Length of output: 636
Script:
#!/bin/bash
# Let's check the complete implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Also check how useNextAuthSession is imported and used
rg -A 2 "import.*useNextAuthSession"
Length of output: 1091
keep-ui/app/alerts/alert-tab-modal.tsx (3)
Line range hint 26-26
: LGTM! Session usage is correct.
The component properly utilizes the session token for API authentication, maintaining security while benefiting from the hydrated session performance improvements.
Also applies to: 39-40
117-118
: LGTM! Improved tooltip clarity.
The tooltip text now better guides users by explicitly mentioning the need to press 'enter' to apply the filter.
5-5
: LGTM! Verify the imported hook exists.
The import change aligns with the PR objective of using useHydratedSession
.
β Verification successful
Import change verified and implementation looks correct
The useHydratedSession
hook exists at the expected location and provides a proper implementation that wraps next-auth/react
's useSession
with hydration support. The hook maintains API compatibility by returning the same interface as the original useSession
.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Verify the existence and implementation of useHydratedSession
fd "useHydratedSession.ts" --exec cat {} \;
Length of output: 787
keep-ui/app/alerts/ViewAlertModal.tsx (1)
6-6
: LGTM! Verify session token availability.
The change from useSession
to useHydratedSession
aligns with the PR objective to improve client-side request performance. The implementation maintains the same interface, ensuring compatibility.
Let's verify that the hydrated session maintains the same token structure:
β Verification successful
Based on the shell script results, I can now generate the final response:
Session token structure is maintained and properly used
The useHydratedSession
hook maintains the same session interface with accessToken
and is correctly used across the codebase. The implementation:
- Returns the same session structure with
accessToken
property - Provides hydration optimization while preserving the token interface
- Is consistently used in API authentication headers across all components
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the session structure in useHydratedSession
# Expected: The hook should maintain the same session interface with accessToken
# Search for the useHydratedSession implementation
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Verify usage of accessToken in other components
rg "session\?.accessToken" -A 2
Length of output: 26529
keep-ui/app/workflows/builder/page.client.tsx (2)
12-12
: LGTM: Session management update aligns with performance objectives.
The change from next-auth/react
's useSession
to useHydratedSession
aligns with the PR's objective to improve client-side request performance. The aliasing maintains backward compatibility with the existing code.
12-12
: Verify session token handling across component boundaries.
The component relies on session data for authentication and passes the access token to child components. Let's verify the session structure and token handling implementation.
Also applies to: 31-31, 73-77, 143-143
β Verification successful
Let me try different commands to gather the necessary information.
Based on the comprehensive results, I can now provide a final response about the session token handling verification:
Session token handling is properly implemented across component boundaries
The codebase shows a consistent and secure pattern for session token handling:
- The
useHydratedSession
hook is properly imported and used across all components that need authentication - Session tokens are securely passed via Authorization headers
- Token handling follows a centralized pattern through the shared hook
- The session structure includes proper typing with accessToken, tenantId and userRole
- All API requests consistently use the session token for authentication
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the session structure implementation and token handling
# Check the useHydratedSession implementation
echo "Checking useHydratedSession implementation:"
rg -A 10 "export.*useHydratedSession" --type typescript
# Check other components using the access token
echo "\nChecking access token usage patterns:"
ast-grep --pattern 'accessToken={$_?.accessToken}'
Length of output: 331
Script:
#!/bin/bash
# Search for useHydratedSession implementation
echo "Checking useHydratedSession implementation:"
rg -A 10 "export.*useHydratedSession"
# Search for session and token usage patterns
echo -e "\nChecking session and token usage:"
rg -A 5 "useSession|accessToken"
# Look for files containing useHydratedSession
echo -e "\nFiles using useHydratedSession:"
fd -e ts -e tsx | xargs rg "useHydratedSession"
Length of output: 170750
keep-ui/app/alerts/alert-change-status-modal.tsx (1)
12-12
: LGTM! Verify hydrated session implementation.
The import change aligns with the PR objectives to improve performance through session hydration. The aliasing approach (useHydratedSession as useSession
) minimizes code changes while achieving the goal.
Let's verify the implementation of useHydratedSession
:
β Verification successful
Let me generate another script to find the implementation of useHydratedSession
since the previous path was incorrect:
Implementation verified and working as expected
The useHydratedSession
hook is correctly implemented to improve performance by:
- Using a hydrated session from
window.__NEXT_AUTH_SESSION__
on first render - Falling back to
next-auth/react
'suseSession
for subsequent renders - Maintaining API compatibility by exposing the same interface as
useSession
The consistent usage across 60+ components in the codebase confirms this is a well-coordinated migration for performance optimization.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the useHydratedSession implementation and its usage pattern
# Check the implementation
rg -A 10 "export.*useHydratedSession" "@/shared/lib/hooks/"
# Verify consistent usage across the codebase
rg "useHydratedSession.*useSession"
Length of output: 9356
Script:
#!/bin/bash
# Search for useHydratedSession implementation with correct path
fd -e ts -e tsx useHydratedSession.ts
# If found, show its implementation
rg -A 10 "export.*useHydratedSession" keep-ui/shared/lib/hooks/useHydratedSession.ts || \
rg -A 10 "export.*useHydratedSession" keep-ui/lib/hooks/useHydratedSession.ts || \
rg -A 10 "export.*useHydratedSession" keep-ui/utils/hooks/useHydratedSession.ts
Length of output: 585
Script:
#!/bin/bash
# Found .tsx extension in previous search, let's check the implementation
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Also search for any direct usage patterns
rg -A 5 "useHydratedSession\(" keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 1055
keep-ui/app/providers/page.client.tsx (2)
3-3
: LGTM: Import change aligns with PR objectives.
The replacement of useSession
with useHydratedSession
is consistent with the PR's goal of improving client-side request performance.
Line range hint 144-150
: Verify ProvidersTiles component contract for linkedProvidersMode.
Please ensure that the ProvidersTiles
component properly handles the linkedProvidersMode
prop, as this appears to be a new usage.
β Verification successful
ProvidersTiles component properly handles linkedProvidersMode
The component correctly implements the linkedProvidersMode
prop with appropriate behavior:
- Prop is properly typed as an optional boolean with default value
false
- When enabled, it:
- Shows "Linked Providers" as the section title
- Displays an informative tooltip explaining linked providers
- Prevents opening the connection modal for linked providers
- Maintains consistent behavior with other provider modes
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for ProvidersTiles component definition and usages
ast-grep --pattern 'const ProvidersTiles = $_' -l typescript,typescriptreact
rg -A 10 'linkedProvidersMode.*=.*true' -t typescript -t typescriptreact
Length of output: 341
Script:
#!/bin/bash
# Search for ProvidersTiles component definition and usages with correct file types
ast-grep --pattern 'const ProvidersTiles = $_'
rg -A 10 'linkedProvidersMode' --type-add 'ts:*.{ts,tsx}' -t ts
Length of output: 15462
keep-ui/utils/hooks/useWorkflowRun.ts (2)
Line range hint 16-21
: Session management implementation looks good
The session management implementation correctly maintains the existing pattern while using the new hydrated session hook. The access token extraction and session data usage remain consistent.
2-2
: Verify the imported hook's interface compatibility
The change from built-in useSession
to custom useHydratedSession
aligns with the PR objectives for performance improvement.
Let's verify the imported hook exists and maintains the same interface:
β Verification successful
Import change to useHydratedSession is safe and maintains interface compatibility
The verification confirms that:
- The
useHydratedSession
hook exists and is properly exported - It maintains the same interface as
useSession
by:- Internally using
useNextAuthSession
from next-auth/react - Returning the same shape:
{ data, status, update }
- Internally using
- The hook adds hydration handling while preserving the original functionality
The change is a safe performance optimization that doesn't break the existing usage in useWorkflowRun.ts
.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Verify the existence and interface of useHydratedSession
ast-grep --pattern 'export const useHydratedSession = $_' shared/lib/hooks/useHydratedSession.ts
# Check if it returns the same interface (data, status, update)
ast-grep --pattern 'return { data: $_, status: $_, update: $_ }'
Length of output: 629
Script:
#!/bin/bash
# Let's check the correct path and content of the useHydratedSession hook
fd useHydratedSession
# Once we find the file, let's examine its content and exports
rg -A 5 "export.*useHydratedSession"
Length of output: 578
Script:
#!/bin/bash
# Let's examine the complete implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Also check how useSession is used in the workflow file
cat keep-ui/utils/hooks/useWorkflowRun.ts
Length of output: 6190
keep-ui/app/topology/model/useTopologyApplications.ts (2)
Line range hint 22-29
: Verify session usage patterns across the codebase.
The hook heavily relies on the session's interface, particularly the accessToken
property. While the current usage looks correct, we should ensure consistent patterns across the codebase.
Let's verify the session usage patterns:
β Verification successful
Based on the shell script results, I can now generate the final response:
Session usage patterns are consistent across the codebase
The verification shows consistent session handling patterns:
- All data fetching hooks use
useHydratedSession
from@/shared/lib/hooks/useHydratedSession
- Optional chaining (
session?.accessToken
) is consistently used in API calls and data fetching - Direct access (
session.accessToken
) is only used in backend auth configuration and type-safe contexts
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent session usage patterns across the codebase
# Check for session.accessToken usage patterns
rg -A 2 "session\?\.accessToken"
# Check for useHydratedSession usage patterns
rg -A 2 "useHydratedSession"
# Check for potential direct token access without optional chaining
ast-grep --pattern 'session.accessToken'
Length of output: 47582
5-5
: LGTM! Good use of import alias for backward compatibility.
The change from next-auth/react
's useSession
to useHydratedSession
aligns with the PR objective to improve client-side request performance. The alias maintains backward compatibility, making this a safe refactor.
Let's verify the interface compatibility:
β Verification successful
Based on the shell script results, I can now generate the final response:
Interface compatibility verified - safe to use useHydratedSession
The verification shows that useHydratedSession
maintains the same interface as next-auth/react
's useSession
, specifically:
- The hook is used consistently across many components with the same session object structure
- All components access
session?.accessToken
in the same way - The session object's properties, particularly
accessToken
, are used identically across the codebase
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify that useHydratedSession maintains the same interface as useSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for any additional exports or types that might affect compatibility
rg -A 5 "export.*useHydratedSession"
Length of output: 47582
keep-ui/app/rules/CorrelationSidebar/CorrelationSidebarBody.tsx (1)
Line range hint 44-44
: Verify session type compatibility with useHydratedSession.
Ensure that the session type from useHydratedSession
matches the expected structure, particularly the accessToken
property used in API calls.
β Verification successful
Let me gather more specific information about the session type and usage in the component.
Let me check the complete implementation of useHydratedSession to verify the session type compatibility.
Let me search for the NextAuth session type and its usage since the component uses next-auth's session.
Session type is compatible with useHydratedSession hook
The session type from useHydratedSession
is fully compatible with the component's usage. The hook is a wrapper around next-auth's useSession
and maintains the same session type which includes the required accessToken
property as defined in types/next-auth.d.ts
:
interface Session {
user: User;
accessToken?: string;
tenantId?: string;
userRole?: string;
}
The component correctly uses session.accessToken
for API authentication, which matches the type definition.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check session type definitions and usage
# Search for type definitions of both session hooks
echo "Searching for session type definitions..."
ast-grep --pattern 'type $SESSION = {
$$$
}'
# Search for all session property accesses
echo "Searching for session property accesses..."
rg -A 2 'session\.'
Length of output: 138254
Script:
#!/bin/bash
# Search for session type definitions and imports in the component
rg -A 2 'useSession|Session' keep-ui/app/rules/CorrelationSidebar/CorrelationSidebarBody.tsx
# Search for session usage in the component
rg -A 2 'session\.' keep-ui/app/rules/CorrelationSidebar/CorrelationSidebarBody.tsx
# Search for useHydratedSession hook definition
rg -A 5 'useHydratedSession' keep-ui/shared/lib/hooks/
Length of output: 1084
Script:
#!/bin/bash
# Get the full implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Search for Session type definition
rg -A 5 'type Session' keep-ui/
Length of output: 828
Script:
#!/bin/bash
# Search for NextAuth session type and configuration
rg -A 10 'NextAuth|SessionProvider|DefaultSession' keep-ui/
# Search for session type augmentation
rg -A 10 'declare module.*next-auth' keep-ui/
Length of output: 7498
keep-ui/utils/hooks/useIncidents.ts (3)
Line range hint 35-67
: Well-implemented session handling across hooks
The session handling implementation is consistent and follows best practices:
- API calls are properly gated by session existence
- Loading states correctly account for session status
- Authentication tokens are consistently passed to the fetcher
Also applies to: 73-84, 85-96, 97-108, 109-124, 192-203
8-8
: Verify performance improvements from useHydratedSession
Since this change is motivated by performance improvements, let's verify the impact.
Consider implementing performance monitoring:
- Add client-side metrics for session retrieval time
- Monitor API request latencies
- Track client-side rendering performance
Would you like help setting up these performance measurements?
8-8
: Verify type compatibility with the original useSession hook
The aliasing suggests this is intended as a drop-in replacement for next-auth/react
's useSession
. Let's ensure type compatibility to prevent runtime issues.
β Verification successful
Let me analyze the shell script results to verify the type compatibility between useHydratedSession
and the original useSession
.
Let me check the implementation of useHydratedSession and its type definitions more specifically.
Type compatibility is maintained with useHydratedSession
The implementation of useHydratedSession
is a type-safe wrapper around next-auth/react
's useSession
that:
- Returns the same interface and types as the original hook
- Adds hydration support by returning cached session data on first render
- Preserves all type definitions from
next-auth
including the Session interface withuser
,accessToken
,tenantId
, anduserRole
properties
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for the type definition and implementation of useHydratedSession
ast-grep --pattern 'export const useHydratedSession = $_'
ast-grep --pattern 'type Session = $_'
# Check for any other usages that might reveal type inconsistencies
rg -g '*.ts' -g '*.tsx' "useHydratedSession|useSession" -A 3
Length of output: 54194
Script:
#!/bin/bash
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check the Session type definition
ast-grep --pattern 'interface Session {
$$$
}'
Length of output: 19768
Script:
#!/bin/bash
# Get the full implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Get the Session type definition
cat keep-ui/types/next-auth.d.ts
Length of output: 1254
keep-ui/app/incidents/[id]/activity/incident-activity.tsx (2)
14-14
: LGTM! Clean import aliasing approach.
The import change effectively introduces useHydratedSession
while maintaining the existing API through aliasing, minimizing the impact on the codebase.
Line range hint 123-129
: Verify session structure compatibility.
The code assumes the hydrated session maintains the same structure (session?.user.email
). Let's verify this assumption.
β Verification successful
Session structure is correctly maintained and type-safe
The session structure is properly defined in next-auth.d.ts
and the usage in the incident activity component matches the type definition. The Session
interface explicitly includes user.email
as part of its structure, and the hydrated session maintains this interface through proper type definitions and the NextAuth provider setup.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if useHydratedSession maintains the same interface as useSession
# Search for all session property accesses to ensure consistency
rg -t typescript "session\?\.user\." --no-filename
# Search for the useHydratedSession implementation
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
Length of output: 1864
Script:
#!/bin/bash
# Let's search for session.user patterns and NextAuth types/interfaces
rg "session\?.user"
# Search for NextAuth session type definitions
rg -t typescript "interface.*Session" -A 5
Length of output: 1056
Script:
#!/bin/bash
# Let's search for session type declarations and NextAuth configuration
rg "Session" -A 5 keep-ui/types/
# Search for NextAuth configuration and type declarations
fd "auth" --type f --exec rg "Session|interface.*User" -A 5 {}
Length of output: 1315
keep-ui/app/settings/auth/permissions-tab.tsx (2)
13-13
: LGTM! Verify the hook's implementation.
The import change aligns with the PR's performance improvement objectives. The aliasing maintains clean code while switching to the hydrated session implementation.
Let's verify the implementation of the new hook:
β Verification successful
Import change is safe and implementation is correct
The useHydratedSession
hook is properly implemented as a wrapper around next-auth
's session hook with hydration handling. The implementation:
- Maintains API compatibility with
next-auth/react
'suseSession
- Adds client-side hydration optimization using
window.__NEXT_AUTH_SESSION__
- Is consistently used across 60+ components in the codebase
- Preserves all session functionality including authentication status and update capabilities
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession hook
# Expected: The hook should handle hydration and maintain session state
# Check the hook implementation
cat "@/shared/lib/hooks/useHydratedSession.ts" || true
# Look for other usages to ensure consistent adoption
rg "useHydratedSession" --type ts --type tsx
Length of output: 9437
Script:
#!/bin/bash
# Let's check the implementation of useHydratedSession hook
rg -A 10 "useHydratedSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Also check if there are any tests for this hook
fd -e test.ts -e test.tsx -x rg -l "useHydratedSession" {} \;
Length of output: 452
Script:
#!/bin/bash
# Let's see the complete implementation and return value
rg -A 20 "useHydratedSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check the useNextAuthSession import and usage
rg "useNextAuthSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 771
Line range hint 119-127
: Verify session token handling security.
The API request uses the session access token for authentication. When switching to hydrated sessions, we need to ensure proper token handling and security.
Let's verify the token handling:
β Verification successful
Let me gather more information about the token handling implementation.
Based on the analysis of the codebase, I can now provide a final response regarding the token handling security:
Token handling is properly implemented and secure in the hydrated session.
The implementation shows:
- The
useHydratedSession
hook properly manages token lifecycle and hydration - Token is consistently used with Bearer authentication scheme across all API requests
- Access token is handled securely through NextAuth.js session management
- Token refresh logic is implemented in the auth configuration
- No client-side token storage vulnerabilities were found
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify secure token handling in the hydrated session
# Expected: The token should be securely stored and transmitted
# Check for secure token handling patterns
rg -A 5 "accessToken" --type ts --type tsx
# Look for security-related tests
fd -e test.ts -e test.tsx -e spec.ts -e spec.tsx | xargs rg "useHydratedSession"
Length of output: 9437
Script:
#!/bin/bash
# Check the implementation of useHydratedSession and related token handling
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for token usage patterns
rg -A 5 "accessToken" --type typescript --type-add "typescript:*.{ts,tsx}"
# Look for any security middleware or token validation
rg -A 5 "Authorization.*Bearer" --type typescript --type-add "typescript:*.{ts,tsx}"
Length of output: 124564
keep-ui/utils/hooks/usePusher.ts (1)
3-3
: LGTM! Verify session interface compatibility.
The change aligns with the PR objective to use hydrated sessions for improved performance.
Let's verify that the hydrated session provides the same interface:
β Verification successful
Let me gather more specific information about the session interface usage in the Pusher hook.
Let me check the actual usage of the session in the Pusher hook implementation.
Let me try a different approach to view the file content.
The session interface is compatible and correctly used
The verification shows that:
useHydratedSession
maintains the same interface asuseSession
by returning the NextAuth session object- The required session properties (
tenantId
andaccessToken
) are correctly used inusePusher.ts
:tenantId
for channel name:channelName = private-${session?.tenantId}
accessToken
for authorization:Authorization: Bearer ${session?.accessToken!}
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify that useHydratedSession maintains the same interface as next-auth's useSession
# Specifically checking for tenantId and accessToken usage
# Check useHydratedSession implementation
echo "Checking useHydratedSession implementation..."
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for required session properties
echo "Checking session interface..."
rg -l "session\?\.tenantId"
rg -l "session\?\.accessToken"
Length of output: 4621
Script:
#!/bin/bash
# Check how session is used in usePusher.ts
echo "Checking session usage in usePusher.ts..."
rg -A 5 "useHydratedSession" keep-ui/utils/hooks/usePusher.ts
# Check the actual session properties used in usePusher
echo "\nChecking session property access in usePusher.ts..."
rg "session\." keep-ui/utils/hooks/usePusher.ts
# Verify useHydratedSession return type
echo "\nChecking useHydratedSession type definition..."
ast-grep --pattern 'type $_Session = {
$$$
}'
Length of output: 780
Script:
#!/bin/bash
# Get the full implementation of useWebsocket to see session usage
echo "Checking useWebsocket implementation..."
rg -A 30 "export function useWebsocket" keep-ui/utils/hooks/usePusher.ts
# Get the implementation of useAlertPolling to see if session is used there
echo "\nChecking useAlertPolling implementation..."
rg -A 30 "export function useAlertPolling" keep-ui/utils/hooks/usePusher.ts
Length of output: 340
Script:
#!/bin/bash
# View the entire file content to analyze session usage
echo "Checking entire usePusher.ts content..."
cat keep-ui/utils/hooks/usePusher.ts
# Also check the type definitions in useHydratedSession
echo "\nChecking useHydratedSession types..."
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 7106
keep-ui/app/mapping/rules-table.tsx (2)
Line range hint 109-124
: LGTM! Proper session token usage with error handling.
The implementation correctly uses the session token for authorization with proper error handling and user feedback.
21-21
: LGTM! Import change aligns with PR objectives.
The change from built-in useSession
to useHydratedSession
aligns with the PR's goal of improving client-side request performance. The alias maintains backward compatibility.
Let's verify the interface compatibility of the new hook:
β Verification successful
Import change is safe and maintains interface compatibility
The verification confirms that:
useHydratedSession
is a drop-in replacement that internally usesnext-auth
'suseSession
- It maintains the same interface by returning the original session object
- It adds hydration optimization without breaking the
accessToken
access pattern - The hook properly handles the loading state and session updates
The implementation shows it's designed to be fully compatible while adding client-side performance improvements through hydration optimization.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify that useHydratedSession provides the same interface as next-auth's useSession
# Check the implementation of useHydratedSession
rg -A 10 "export.*useHydratedSession"
# Check all other usages to confirm consistent interface
rg "useHydratedSession.*session\?\.accessToken"
Length of output: 927
Script:
#!/bin/bash
# Let's verify the complete implementation and usage pattern
# Check the complete implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
# Check how useNextAuthSession is imported and used
rg "useNextAuthSession" keep-ui/shared/lib/hooks/useHydratedSession.tsx -A 2
# Check actual usage of accessToken in rules-table.tsx
rg "session.*accessToken" keep-ui/app/mapping/rules-table.tsx -A 2
Length of output: 1218
keep-ui/app/alerts/alert-dismiss-modal.tsx (1)
20-20
: LGTM: Import change aligns with performance objectives.
The replacement of useSession
with useHydratedSession
is consistent with the PR's goal of improving client-side request performance through session hydration.
keep-ui/entities/incidents/model/useIncidentActions.tsx (2)
Line range hint 71-75
: LGTM! Consistent session token usage across all API calls.
The session token handling is consistent and includes proper null safety checks via optional chaining.
Also applies to: 96-100, 134-138, 164-168, 186-190, 216-220
Line range hint 214-238
: Verify if confirmPredictedIncident
function is used.
The comment "Is it used?" suggests this function might be dead code. Let's verify its usage before considering removal.
keep-ui/app/alerts/alert-push-alert-to-server-modal.tsx (3)
Line range hint 1-214
: Implementation looks good!
The integration of useHydratedSession
is clean and well-contained. The change is focused on session management without affecting the component's core functionality. The rest of the alert pushing logic remains intact and properly integrated.
10-10
: Verify consistent usage of useHydratedSession across the codebase.
The import change aligns with the PR objectives for performance improvement. Let's verify this pattern is consistently applied across all components.
β Verification successful
Migration to useHydratedSession is consistently implemented across the codebase
The verification shows that:
- All components are correctly importing
useHydratedSession
with the aliasuseSession
from the shared hook - Only two files still use the original
useSession
from next-auth/react:- PostHogPageView.tsx (analytics component)
- alerts.tsx (which may need migration)
- The
useHydratedSession
implementation properly wraps the original next-auth session with hydration handling
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent usage of useHydratedSession across the codebase
# Check for any remaining direct imports of useSession from next-auth/react
echo "Checking for remaining next-auth/react useSession imports..."
rg "import.*useSession.*from ['\"]next-auth/react['\"]"
# Check for consistent usage of useHydratedSession
echo "Checking useHydratedSession import pattern..."
rg "import.*useHydratedSession.*from.*@/shared/lib/hooks/useHydratedSession"
Length of output: 42870
Script:
#!/bin/bash
# Let's check for all imports of useSession and useHydratedSession to verify the migration
echo "Checking all useSession imports..."
rg "import.*useSession.*from" -A 1
echo -e "\nChecking all useHydratedSession imports..."
rg "import.*useHydratedSession.*from" -A 1
echo -e "\nChecking implementation of useHydratedSession..."
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
Length of output: 33570
Line range hint 47-47
: Verify useHydratedSession interface compatibility.
The session usage pattern looks correct, but let's ensure useHydratedSession
provides the same interface as the original useSession
, particularly for the accessToken
property.
Also applies to: 82-86
β Verification successful
Based on the comprehensive analysis of the codebase, I can now provide a final response regarding the interface compatibility between useHydratedSession and useSession.
useHydratedSession provides full interface compatibility with useSession
The implementation shows that useHydratedSession is a wrapper around next-auth's useSession that maintains full interface compatibility:
-
It returns the same Session type defined in next-auth.d.ts which includes:
- user
- accessToken
- tenantId
- userRole
-
The hook is correctly aliased across the codebase as:
import { useHydratedSession as useSession } from "@/shared/lib/hooks/useHydratedSession"
- All components use the same session interface pattern:
const { data: session } = useSession()
session?.accessToken
The only enhancement is hydration handling for SSR, which doesn't affect the interface contract.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify useHydratedSession interface and implementation
# Check the implementation of useHydratedSession
echo "Checking useHydratedSession implementation..."
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for other usages of session.accessToken
echo "Checking session.accessToken usage patterns..."
rg "session\?\.accessToken" -A 2 -B 2
Length of output: 42870
Script:
#!/bin/bash
# Let's check the useHydratedSession implementation and its usage
echo "Checking useHydratedSession implementation and imports..."
ast-grep --pattern 'import { useHydratedSession } from $$$'
echo "\nChecking useSession implementation and imports..."
ast-grep --pattern 'import { useSession } from $$$'
echo "\nChecking useNextAuthSession usage..."
ast-grep --pattern 'const $$ = useNextAuthSession()'
echo "\nChecking session.data type definitions..."
rg "interface.*Session" -A 5
Length of output: 911
Script:
#!/bin/bash
# Let's check the actual implementation of useHydratedSession and its return type
echo "Checking useHydratedSession implementation..."
rg -A 10 "export function useHydratedSession"
echo "\nChecking where useHydratedSession is used..."
rg "useHydratedSession\(\)"
echo "\nChecking useSession imports and usage..."
rg "useSession" -A 2 -B 2
Length of output: 64188
keep-ui/app/workflows/builder/workflow-execution-results.tsx (2)
214-215
: LGTM!
The indentation changes in the template literal maintain code consistency.
10-10
: LGTM! Verify session hydration behavior.
The change from useSession
to useHydratedSession
aligns with the PR objectives to improve client-side request performance.
Let's verify the session hydration behavior:
β Verification successful
Session hook migration is consistent and well-implemented
The verification shows a clear and consistent pattern:
useHydratedSession
is properly imported and aliased asuseSession
across the codebase- Only 3 files still use direct
useSession
imports fromnext-auth/react
:PostHogPageView.tsx
: Analytics componentuseHydratedSession.tsx
: The hook implementation itselfalerts.tsx
: Legacy file
The change in workflow-execution-results.tsx
follows the established pattern and is part of a broader, systematic migration to improve client-side performance.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for consistent session hook usage across the codebase
# and verify no mixed usage of useSession and useHydratedSession
# Check for any remaining direct useSession imports
echo "Checking for remaining useSession imports..."
rg "import.*useSession.*from.*next-auth/react"
# Check for consistent usage of useHydratedSession
echo "Checking useHydratedSession usage pattern..."
rg "import.*useHydratedSession.*from.*@/shared/lib/hooks/useHydratedSession"
Length of output: 9800
keep-ui/utils/hooks/usePresets.ts (1)
3-3
: Verify the implementation of useHydratedSession
The switch to useHydratedSession
aligns with the PR objectives for performance improvement. However, we should verify its implementation to ensure it maintains the same interface as next-auth/react
's useSession
.
β Verification successful
Custom useHydratedSession hook maintains compatibility while improving performance
The implementation of useHydratedSession
is a proper wrapper around next-auth/react
's useSession
that:
- Maintains the same interface by returning the original session object
- Adds hydration optimization by using a cached session on first render
- Properly handles the loading state
- Preserves the session update functionality
The switch from direct useSession
to useHydratedSession
is safe as it's being consistently used across the codebase (60+ files) and provides a performance improvement without breaking changes.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for the implementation of useHydratedSession
ast-grep --pattern 'export const useHydratedSession = $_'
# Search for any direct usage of next-auth/react's useSession that might have been missed
rg "from 'next-auth/react'" -A 2
Length of output: 100
Script:
#!/bin/bash
# Let's try different search patterns and locations
# Search for useHydratedSession implementation with broader pattern
ast-grep --pattern 'useHydratedSession'
# Search for the file directly using fd
fd "useHydratedSession.ts"
# Search for any imports of useHydratedSession
rg "useHydratedSession"
# Search for next-auth usage with different quotes
rg "from \"next-auth/react\""
Length of output: 19768
Script:
#!/bin/bash
# Let's examine the implementation of useHydratedSession
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 794
keep-ui/app/alerts/alert-assign-ticket-modal.tsx (1)
7-7
: LGTM! Verify the custom hook implementation.
The import change aligns with the PR objectives to improve performance through hydrated sessions.
Let's verify the custom hook implementation:
β Verification successful
Import change is correctly implemented and consistently used
The useHydratedSession
hook is a well-implemented performance optimization that wraps next-auth/react
's useSession
. It provides hydration support by:
- Using the pre-rendered session data from
window.__NEXT_AUTH_SESSION__
on first render - Falling back to the original
useSession
behavior after hydration - Maintaining the same API interface as the original hook
The change is consistently applied across 40+ components in the codebase, all using the same import alias pattern.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation of useHydratedSession hook
# and ensure it's consistently used across the codebase
# Check the hook implementation
rg -A 10 "export.*useHydratedSession" "@/shared/lib/hooks/useHydratedSession"
# Verify consistent usage across components
rg "useHydratedSession.*useSession|useSession.*useHydratedSession" -g "*.tsx"
Length of output: 5981
Script:
#!/bin/bash
# Let's try to find the actual implementation using fd and rg
# First, find the correct path for the hook
fd "useHydratedSession" --type file
# Then look at its implementation
rg -A 10 "export.*useHydratedSession" --type tsx
Length of output: 162
Script:
#!/bin/bash
# Now that we found the correct path, let's examine the implementation
cat keep-ui/shared/lib/hooks/useHydratedSession.tsx
Length of output: 794
keep-ui/app/maintenance/create-or-update-maintenance-rule.tsx (1)
13-13
: LGTM: Session management improvement aligns with performance objectives.
The change from next-auth/react
's useSession
to useHydratedSession
aligns with the PR objective to improve client-side request performance through session hydration.
Let's verify that this component's session usage pattern is consistent with other components:
β Verification successful
LGTM: Session management improvement is consistently applied across the codebase
The change from next-auth/react
's useSession
to useHydratedSession
is part of a systematic improvement across the codebase. The verification shows that:
- The custom
useHydratedSession
hook is consistently used across multiple components and utilities - All session-related functionality is standardized through this single implementation
- The change in
create-or-update-maintenance-rule.tsx
follows the same pattern as other components
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for similar session usage patterns in other components
rg -A 2 "useHydratedSession" --type tsx
Length of output: 67
Script:
#!/bin/bash
# Search for similar session usage patterns with ripgrep
rg -A 2 "useHydratedSession"
# Also search for the file to verify its existence
fd "useHydratedSession"
Length of output: 21716
keep-ui/app/ai/ai.tsx (2)
4-4
: LGTM! Clean import change with backward compatibility.
The change from next-auth/react
to the custom useHydratedSession
hook aligns with the PR objectives. Good use of aliasing to minimize refactoring impact.
Line range hint 12-12
: Verify session structure compatibility.
Please ensure that the session structure from useHydratedSession
matches the original useSession
, particularly the data
property and accessToken
field.
β Verification successful
Based on the shell script results, I can see that the session structure is consistently used across the entire codebase. The pattern const { data: session } = useSession()
is used in numerous files, and session?.accessToken
is accessed in the same way throughout the codebase. This indicates that the session structure is standardized and compatible.
Session structure is consistent across the codebase.
- The destructuring pattern
const { data: session } = useSession()
is used consistently in over 60 files - The access pattern
session?.accessToken
is used uniformly across the codebase for API authentication - No variations or incompatible session structures were found
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for other session structure usages to verify compatibility
ast-grep --pattern 'const { data: $_ } = useSession()'
rg -A 2 'session\?\.accessToken'
Length of output: 31036
keep-ui/app/dashboard/[id]/dashboard.tsx (1)
16-16
: LGTM: Session hook replacement aligns with performance objectives.
The replacement of useSession
with useHydratedSession
while maintaining the same interface through aliasing is a clean approach that should improve client-side request performance.
keep-ui/app/extraction/extractions-table.tsx (2)
21-21
: LGTM: Import change aligns with performance objectives.
The change from next-auth/react
to useHydratedSession
aligns with the PR objective to improve client-side request performance.
Let's verify that this change is consistent across other components:
β Verification successful
Import change is consistent with codebase-wide migration
The verification shows that:
- The
useHydratedSession
hook is consistently used across 60+ components in the codebase - The file correctly uses the imported hook and session data
- Only a few specific components still use direct next-auth imports for specialized purposes (signin, signout, providers)
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for any remaining direct useSession imports from next-auth/react
# and verify consistent usage of useHydratedSession
# Check for any remaining direct useSession imports
echo "Checking for remaining direct useSession imports..."
rg "import.*useSession.*from ['\"]next-auth/react['\"]"
# Check for consistent usage of useHydratedSession
echo "Checking useHydratedSession usage..."
rg "import.*useHydratedSession.*from ['\"]@/shared/lib/hooks/useHydratedSession['\"]"
Length of output: 278
Script:
#!/bin/bash
# Let's try a different approach to verify the session usage patterns
# Check for any remaining direct useSession imports
echo "Direct useSession imports from next-auth/react:"
rg -l "from ['|\"]next-auth/react['|\"]" --type tsx --type ts
# Check for useHydratedSession usage
echo -e "\nHydrated session imports:"
rg -l "useHydratedSession" --type tsx --type ts
# Look for session token usage patterns
echo -e "\nSession token usage patterns:"
rg "session\?..*token" --type tsx --type ts
# Check for any Authorization header patterns
echo -e "\nAuthorization header patterns:"
rg "Authorization.*Bearer.*token" --type tsx --type ts
Length of output: 654
Script:
#!/bin/bash
# Let's try without file type restrictions since tsx/ts types aren't recognized
# Check for any remaining direct useSession imports
echo "Direct useSession imports from next-auth/react:"
rg "from ['\"]next-auth/react['\"]"
# Check for useHydratedSession usage
echo -e "\nHydrated session imports:"
rg "import.*useHydratedSession.*from ['\"]@/shared/lib/hooks/useHydratedSession['\"]"
# Look for session token usage patterns in the specific file
echo -e "\nChecking extractions-table.tsx usage:"
rg "useSession|session\." "keep-ui/app/extraction/extractions-table.tsx"
Length of output: 10665
Line range hint 156-175
: Verify error handling for session token usage.
The deleteExtraction
function uses the session token for authentication. While the implementation is correct, we should ensure proper error handling when the session token is undefined.
Let's verify the error handling in similar components:
keep-ui/app/extraction/create-or-update-extraction-rule.tsx (2)
16-16
: LGTM: Import change aligns with performance objectives.
The replacement of useSession
with useHydratedSession
(aliased as useSession
) aligns with the PR's objective to improve client-side request performance while maintaining backward compatibility.
16-16
: Verify hydrated session security implementation.
Since the session is used for API authentication, let's verify that the hydrated session implementation maintains proper security measures.
keep-ui/app/deduplication/DeduplicationTable.tsx (2)
28-28
: LGTM: Clean import change maintaining backward compatibility
The import change aligns with the PR objective of using hydrated sessions while maintaining the same hook name through aliasing, ensuring minimal code disruption.
Line range hint 77-89
: Verify hydrated session interface compatibility
The component relies on session?.accessToken
for authorization in the delete operation. Let's verify that the hydrated session maintains the same interface.
β Verification successful
Based on the shell script results, I can now generate the final response:
Session interface compatibility is maintained
The useHydratedSession
hook implementation in keep-ui/shared/lib/hooks/useHydratedSession.tsx
maintains interface compatibility by:
- Using
useNextAuthSession
internally - Returning either the hydrated session from
window.__NEXT_AUTH_SESSION__
or the original session - Preserving the session data structure including the
accessToken
property, as evidenced by its widespread usage across the codebase
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the session interface implementation
# Check if the useHydratedSession hook maintains the same interface as next-auth's useSession
# Search for the useHydratedSession implementation
echo "Searching for useHydratedSession implementation..."
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Search for accessToken usage patterns
echo "Checking accessToken usage patterns..."
rg -A 2 'session\?\.accessToken'
Length of output: 26728
keep-ui/app/mapping/create-or-edit-mapping.tsx (2)
Line range hint 40-40
: LGTM: Proper session token usage
The session token is correctly used for API authorization, maintaining secure access patterns.
Also applies to: 143-143, 171-171
20-20
: LGTM: Clean migration to useHydratedSession
The change aligns with the PR objective of using hydrated sessions for improved performance. The alias maintains backward compatibility while modernizing the implementation.
Let's verify the implementation of the new hook:
β Verification successful
Let me verify the implementation of useHydratedSession
with a corrected path:
Migration to useHydratedSession is correctly implemented
The verification shows that:
useHydratedSession
is properly implemented as a wrapper aroundnext-auth
's session hook with hydration support- The import change in
create-or-edit-mapping.tsx
follows the consistent pattern used across the codebase - Remaining
next-auth/react
imports are for different utilities (signIn
,signOut
,SessionProvider
, etc.) and not the session hook
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the implementation and usage of useHydratedSession
# Check the implementation of useHydratedSession
rg -A 10 "export.*useHydratedSession" "shared/lib/hooks/"
# Verify consistent usage across the codebase
rg "useHydratedSession|useSession.*next-auth"
Length of output: 9725
Script:
#!/bin/bash
# Check the implementation of useHydratedSession
rg -A 10 "export.*useHydratedSession" "keep-ui/shared/lib/hooks/useHydratedSession.tsx"
# Check if there are any remaining direct next-auth useSession imports
rg "from 'next-auth/react'" "keep-ui/"
Length of output: 442
Script:
#!/bin/bash
# Check the implementation with better context
rg -A 15 "useNextAuthSession" "keep-ui/shared/lib/hooks/useHydratedSession.tsx"
# Check remaining next-auth imports with quotes
rg "from \"next-auth/react\"" "keep-ui/"
Length of output: 1675
keep-ui/app/settings/auth/users-sidebar.tsx (2)
388-389
: LGTM! Improved code formatting
The indentation changes improve code readability while maintaining the same functionality.
22-22
: Verify session token handling with useHydratedSession
The change to useHydratedSession
aligns with the PR objective to improve performance. However, we should verify that the session token is properly handled in the API requests.
β Verification successful
Change to useHydratedSession is consistent with codebase patterns
The verification shows that:
- The
useHydratedSession
hook is consistently used across the codebase, with many components already using it with the same alias pattern. - The implementation in
keep-ui/shared/lib/hooks/useHydratedSession.tsx
properly wrapsnext-auth/react
'suseSession
while maintaining the same interface and token handling. - The session token is consistently used in Authorization headers throughout the application, and this change maintains that pattern.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify consistent session token usage across the codebase
# Check for any direct useSession imports that might have been missed
rg "import.*useSession.*from 'next-auth/react'" --type ts --type tsx
# Check for other API calls using session tokens to ensure consistent pattern
rg "Authorization.*Bearer.*session.*accessToken" --type ts --type tsx
Length of output: 204
Script:
#!/bin/bash
# Let's try different approaches to verify session token handling
# Check for useSession imports without file type restrictions
rg "import.*useSession.*from ['\"](next-auth/react|@/shared/lib/hooks/useHydratedSession)"
# Look for the implementation of useHydratedSession
fd "useHydratedSession" --exec cat {}
# Check for authorization header patterns without file type restrictions
rg "Authorization.*Bearer"
Length of output: 24086
keep-ui/app/settings/settings.client.tsx (3)
14-14
: LGTM: Import change aligns with PR objectives
The change to use useHydratedSession
while maintaining the useSession
alias is a good approach that minimizes code changes while achieving the performance improvement goal.
Line range hint 271-304
: LGTM: Permissions tab implementation follows established patterns
The new permissions tab implementation:
- Follows the same pattern as other tabs
- Properly handles feature flag control
- Provides mock data for disabled state
- Reuses common UI components
π§° Tools
πͺ Biome
[error] 269-270: Expected a JSX Expression, a Element, or a text but instead found '<<<<<<'.
Expected a JSX Expression, a Element, or a text here.
(parse)
[error] 270-271: Expected a JSX attribute but instead found '======='.
Expected a JSX attribute here.
(parse)
[error] 272-272: expected >
but instead found <
Remove <
(parse)
[error] 270-271: Expected corresponding JSX closing tag for 'HEAD'.
Opening tag
closing tag
(parse)
[error] 274-274: Unexpected token. Did you mean {'}'}
or }
?
(parse)
Line range hint 63-65
: LGTM: Improved user creation control
The addition of userCreationAllowed
prop with auth type-based control is a good improvement that:
- Properly restricts user creation based on authentication type
- Follows the pattern of prop-driven feature control
keep-ui/app/deduplication/DeduplicationSidebar.tsx (1)
27-27
: LGTM: Clean migration to hydrated session
The change to use useHydratedSession
while maintaining the useSession
alias is a good approach for backward compatibility.
keep-ui/app/workflows/workflows.client.tsx (2)
11-11
: Verify the import path and aliasing of useHydratedSession
.
Ensure that the module "@/shared/lib/hooks/useHydratedSession"
exists and exports useHydratedSession
correctly. Additionally, confirm that aliasing it as useSession
doesn't conflict with other imports or usage in the codebase.
Line range hint 31-34
: Ensure the API correctly interprets boolean query parameters.
When constructing the API URL with is_v2=${isSwitchOn}
, the boolean isSwitchOn
is converted to the string "true"
or "false"
. Verify that the backend API correctly handles these string values. If the API expects numerical values like 1
or 0
, consider converting the boolean accordingly.
Apply this diff if needed:
-? `${apiUrl}/workflows?is_v2=${isSwitchOn}`
+? `${apiUrl}/workflows?is_v2=${isSwitchOn ? 1 : 0}`
keep-ui/app/workflows/workflow-tile.tsx (1)
Line range hint 400-403
: Verify image error handling in handleImageError
In the handleImageError
function, assigning event.target.href.baseVal = "/icons/keep-icon.png";
may not correctly update the image source. To handle image load errors in React, you might need to set event.target.src
. Verify that the error handling updates the image source as intended.
keep-ui/app/providers/provider-form.tsx (1)
5-5
: Approved: Replacing useSession
with useHydratedSession
The import statement correctly replaces the built-in useSession
with useHydratedSession
as per the PR objectives.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
π§Ή Outside diff range and nitpick comments (2)
keep-ui/shared/ui/PostHogPageView.tsx (1)
8-8
: Add a comment explaining the alias usageConsider adding a comment explaining why we're aliasing
useHydratedSession
asuseSession
to help future maintainers understand the intention.-import { useHydratedSession as useSession } from "../lib/hooks/useHydratedSession"; +// Aliased to maintain consistency with existing session usage patterns while using the hydrated version +import { useHydratedSession as useSession } from "../lib/hooks/useHydratedSession";keep-ui/app/alerts/alerts.tsx (1)
Based on the shell script results, I can now generate the final response:
Remove commented code and update remaining useMounted usage
The new
useHydratedSession
pattern is consistently used across the codebase with 60+ files already following this pattern. However:
- There is still one remaining
useMounted
import inkeep-ui/components/navbar/AlertsLinks.tsx
that should be updated to useuseHydratedSession
- The commented-out
useMounted
code in the current file should be removedπ Analysis chain
Line range hint
89-91
: Improve code cleanliness and verify consistent usage.The new loading state handling using
sessionStatus
is more robust than the previousisMounted
approach. However, there are a few suggestions:
- Remove the commented-out code
// const isMounted = useMounted();
as it's no longer needed.- Ensure this pattern is consistently applied across other components.
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Verify consistent usage of useHydratedSession across components # Check for any remaining useMounted imports echo "Checking for remaining useMounted imports..." rg "import.*useMounted.*from" # Check for consistent usage pattern of useHydratedSession echo "Checking useHydratedSession usage pattern..." rg "useHydratedSession.*as.*useSession" # Look for potentially inconsistent loading state patterns echo "Checking loading state patterns..." ast-grep --pattern 'const { status: $_ } = useSession()' -A 3Length of output: 10231
π Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
π Files selected for processing (3)
keep-ui/app/alerts/alerts.tsx
(1 hunks)keep-ui/app/settings/settings.client.tsx
(2 hunks)keep-ui/shared/ui/PostHogPageView.tsx
(1 hunks)
π§ Files skipped from review as they are similar to previous changes (1)
- keep-ui/app/settings/settings.client.tsx
π Additional comments (2)
keep-ui/shared/ui/PostHogPageView.tsx (1)
8-8
: Verify session structure compatibility
The change from next-auth/react
to useHydratedSession
looks good. However, let's verify that the session structure remains compatible to ensure PostHog analytics continue to work correctly.
β Verification successful
Session structure compatibility verified
The change from next-auth/react
to useHydratedSession
is safe because:
useHydratedSession
internally usesnext-auth
's session and maintains the same structure- It returns either the hydrated session from
window.__NEXT_AUTH_SESSION__
or the original session - The session.user.email pattern is consistently used across the codebase
- The component's usage of
{ data: session }
destructuring remains compatible
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Verify the session structure in useHydratedSession matches next-auth's useSession
# Check the implementation of useHydratedSession
ast-grep --pattern 'export function useHydratedSession() {
$$$
}'
# Check for other components using the session.user.email pattern
rg 'session.*\.user\.email' -t typescript -t tsx
Length of output: 1862
Script:
#!/bin/bash
# Let's verify the session structure and usage with a more comprehensive check
# Check how useNextAuthSession is imported and used
ast-grep --pattern 'import { $_ as useNextAuthSession } from $_;'
# Check the usage of session.user.email with proper file type
rg 'session.*\.user\.email' --type-add 'ts:*.{ts,tsx}' -t ts
# Check PostHogPageView implementation to see how session is used
rg -A 5 'useSession' keep-ui/shared/ui/PostHogPageView.tsx
Length of output: 981
keep-ui/app/alerts/alerts.tsx (1)
21-21
: LGTM! Clean import replacement.
The change from useMounted
to useHydratedSession
(aliased as useSession
) aligns with the PR's performance improvement objectives.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
π§Ή Outside diff range and nitpick comments (2)
keep/api/models/db/migrations/versions/2024-11-08-20-58_895fe80117aa.py (2)
9-9
: Remove unused importThe
datetime
import is not used in this migration file.-from datetime import datetime
π§° Tools
πͺ Ruff
9-9:
datetime.datetime
imported but unusedRemove unused import:
datetime.datetime
(F401)
Line range hint
20-33
: Consider data integrity improvementsThe current implementation has potential data consistency concerns:
- The
timestamp
column being nullable without a default value could lead to inconsistent data tracking- The
provider_type
column lacks value constraints or validationConsider these improvements:
- Add a default value for
timestamp
:"timestamp", sa.DateTime(), -nullable=True, +nullable=False, +server_default=sa.text('CURRENT_TIMESTAMP'),
- If possible, define an enum or check constraint for
provider_type
to ensure valid values:# Add after the current columns op.create_check_constraint( "valid_provider_types", "alertraw", "provider_type IN ('type1', 'type2', ...)" # list valid types )
π Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
π Files selected for processing (4)
keep-ui/app/alerts/alerts.tsx
(1 hunks)keep-ui/app/dashboard/[id]/dashboard.tsx
(5 hunks)keep-ui/utils/hooks/useDashboardPresets.ts
(2 hunks)keep/api/models/db/migrations/versions/2024-11-08-20-58_895fe80117aa.py
(2 hunks)
π§ Files skipped from review as they are similar to previous changes (3)
- keep-ui/app/alerts/alerts.tsx
- keep-ui/app/dashboard/[id]/dashboard.tsx
- keep-ui/utils/hooks/useDashboardPresets.ts
π§° Additional context used
πͺ Ruff
keep/api/models/db/migrations/versions/2024-11-08-20-58_895fe80117aa.py
9-9: datetime.datetime
imported but unused
Remove unused import: datetime.datetime
(F401)
π Additional comments (2)
keep/api/models/db/migrations/versions/2024-11-08-20-58_895fe80117aa.py (2)
Line range hint 36-40
: LGTM! Clean downgrade implementation
The downgrade operation correctly removes the columns in the appropriate order.
π§° Tools
πͺ Ruff
9-9: datetime.datetime
imported but unused
Remove unused import: datetime.datetime
(F401)
Line range hint 20-40
: Verify impact on existing data
Since this migration adds nullable columns to an existing table, let's verify the table's current state and content.
β Verification successful
Migration is safe to proceed
The migration is safe because:
- The
alertraw
table was initially created in the first migration with only basic columns (id
,tenant_id
,raw_alert
) - The new columns being added (
timestamp
andprovider_type
) are both nullable, which means existing records won't be affected - These columns already exist in the current model definition (
AlertRaw
class), ensuring alignment between the model and database schema
π Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for existing table and data that might be affected
# Search for previous migrations or schema definitions related to the alertraw table
rg -l "alertraw" --type py
# Look for table usage in the codebase
ast-grep --pattern 'Table("alertraw"'
Length of output: 210
Script:
#!/bin/bash
# Let's examine the previous migration to understand the table's history
cat keep/api/models/db/migrations/versions/2024-07-11-17-10_54c1252b2c8a.py
# Also search for the model definition to understand the full schema
rg "class AlertRaw" -A 10
Length of output: 21283
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
not sure I fully understand how it works but I trust you!
Closes #2406
π Description
β Checks
βΉ Additional Information
Summary by CodeRabbit
Release Notes
New Features
useHydratedSession
hook across multiple components, enhancing how session data is accessed and managed.Bug Fixes
Documentation
Style