feat: Enable text selection and improve bookmark error handling
- Enable text selection and copy functionality in article WebView - Add CSS properties for proper text selection on iOS devices - Preserve bookmark data during reload errors for better UX - Update documentation with new offline sync features - Restructure changelog with planned version roadmap Users can now select and copy text from articles, and bookmark lists remain visible even when refresh operations fail.
This commit is contained in:
parent
76bc28ae02
commit
fd50f28628
14
CHANGELOG.md
14
CHANGELOG.md
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
All changes to this project will be documented in this file.
|
All changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 1.0.0
|
## Planned for Version 1.0.0
|
||||||
|
|
||||||
**Initial release:**
|
**Initial release:**
|
||||||
- Browse and manage bookmarks (All, Unread, Favorites, Archive, Article, Videos, Pictures)
|
- Browse and manage bookmarks (All, Unread, Favorites, Archive, Article, Videos, Pictures)
|
||||||
@ -15,11 +15,13 @@ All changes to this project will be documented in this file.
|
|||||||
- Search functionality
|
- Search functionality
|
||||||
- Support for tags
|
- Support for tags
|
||||||
- Support for reading progress
|
- Support for reading progress
|
||||||
|
- Save bookmarks when server is unavailable and sync when reconnected
|
||||||
|
|
||||||
|
## Planned for Version 1.1.0
|
||||||
|
|
||||||
## [Unreleased]
|
|
||||||
### Planned Features
|
|
||||||
- [ ] Add support for bookmark filtering and sorting options
|
- [ ] Add support for bookmark filtering and sorting options
|
||||||
- [ ] Offline sync with Core Data
|
- [ ] Add support for collection management
|
||||||
- [ ] Add support for collection management
|
|
||||||
- [ ] Add offline sync capabilities
|
|
||||||
- [ ] Add support for custom themes
|
- [ ] Add support for custom themes
|
||||||
|
- [ ] Text highlighting of selected text in a article
|
||||||
|
- [ ] Multiple selection of bookmarks for bulk actions
|
||||||
|
|
||||||
|
|||||||
@ -48,6 +48,9 @@
|
|||||||
},
|
},
|
||||||
"%lld min" : {
|
"%lld min" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"%lld minutes" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"%lld." : {
|
"%lld." : {
|
||||||
|
|
||||||
@ -99,6 +102,12 @@
|
|||||||
},
|
},
|
||||||
"Are you sure you want to log out? This will delete all your login credentials and return you to setup." : {
|
"Are you sure you want to log out? This will delete all your login credentials and return you to setup." : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Automatic sync" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Automatically mark articles as read" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Available tags" : {
|
"Available tags" : {
|
||||||
|
|
||||||
@ -111,6 +120,9 @@
|
|||||||
},
|
},
|
||||||
"Changes take effect immediately. Lower log levels include higher ones (Debug includes all, Critical includes only critical messages)." : {
|
"Changes take effect immediately. Lower log levels include higher ones (Debug includes all, Critical includes only critical messages)." : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Clear cache" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Close" : {
|
"Close" : {
|
||||||
|
|
||||||
@ -120,6 +132,9 @@
|
|||||||
},
|
},
|
||||||
"Critical" : {
|
"Critical" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Data Management" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Debug" : {
|
"Debug" : {
|
||||||
|
|
||||||
@ -258,6 +273,9 @@
|
|||||||
},
|
},
|
||||||
"OK" : {
|
"OK" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Open external links in in-app Safari" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Optional: Custom title" : {
|
"Optional: Custom title" : {
|
||||||
|
|
||||||
@ -301,12 +319,18 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"Reading Settings" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Remove" : {
|
"Remove" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Reset" : {
|
"Reset" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Reset settings" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Reset to Defaults" : {
|
"Reset to Defaults" : {
|
||||||
|
|
||||||
@ -316,6 +340,9 @@
|
|||||||
},
|
},
|
||||||
"Resume listening" : {
|
"Resume listening" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Safari Reader Mode" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Save bookmark" : {
|
"Save bookmark" : {
|
||||||
|
|
||||||
@ -364,6 +391,12 @@
|
|||||||
},
|
},
|
||||||
"Speed" : {
|
"Speed" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Sync interval" : {
|
||||||
|
|
||||||
|
},
|
||||||
|
"Sync Settings" : {
|
||||||
|
|
||||||
},
|
},
|
||||||
"Syncing with server..." : {
|
"Syncing with server..." : {
|
||||||
|
|
||||||
|
|||||||
@ -45,6 +45,7 @@ If you are interested in joining the internal beta, please contact me directly a
|
|||||||
- Article View with Reading Time and Word Count
|
- Article View with Reading Time and Word Count
|
||||||
- Search functionality
|
- Search functionality
|
||||||
- Support for reading progress
|
- Support for reading progress
|
||||||
|
- Save bookmarks when server is unavailable and sync when reconnected
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
|
|||||||
@ -101,7 +101,7 @@ class BookmarksViewModel {
|
|||||||
hasMoreData = newBookmarks.currentPage != newBookmarks.totalPages // check if more data is available
|
hasMoreData = newBookmarks.currentPage != newBookmarks.totalPages // check if more data is available
|
||||||
} catch {
|
} catch {
|
||||||
errorMessage = "Error loading bookmarks"
|
errorMessage = "Error loading bookmarks"
|
||||||
bookmarks = nil
|
// Don't clear bookmarks on error - keep existing data visible
|
||||||
}
|
}
|
||||||
|
|
||||||
isLoading = false
|
isLoading = false
|
||||||
|
|||||||
@ -9,12 +9,23 @@ struct WebView: UIViewRepresentable {
|
|||||||
@Environment(\.colorScheme) private var colorScheme
|
@Environment(\.colorScheme) private var colorScheme
|
||||||
|
|
||||||
func makeUIView(context: Context) -> WKWebView {
|
func makeUIView(context: Context) -> WKWebView {
|
||||||
let webView = WKWebView()
|
let configuration = WKWebViewConfiguration()
|
||||||
|
|
||||||
|
// Enable text selection and copy functionality
|
||||||
|
let preferences = WKWebpagePreferences()
|
||||||
|
preferences.allowsContentJavaScript = true
|
||||||
|
configuration.defaultWebpagePreferences = preferences
|
||||||
|
|
||||||
|
let webView = WKWebView(frame: .zero, configuration: configuration)
|
||||||
webView.navigationDelegate = context.coordinator
|
webView.navigationDelegate = context.coordinator
|
||||||
webView.scrollView.isScrollEnabled = false
|
webView.scrollView.isScrollEnabled = false
|
||||||
webView.isOpaque = false
|
webView.isOpaque = false
|
||||||
webView.backgroundColor = UIColor.clear
|
webView.backgroundColor = UIColor.clear
|
||||||
|
|
||||||
|
// Allow text selection and copying
|
||||||
|
webView.allowsBackForwardNavigationGestures = false
|
||||||
|
webView.allowsLinkPreview = true
|
||||||
|
|
||||||
// Message Handler hier einmalig hinzufügen
|
// Message Handler hier einmalig hinzufügen
|
||||||
webView.configuration.userContentController.add(context.coordinator, name: "heightUpdate")
|
webView.configuration.userContentController.add(context.coordinator, name: "heightUpdate")
|
||||||
webView.configuration.userContentController.add(context.coordinator, name: "scrollProgress")
|
webView.configuration.userContentController.add(context.coordinator, name: "scrollProgress")
|
||||||
@ -66,6 +77,9 @@ struct WebView: UIViewRepresentable {
|
|||||||
color: var(--text-color);
|
color: var(--text-color);
|
||||||
font-size: var(--base-font-size);
|
font-size: var(--base-font-size);
|
||||||
-webkit-text-size-adjust: 100%;
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-webkit-user-select: text;
|
||||||
|
-webkit-touch-callout: default;
|
||||||
|
user-select: text;
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user