@@ -59,8 +59,10 @@ const EditProfileScreen = () => {
5959 const [ bannerUrl , setBannerUrl ] = useState < string | null > ( user ?. bannerUrl || null ) ;
6060 const [ isEditingBanner , setIsEditingBanner ] = useState < boolean > ( false ) ;
6161 const [ menuVisible , setMenuVisible ] = useState < boolean > ( false ) ;
62+ const [ warningMenuVisible , setWarningMenuVisible ] = useState < boolean > ( false ) ;
6263
6364 const [ formDataChanged , setFormDataChanged ] = useState < boolean > ( false ) ;
65+ const [ canNavigateAway , setCanNavigateAway ] = useState < boolean > ( false ) ;
6466
6567 const [ formData , setFormData ] = useState ( {
6668 displayName : user ?. displayName || '' ,
@@ -268,6 +270,7 @@ const EditProfileScreen = () => {
268270 variant = "ghost-default"
269271 size = "md"
270272 onPress = { ( ) => {
273+ setCanNavigateAway ( true ) ;
271274 handleFormSubmit ( ) ;
272275 } }
273276 disabled = { isSaveDisabled }
@@ -277,16 +280,17 @@ const EditProfileScreen = () => {
277280 } ) ;
278281 } , [ navigation , handleFormSubmit , formData , isSaveDisabled ] ) ;
279282
283+ // warn user when navigating away with unsaved changes
280284 useEffect ( ( ) => {
281285 const unsubscribe = navigation . addListener ( 'beforeRemove' , ( e ) => {
282- if ( ! formDataChanged ) return ;
286+ if ( canNavigateAway || ! formDataChanged ) return ;
283287
284288 e . preventDefault ( ) ;
285289 // Show warning modal
286- setMenuVisible ( true ) ;
290+ setWarningMenuVisible ( true ) ;
287291 } ) ;
288292 return unsubscribe ;
289- } , [ navigation , formDataChanged ] ) ;
293+ } , [ navigation , formDataChanged , canNavigateAway ] ) ;
290294
291295 if ( isLoading ) {
292296 return (
@@ -436,11 +440,11 @@ const EditProfileScreen = () => {
436440 { /* show warning modal when navigating away with unsaved changes */ }
437441 < Modal
438442 transparent
439- visible = { menuVisible }
443+ visible = { warningMenuVisible }
440444 animationType = "fade"
441- onRequestClose = { ( ) => setMenuVisible ( false ) }
445+ onRequestClose = { ( ) => setWarningMenuVisible ( false ) }
442446 >
443- < Pressable onPress = { ( ) => setMenuVisible ( false ) } style = { styles . overlay } >
447+ < Pressable onPress = { ( ) => setWarningMenuVisible ( false ) } style = { styles . overlay } >
444448 < View style = { [ styles . dropdown , styles . dropDownWarning ] } >
445449 < Text
446450 className = "text-bold text-lg my-2"
@@ -453,7 +457,7 @@ const EditProfileScreen = () => {
453457 < Pressable
454458 style = { styles . dropdownItem }
455459 onPress = { ( ) => {
456- setMenuVisible ( false ) ;
460+ setWarningMenuVisible ( false ) ;
457461 } }
458462 >
459463 < Text style = { [ styles . dropdownText , styles . dropdownWarningText ] } > Cancel</ Text >
@@ -462,7 +466,11 @@ const EditProfileScreen = () => {
462466 < Pressable
463467 style = { styles . dropdownItem }
464468 onPress = { ( ) => {
465- navigation . goBack ( ) ;
469+ setWarningMenuVisible ( false ) ;
470+ setCanNavigateAway ( true ) ;
471+ setTimeout ( ( ) => {
472+ navigation . goBack ( ) ;
473+ } , 100 ) ;
466474 } }
467475 >
468476 < Text style = { [ styles . dropdownText , styles . dropdownWarningText ] } > Discard</ Text >
0 commit comments