mirror of
https://github.com/Andre-Bzk/rin-mobile-userscript.git
synced 2026-11-15 09:33:08 +01:00
feat: add a mobile login view and a login/logout status pill
The script previously had no way to log in or tell whether a session was already active, since ucp.php fell outside the view switch and rendered in the desktop layout. Session state is only visible in the forum's own menu bar link (mode=login vs mode=logout), so every view now surfaces it as a pill in the breadcrumb bar instead of leaving the user to dig for it. The login form itself is moved into the new layout rather than rebuilt from scratch, keeping the hidden sid/redirect fields and the autologin/viewonline checkboxes intact without the script having to reimplement the session handshake. As the first short, unscrollable view in the project, it also exposed a WebKit quirk that longer views never triggered: without enough scroll headroom, Safari's own partially-retracted toolbar has nothing to scroll away and permanently covers the submit button. The generous bottom padding on the form works around that, separately from the safe-area inset that only accounts for the home indicator.
This commit is contained in:
@@ -10,6 +10,7 @@ die `.user.js`-Datei ist das Produkt.
|
||||
| `dev/rin-mobile.dev.user.js` | zusaetzlich `localhost:*` | Loader, bindet per `@require file:///` das echte Script ein |
|
||||
| `dev/viewtopic.php` | — | Fixture: gespeicherter Thread, 1114 Seiten |
|
||||
| `dev/viewforum.php` | — | Fixture: Main Forum, 610 Seiten, mit Unterforen, Ankuendigungen und Stickies |
|
||||
| `dev/ucp.php` | — | Fixture: Login-Formular (`mode=login`), nur ausgeloggter Zustand |
|
||||
|
||||
Die Fixtures sind ueber `.gitignore` (`dev/*.php`) ausgeschlossen. Nach einem
|
||||
frischen Klon sind sie nicht da und muessen nach der Anleitung in der README neu
|
||||
@@ -20,17 +21,18 @@ gespeichert werden — die Seite verlangt einen Login.
|
||||
Ein IIFE, streng der Reihe nach:
|
||||
|
||||
1. `DEBUG`-Flag und `log`-Array
|
||||
2. Weiche: `view` ist `'thread'`, `'liste'` oder `''` — abgeleitet aus
|
||||
`location.pathname + location.search`
|
||||
2. Weiche: `view` ist `'thread'`, `'liste'`, `'login'` oder `''` — abgeleitet
|
||||
aus `location.pathname + location.search`
|
||||
3. Nur bei gesetztem `view`: Viewport-Meta (idempotent ueber `[data-rm]`) und
|
||||
der komplette Style-Block als Template-Literal
|
||||
4. `replaceBody(root)` blendet alle bisherigen `body`-Kinder aus und haengt die
|
||||
neue Ansicht an
|
||||
5. `pageState()`, `pageSheet()` und `pageNav()` — die Paginierung, von beiden
|
||||
Ansichten benutzt
|
||||
6. `buildList()` beziehungsweise `buildThread()` lesen das Original-DOM und
|
||||
bauen ein `div.rm-root`; beide haengen zum Schluss ueber `addCrumbs()` die
|
||||
fixierte Brotkrumenleiste an
|
||||
5. `pageState()`, `pageSheet()` und `pageNav()` — die Paginierung, von Liste
|
||||
und Thread benutzt, nicht vom Login
|
||||
6. `buildList()`, `buildThread()` beziehungsweise `buildLogin()` lesen das
|
||||
Original-DOM und bauen ein `div.rm-root`; alle drei haengen zum Schluss
|
||||
ueber `addCrumbs()` die fixierte Brotkrumenleiste an, die zugleich ueber
|
||||
`loginState()` die Login/Logout-Pille traegt
|
||||
7. `run()` waehlt die Ansicht und haengt bei `DEBUG` das gruene Overlay an
|
||||
8. Start ueber `DOMContentLoaded`, falls `readyState === 'loading'`
|
||||
|
||||
@@ -113,6 +115,37 @@ klammert das `overflow` dagegen nicht, weil der Root keinen Containing Block
|
||||
aufspannt. Die Freihaltung oben haengt an `body.rm-crumbed`, damit ohne
|
||||
Brotkrumen im Markup kein leerer Streifen bleibt.
|
||||
|
||||
**Die Login-Erkennung ist ungetestet gegen eine echte Sitzung.** `loginState()`
|
||||
unterscheidet `a[href*="mode=login"]` von `a[href*="mode=logout"]` im
|
||||
Menuebalken und liest den Namen aus dem vermuteten Muster `Logout [ Name ]` im
|
||||
Linktext. Dem Repository liegt keine eingeloggte Fixture vor — passt das
|
||||
Namensmuster nicht, bleibt die Pille bei „Logout" ohne Namen stehen, statt eine
|
||||
Ausnahme zu werfen. Vor einer Aenderung an `loginState()` erst mit einer echten
|
||||
Sitzung pruefen, wie die Zeile tatsaechlich aussieht.
|
||||
|
||||
**Ist eine Seite nicht laenger als der Viewport, kann Safari nicht wegscrollen,
|
||||
um seine eigene Werkzeugleiste unten freizugeben.** Bei Liste und Thread faellt
|
||||
das nicht auf, weil Karten beziehungsweise Beitraege fast immer laenger sind
|
||||
als der Bildschirm. Der Login hat kein `.rm-nav`, das sonst Platz reserviert,
|
||||
und war als kurze Formularseite der erste Fall, bei dem die Seite genau so
|
||||
hoch wie der Viewport enden konnte — die teilweise eingefahrene Leiste blieb
|
||||
dann stehen und verdeckte den Submit-Button, ohne dass noch etwas zu scrollen
|
||||
war, um sie wegzuschieben. `env(safe-area-inset-bottom)` allein loest das
|
||||
nicht, das federt nur den Home-Indicator ab. Der Bodensatz unter dem Formular
|
||||
in `.rm-login form` ist deshalb absichtlich groesser als noetig: er erzwingt
|
||||
Scrollhoehe ueber den Viewport hinaus.
|
||||
|
||||
**`buildLogin()` baut das Formular nicht nach, sondern verschiebt es.** Wie der
|
||||
Beitragstext im Thread (`bodyWrap.appendChild(pb)`) wandert das
|
||||
Original-`<form>` unveraendert in `.rm-root` und wird nur per CSS auf
|
||||
Block-Elemente umgelegt. Nachbauen wuerde bedeuten, `sid`, das doppelte
|
||||
`redirect`-Feld und `autologin`/`viewonline` einzeln nachzuziehen — verliert
|
||||
man dabei eines, scheitert der Login stumm oder landet nicht dort, wo er soll.
|
||||
Aus demselben Grund faengt `buildLogin()` keine Fehlermeldung eines
|
||||
gescheiterten Logins ab: ohne Fixture eines fehlgeschlagenen Versuchs waere die
|
||||
Erkennung geraten. Fehlt das Formular (`input[name="username"]`), baut die
|
||||
Funktion nichts und die Originalseite bleibt sichtbar.
|
||||
|
||||
**`Page X of Y` steht als `Page <strong>1</strong> of <strong>1114</strong>`
|
||||
im Markup.** Ein Grep im Roh-HTML nach `Page 1 of` findet nichts, die Regex auf
|
||||
`txt(document.body)` greift trotzdem. Nicht vorschnell fuer kaputt halten.
|
||||
@@ -182,6 +215,14 @@ sinnvoll: reine Forenliste, reine Themenliste, beides auf einer Seite, und
|
||||
dieselbe Forenliste ohne die Klassen `forumlink`/`forumdesc` — die muss ueber
|
||||
die Zahlenspalten dasselbe Ergebnis liefern.
|
||||
|
||||
Fuer den Login genuegt `dev/ucp.php` unveraendert: geprueft werden das
|
||||
uebernommene Formular (Username-/Passwortfeld, `sid`, `redirect`, Submit) und
|
||||
die Pille in beiden Zustaenden — Letzteres per Textersetzung von
|
||||
`mode=login` zu `mode=logout&sid=…Logout [ Name ]…` in der eingelesenen
|
||||
Fixture, da eine echte eingeloggte Seite fehlt. Das Namensmuster bleibt damit
|
||||
nur gegen die eigene Annahme getestet, nicht gegen echtes Markup — siehe die
|
||||
Falle oben.
|
||||
|
||||
Am Geraet zu pruefen bleibt, was Blink nicht zeigt: `env(safe-area-inset-*)`,
|
||||
fixierte Leisten gegen Safaris ein- und ausfahrende Toolbar,
|
||||
`-webkit-backdrop-filter`, Schriftskalierung. Details und die
|
||||
|
||||
Reference in New Issue
Block a user