@ -61,6 +61,7 @@ const GroupDetailPage = () => {
const [ isTyping , setIsTyping ] = useState ( false ) ;
const [ isTyping , setIsTyping ] = useState ( false ) ;
const [ showInviteForm , setShowInviteForm ] = useState ( false ) ;
const [ showInviteForm , setShowInviteForm ] = useState ( false ) ;
const [ userFirstName , setUserFirstName ] = useState < string > ( ) ;
const [ userFirstName , setUserFirstName ] = useState < string > ( ) ;
const [ selectedContact , setSelectedContact ] = useState < { name : string ; email : string } | undefined > ( ) ;
useEffect ( ( ) = > {
useEffect ( ( ) = > {
const loadGroupData = async ( ) = > {
const loadGroupData = async ( ) = > {
@ -73,7 +74,6 @@ const GroupDetailPage = () => {
// Check if this is user's first visit to this group or came from invitation
// Check if this is user's first visit to this group or came from invitation
const hasVisitedKey = ` hasVisited_group_ ${ groupId } ` ;
const hasVisitedKey = ` hasVisited_group_ ${ groupId } ` ;
const hasVisited = localStorage . getItem ( hasVisitedKey ) ;
const fromInvite = searchParams . get ( 'fromInvite' ) === 'true' ;
const fromInvite = searchParams . get ( 'fromInvite' ) === 'true' ;
const newMember = searchParams . get ( 'newMember' ) === 'true' ;
const newMember = searchParams . get ( 'newMember' ) === 'true' ;
@ -82,8 +82,26 @@ const GroupDetailPage = () => {
if ( firstName ) {
if ( firstName ) {
setUserFirstName ( firstName ) ;
setUserFirstName ( firstName ) ;
}
}
// Handle returning from contact selection
const selectedContactName = searchParams . get ( 'selectedContactName' ) ;
const selectedContactEmail = searchParams . get ( 'selectedContactEmail' ) ;
if ( selectedContactName && selectedContactEmail ) {
setSelectedContact ( {
name : selectedContactName ,
email : selectedContactEmail
} ) ;
setShowInviteForm ( true ) ;
// Clean up selection parameters
const newSearchParams = new URLSearchParams ( searchParams ) ;
newSearchParams . delete ( 'selectedContactName' ) ;
newSearchParams . delete ( 'selectedContactEmail' ) ;
setSearchParams ( newSearchParams ) ;
}
if ( ( ! hasVisited || fromInvite || newMember ) && groupData ) {
// Only show AI assistant automatically for new users who just joined from an invitation
if ( ( fromInvite || newMember ) && groupData ) {
// Mark as visited and open AI assistant directly
// Mark as visited and open AI assistant directly
localStorage . setItem ( hasVisitedKey , 'true' ) ;
localStorage . setItem ( hasVisitedKey , 'true' ) ;
setTimeout ( ( ) = > setShowAIAssistant ( true ) , 1000 ) ; // Small delay for better UX
setTimeout ( ( ) = > setShowAIAssistant ( true ) , 1000 ) ; // Small delay for better UX
@ -187,6 +205,12 @@ const GroupDetailPage = () => {
navigate ( ` /invite? ${ inviteParams . toString ( ) } ` ) ;
navigate ( ` /invite? ${ inviteParams . toString ( ) } ` ) ;
} ;
} ;
const handleSelectFromNetwork = ( ) = > {
// Navigate to contacts page with selection mode and return context
setShowInviteForm ( false ) ;
navigate ( ` /contacts?mode=select&returnTo=group-invite&groupId= ${ groupId } ` ) ;
} ;
const handleStartAIAssistant = ( prompt? : string ) = > {
const handleStartAIAssistant = ( prompt? : string ) = > {
setInitialPrompt ( prompt ) ;
setInitialPrompt ( prompt ) ;
setShowAIAssistant ( true ) ;
setShowAIAssistant ( true ) ;
@ -916,9 +940,14 @@ const GroupDetailPage = () => {
{ group && (
{ group && (
< InviteForm
< InviteForm
open = { showInviteForm }
open = { showInviteForm }
onClose = { ( ) = > setShowInviteForm ( false ) }
onClose = { ( ) = > {
setShowInviteForm ( false ) ;
setSelectedContact ( undefined ) ;
} }
onSubmit = { handleInviteSubmit }
onSubmit = { handleInviteSubmit }
onSelectFromNetwork = { handleSelectFromNetwork }
group = { group }
group = { group }
prefilledContact = { selectedContact }
/ >
/ >
) }
) }
< / Box >
< / Box >