Admin page: the top bar clears the status bar in the iOS app (#423)

admin.html's viewport meta lacked viewport-fit=cover, which index.html
has. Without it env(safe-area-inset-top) is 0, so the top bar's padding
did not clear the clock in the app's full-screen web view, and the back
arrow sat under it and could not be tapped. Seen in the simulator, the
built page served locally: the arrow and the title level with the
clock before, below the status bar after.

Also a launch argument, -ipx.noBadgePrompt, so a simulator run can get
past the badge permission dialog.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
Ray Slakinski
2026-11-08 14:18:55 -05:00
parent 4957c297b7
commit 8d4c70a571
4 changed files with 7 additions and 2 deletions

View File

@@ -27,7 +27,7 @@ The first launch asks, with `https://ipodderx.sdf1.net` filled in; a bare host g
Shake the phone to change it. Plain `http://` only on your own network Shake the phone to change it. Plain `http://` only on your own network
(`http://192.168.1.130:8099`), which is all `NSAllowsLocalNetworking` allows. Sign in on the page (`http://192.168.1.130:8099`), which is all `NSAllowsLocalNetworking` allows. Sign in on the page
that follows, through Cloudflare Access or ipx's own form; the cookies that leaves are what the that follows, through Cloudflare Access or ipx's own form; the cookies that leaves are what the
player uses (`CookieBridge`). `-ipx.server <url>` as a launch argument overrides it for a run. player uses (`CookieBridge`). `-ipx.server <url>` as a launch argument overrides it for a run. `-ipx.noBadgePrompt YES` skips the badge permission dialog, which covers the page in a simulator run nobody is there to tap.
## Player token ## Player token

View File

@@ -32,6 +32,9 @@ enum Badge {
/// Asks once, for the badge alone: no alerts, no sounds. /// Asks once, for the badge alone: no alerts, no sounds.
static func requestPermission() { static func requestPermission() {
// `-ipx.noBadgePrompt YES` on the launch arguments: a simulator run that drives the page
// has nobody to tap Allow, and the dialog covers it.
if UserDefaults.standard.bool(forKey: "ipx.noBadgePrompt") { return }
UNUserNotificationCenter.current().requestAuthorization(options: [.badge]) { _, _ in } UNUserNotificationCenter.current().requestAuthorization(options: [.badge]) { _, _ in }
} }

View File

@@ -23,6 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- The Check every feed button in All Subscriptions' header, which did what the top bar's does (#416). - The Check every feed button in All Subscriptions' header, which did what the top bar's does (#416).
### Fixed ### Fixed
- The admin page's top bar clears the status bar in the iOS app, so its back button can be tapped; the page asked for no room under the clock as the app page does (#423).
- Swiping, or j, through more than 50 items no longer stops at the 50th until a reload: the next ones are fetched as you near the end, and Load more on the Unread tab no longer skips as many unread items as you had read (#383). - Swiping, or j, through more than 50 items no longer stops at the 50th until a reload: the next ones are fetched as you near the end, and Load more on the Unread tab no longer skips as many unread items as you had read (#383).
- On the Unread tab, a short list read through no longer asks the server for more that is not there, or shows a count of 0 items beside the items still on screen (#385). - On the Unread tab, a short list read through no longer asks the server for more that is not there, or shows a count of 0 items beside the items still on screen (#385).
- ipx-web no longer logs a deprecation warning about its metrics setting at every start (#381). - ipx-web no longer logs a deprecation warning about its metrics setting at every start (#381).

View File

@@ -2,7 +2,7 @@
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
<meta name="color-scheme" content="dark light"> <meta name="color-scheme" content="dark light">
<meta name="theme-color" content="#0a1726"> <meta name="theme-color" content="#0a1726">
<title>iPX admin</title> <title>iPX admin</title>