@@ -38,8 +38,29 @@ export function FeedsPage() {
3838 const [ isRefreshing , setIsRefreshing ] = useState ( false ) ;
3939 const [ articleCounts , setArticleCounts ] = useState < Record < string , { total : number ; unread : number ; starred : number } > > ( { } ) ;
4040 const [ isBottomBarVisible , setIsBottomBarVisible ] = useState ( true ) ;
41+ const [ sharedFeedUrl , setSharedFeedUrl ] = useState ( '' ) ;
4142 const lastScrollY = useRef ( 0 ) ;
4243
44+ // Handle PWA shortcuts (?action=add-feed) and Web Share Target (?url=... or ?text=...)
45+ useEffect ( ( ) => {
46+ const params = new URLSearchParams ( window . location . search ) ;
47+ const action = params . get ( 'action' ) ;
48+ const sharedUrl = params . get ( 'url' ) || params . get ( 'text' ) ;
49+
50+ if ( action === 'add-feed' ) {
51+ openAddFeedDialog ( ) ;
52+ } else if ( sharedUrl ) {
53+ // If the param is plain text with an embedded URL, extract it
54+ let feedUrl = sharedUrl ;
55+ if ( ! / ^ h t t p s ? : \/ \/ / i. test ( feedUrl ) ) {
56+ const match = sharedUrl . match ( / h t t p s ? : \/ \/ [ ^ \s ] + / i) ;
57+ feedUrl = match ? match [ 0 ] : sharedUrl ;
58+ }
59+ setSharedFeedUrl ( feedUrl ) ;
60+ openAddFeedDialog ( ) ;
61+ }
62+ } , [ openAddFeedDialog ] ) ;
63+
4364 // Load feeds, categories and start auto-refresh on mount
4465 useEffect ( ( ) => {
4566 let cancelled = false ;
@@ -327,7 +348,11 @@ export function FeedsPage() {
327348 </ div >
328349
329350 { /* Add Feed Dialog */ }
330- < AddFeedDialog isOpen = { isAddFeedDialogOpen } onClose = { closeAddFeedDialog } />
351+ < AddFeedDialog
352+ isOpen = { isAddFeedDialogOpen }
353+ onClose = { ( ) => { closeAddFeedDialog ( ) ; setSharedFeedUrl ( '' ) ; } }
354+ initialUrl = { sharedFeedUrl }
355+ />
331356 </ div >
332357 ) ;
333358}
0 commit comments