From b97a283ea3835329de078e59c8ccfa9d3504ad06 Mon Sep 17 00:00:00 2001 From: chihlasm Date: Sat, 14 Feb 2026 16:28:43 -0500 Subject: [PATCH] fix: address code review issues in session sharing - Add useCallback for loadShares in ShareSessionModal (React hook deps) - Use TreeStructure type instead of Record for type safety - Fix login redirect format to match LoginPage's expected state shape Co-Authored-By: Claude Opus 4.6 --- .../components/session/ShareSessionModal.tsx | 32 +++++++++---------- .../session/SharedSessionTreePreview.tsx | 3 +- frontend/src/pages/SharedSessionPage.tsx | 4 +-- frontend/src/types/session.ts | 2 +- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/frontend/src/components/session/ShareSessionModal.tsx b/frontend/src/components/session/ShareSessionModal.tsx index 89f9501e..0adf3298 100644 --- a/frontend/src/components/session/ShareSessionModal.tsx +++ b/frontend/src/components/session/ShareSessionModal.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect } from 'react' +import { useState, useEffect, useCallback } from 'react' import { X, Copy, Check, Globe, Users, Clock, Trash2, Link2 } from 'lucide-react' import type { SessionShare, SessionShareVisibility } from '@/types' import { sessionsApi } from '@/api/sessions' @@ -82,20 +82,7 @@ export function ShareSessionModal({ sessionId, sessionLabel, isOpen, onClose }: const [customDatetime, setCustomDatetime] = useState('') const [visibilityError, setVisibilityError] = useState(null) - useEffect(() => { - if (isOpen) { - loadShares() - // Reset form state - setVisibility('account') - setShareName('') - setExpirationPreset('never') - setCustomDatetime('') - setVisibilityError(null) - setCopiedShareId(null) - } - }, [isOpen, sessionId]) - - const loadShares = async () => { + const loadShares = useCallback(async () => { setIsLoadingShares(true) try { const allShares = await sessionsApi.listMyShares() @@ -108,7 +95,20 @@ export function ShareSessionModal({ sessionId, sessionLabel, isOpen, onClose }: } finally { setIsLoadingShares(false) } - } + }, [sessionId]) + + useEffect(() => { + if (isOpen) { + loadShares() + // Reset form state + setVisibility('account') + setShareName('') + setExpirationPreset('never') + setCustomDatetime('') + setVisibilityError(null) + setCopiedShareId(null) + } + }, [isOpen, sessionId, loadShares]) const handleGenerateLink = async () => { setIsGenerating(true) diff --git a/frontend/src/components/session/SharedSessionTreePreview.tsx b/frontend/src/components/session/SharedSessionTreePreview.tsx index 0f6a3123..1bbb0dbc 100644 --- a/frontend/src/components/session/SharedSessionTreePreview.tsx +++ b/frontend/src/components/session/SharedSessionTreePreview.tsx @@ -1,7 +1,8 @@ +import type { TreeStructure } from '@/types' import { cn } from '@/lib/utils' interface SharedSessionTreePreviewProps { - treeStructure: Record + treeStructure: TreeStructure pathTaken: string[] } diff --git a/frontend/src/pages/SharedSessionPage.tsx b/frontend/src/pages/SharedSessionPage.tsx index 252d94e2..1d81187b 100644 --- a/frontend/src/pages/SharedSessionPage.tsx +++ b/frontend/src/pages/SharedSessionPage.tsx @@ -97,7 +97,7 @@ export function SharedSessionPage() { const status = err.response?.status if (status === 401) { navigate('/login', { - state: { from: `/share/${shareToken}` }, + state: { from: { pathname: `/share/${shareToken}` } }, replace: true, }) return @@ -232,7 +232,7 @@ export function SharedSessionPage() {
+ tree_structure: TreeStructure path_taken: string[] decisions: DecisionRecord[] custom_steps: CustomStep[]