11import React , { useState , useMemo , useCallback } from 'react'
2+ import { observer } from 'mobx-react-lite'
23import {
34 View ,
45 Text ,
@@ -17,6 +18,8 @@ import { useTheme } from '@/context/theme/ThemeContext'
1718import { useWallet } from '@/context/WalletContext'
1819import { useBrowserMode } from '@/context/BrowserModeContext'
1920import { useTranslation } from 'react-i18next'
21+ import bookmarkStore from '@/stores/BookmarkStore'
22+ import tabStore from '@/stores/TabStore'
2023
2124interface App {
2225 domain : string
@@ -33,6 +36,7 @@ interface RecommendedAppsProps {
3336 onRemoveBookmark ?: ( url : string ) => void
3437 onRemoveDefaultApp ?: ( url : string ) => void
3538 removedDefaultApps ?: string [ ]
39+ onCloseModal ?: ( ) => void // Handler to close the modal
3640 // Homepage customization props
3741 homepageSettings ?: {
3842 showBookmarks : boolean
@@ -74,7 +78,7 @@ const defaultApps: App[] = [
7478/* RECOMMENDED APPS COMPONENT */
7579/* -------------------------------------------------------------------------- */
7680
77- export const RecommendedApps = ( {
81+ export const RecommendedApps = observer ( ( {
7882 setStartingUrl,
7983 includeBookmarks = [ ] ,
8084 hideHeader = false ,
@@ -83,6 +87,7 @@ export const RecommendedApps = ({
8387 onRemoveBookmark,
8488 onRemoveDefaultApp,
8589 removedDefaultApps = [ ] ,
90+ onCloseModal,
8691 homepageSettings,
8792 onUpdateHomepageSettings
8893} : RecommendedAppsProps ) => {
@@ -92,7 +97,7 @@ export const RecommendedApps = ({
9297 const { t } = useTranslation ( )
9398 const [ searchQuery , setSearchQuery ] = useState ( '' )
9499 const [ showCustomizeModal , setShowCustomizeModal ] = useState ( false )
95- const [ isDesktopView , setIsDesktopView ] = useState ( false )
100+ const [ bookmarkRefresh , setBookmarkRefresh ] = useState ( 0 )
96101
97102 // Context menu state
98103 const [ contextMenuVisible , setContextMenuVisible ] = useState ( false )
@@ -140,6 +145,21 @@ export const RecommendedApps = ({
140145 setSelectedApp ( null )
141146 } , [ ] )
142147
148+ const handleAddBookmark = useCallback ( ( ) => {
149+ const activeTab = tabStore . activeTab
150+ if ( activeTab && activeTab . url && activeTab . url !== 'about:blank' && ! activeTab . url . includes ( 'metanet://' ) ) {
151+ const title = activeTab . title || activeTab . url
152+ bookmarkStore . addBookmark ( title , activeTab . url )
153+ // Close the modal after adding bookmark
154+ if ( onCloseModal ) {
155+ // Use setTimeout to ensure the bookmark is added first, then close
156+ setTimeout ( ( ) => {
157+ onCloseModal ( )
158+ } , 100 )
159+ }
160+ }
161+ } , [ onCloseModal ] )
162+
143163 /* -------------------------- prepare separate data sources -------------------------- */
144164 const filteredDefaultApps = useMemo ( ( ) => {
145165 if ( showOnlyBookmarks ) return [ ]
@@ -160,7 +180,11 @@ export const RecommendedApps = ({
160180 } , [ recentApps , showOnlyBookmarks , homepageSettings , isWeb2Mode ] )
161181
162182 const processedBookmarks = useMemo ( ( ) => {
163- const bookmarks = includeBookmarks . map ( bm => ( {
183+ // Always use bookmarks directly from the store to ensure reactivity
184+ // This ensures the component updates when bookmarks are added/removed
185+ const storeBookmarks = bookmarkStore . bookmarks || [ ]
186+ console . log ( 'Processing bookmarks, count:' , storeBookmarks . length )
187+ const bookmarks = storeBookmarks . map ( bm => ( {
164188 domain : bm . url ,
165189 appName : bm . title || bm . url ,
166190 appIconImageUrl : `${ bm . url . replace ( / \/ $ / , '' ) } /favicon.ico`
@@ -172,7 +196,7 @@ export const RecommendedApps = ({
172196 }
173197
174198 return bookmarks
175- } , [ includeBookmarks , showOnlyBookmarks , limitBookmarks ] )
199+ } , [ bookmarkStore . bookmarks , showOnlyBookmarks , limitBookmarks , bookmarkRefresh ] )
176200
177201 // Combined for search functionality
178202 const allApps = useMemo ( ( ) => {
@@ -242,6 +266,9 @@ export const RecommendedApps = ({
242266
243267 return (
244268 < View style = { [ componentStyles . container , { backgroundColor : colors . paperBackground } ] } >
269+
270+ { /* Removed Add Bookmark button from top - now at bottom */ }
271+
245272 { showOnlyBookmarks && (
246273 < View style = { componentStyles . searchContainer } >
247274 < TextInput
@@ -344,6 +371,20 @@ export const RecommendedApps = ({
344371 ) }
345372 </ ScrollView >
346373
374+ { /* Add Bookmark Button - Only show in bookmark modal */ }
375+ { showOnlyBookmarks && (
376+ < View style = { componentStyles . addBookmarkSection } >
377+ < TouchableOpacity
378+ style = { [ componentStyles . addBookmarkButton , { backgroundColor : colors . primary } ] }
379+ onPress = { handleAddBookmark }
380+ activeOpacity = { 0.7 }
381+ >
382+ < Ionicons name = "bookmark-outline" size = { 20 } color = { colors . background } />
383+ < Text style = { [ componentStyles . addBookmarkText , { color : colors . background } ] } > { t ( 'add_bookmark' ) } </ Text >
384+ </ TouchableOpacity >
385+ </ View >
386+ ) }
387+
347388 { /* Customize Homepage Modal */ }
348389 { showCustomizeModal && homepageSettings && onUpdateHomepageSettings && (
349390 < Modal
@@ -490,7 +531,7 @@ export const RecommendedApps = ({
490531 ) }
491532 </ View >
492533 )
493- }
534+ } )
494535
495536/* -------------------------------------------------------------------------- */
496537/* CSS */
@@ -683,5 +724,23 @@ const componentStyles = StyleSheet.create({
683724 backgroundColor : 'rgba(0,0,0,1)' ,
684725 justifyContent : 'center' ,
685726 alignItems : 'center'
727+ } ,
728+ addBookmarkSection : {
729+ padding : 16 ,
730+ paddingBottom : 36 ,
731+ borderTopWidth : StyleSheet . hairlineWidth ,
732+ borderTopColor : 'rgba(0,0,0,0.1)'
733+ } ,
734+ addBookmarkButton : {
735+ flexDirection : 'row' ,
736+ alignItems : 'center' ,
737+ justifyContent : 'center' ,
738+ padding : 16 ,
739+ borderRadius : 8 ,
740+ gap : 8
741+ } ,
742+ addBookmarkText : {
743+ fontSize : 16 ,
744+ fontWeight : '600'
686745 }
687746} )
0 commit comments