fix(export): per-platform polish from the on-device review
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 10s
CI / integration (pull_request) Successful in 14s
CI / ui (pull_request) Successful in 1m4s
CI / conformance (pull_request) Successful in 9s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m41s
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 10s
CI / integration (pull_request) Successful in 14s
CI / ui (pull_request) Successful in 1m4s
CI / conformance (pull_request) Successful in 9s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m41s
- TG iOS: the OS share sheet with the fetched file (WKWebView has navigator.share — the долгоживущий debug-overlay Share path proves it). The chooser stays the app modal on this one platform: a native popup callback cannot supply the user activation the sheet needs. TG Android/desktop keep the native popup + downloadFile (verified perfect, untouched). - VK mobile: the PNG now rides VKWebAppDownloadFile like the GCG — the owner-verified path that lands in VK's native share flow; the ShowImages viewer is dropped (its preview offered save only, no share). - VK desktop iframe: both formats are plain anchor downloads (it is an ordinary browser; the viewer/bridge path made no sense there).
This commit is contained in:
+13
-13
@@ -406,21 +406,21 @@ enabled on the first, uncached load) and flip in place when an event refreshes t
|
||||
- **History / export**: the in-game slide-down history lays each move out in a per-seat grid
|
||||
(the word(s) and the move score, no running total); the 📤 in the history header appears
|
||||
only once the game is finished — never in an honest-AI game (throwaway practice) — and
|
||||
opens the **format chooser**: Telegram's native popup inside Telegram — safe there,
|
||||
since the whole TG chain is bridge calls needing no user activation (a popup callback
|
||||
opens the **format chooser**: Telegram's native popup on TG Android/desktop — safe
|
||||
there, since that chain is all bridge calls needing no user activation (a popup callback
|
||||
must never lead into `navigator.share`/clipboard, the on-device finding) — and the app's
|
||||
own modal elsewhere (VK has no native chooser; the accent button leads with the image,
|
||||
own modal elsewhere (TG iOS delivers via the OS share sheet, which needs the modal
|
||||
click's activation; VK has no native chooser; the accent button leads with the image,
|
||||
both options need the connection). Both formats mint the same signed relative link
|
||||
(`game.export_url`), resolved against the app's own origin, then delivered natively:
|
||||
Telegram `downloadFile` (both TG platforms); on VK the PNG opens in the native photo
|
||||
viewer (`VKWebAppShowImages`, save/share from its controls) and the GCG goes through
|
||||
`VKWebAppDownloadFile`, both falling back to a plain anchor download (the desktop
|
||||
iframe); a mobile browser fetches the bytes and opens the OS share sheet
|
||||
(`navigator.share` with the file — the proven fetch-then-share pattern), a desktop
|
||||
browser downloads by anchor. A legacy Telegram client without `downloadFile` keeps the
|
||||
old GCG clipboard copy, hides the image option and stays on the app modal. Confirming a
|
||||
resign reveals the full board: it closes the history drawer (portrait) and zooms the
|
||||
board out.
|
||||
(`game.export_url`), resolved against the app's own origin, then delivered per platform
|
||||
(each branch owner-verified on-device): TG Android/desktop `downloadFile` (its preview
|
||||
shares onwards); TG iOS the OS share sheet with the fetched file; VK mobile
|
||||
`VKWebAppDownloadFile` for both formats (VK's native share/preview flow), the VK desktop
|
||||
iframe plain anchor downloads; a mobile browser the OS share sheet (the proven
|
||||
fetch-then-share pattern); a desktop browser an anchor download. A legacy Telegram
|
||||
client without `downloadFile` keeps the old GCG clipboard copy, hides the image option
|
||||
and stays on the app modal. Confirming a resign reveals the full board: it closes the
|
||||
history drawer (portrait) and zooms the board out.
|
||||
- **Export image** (`lib/gameimage.ts` — the shared drawing module the render sidecar
|
||||
executes; the browser app no longer draws it): always the light palette (pinned constants
|
||||
mirroring `app.css`), the final board with classic axes A..O / 1..15, premium squares as
|
||||
|
||||
Reference in New Issue
Block a user