Badge the installed icon, and share to the phone rather than to Downloads
Three things an installed ihasmail did not do that a phone user expects, and all three are about the app once it is off the browser tab. The unread count was painted into the tab title and the favicon, neither of which exists in `display: standalone` -- so putting ihasmail on a home screen threw the count away entirely. It goes to the Badging API as well now. Web Push marks the icon while the app is closed, and marks it with a dot rather than a figure: the service worker has no session to ask how many messages are unread, and a push carries the new mail rather than a total, so counting the payload would badge "2" over an inbox holding forty. The next tab to open writes the real count over it. Sharing is new. Everything that left ihasmail left as a download, which on a phone is close to a dead end -- the file lands in Downloads and whoever meant to send it somewhere goes looking for it in a file manager. The share sheet is now on the message menu, on each attachment row, and in the file viewer, which is where an attachment is already open and where both callers meet. A message shares as text rather than as the .eml beside it: a share sheet is aimed at everything that is not a mail client, and an .eml in a chat app is an attachment nobody can open. Every control feature-detects, and sharing a file is a separate question from sharing at all -- desktop Linux and Firefox have neither, and not every browser with `share` takes files. Anything that fails, including the transient activation running out while a large attachment is fetched, falls through to the download the button sits beside, so the worst case costs a tap rather than the file. `NotAllowedError` is reported as unsupported for that reason: it cannot be told apart from a refusal, and a toast about activation is not something a reader can act on. The share strings are contextual keys rather than the existing "Share…". That one means granting another account access, and several languages use a different verb for it -- German had "Freigeben" where the sheet wants "Teilen". Three new strings, in all nine catalogues. The manifest gains `launch_handler: navigate-existing`, so a mailto:, a shortcut or a notification tapped while ihasmail is running arrives in the copy that is running: two windows on one inbox disagree about what has been read. `focus-existing` would have been wrong -- it only focuses and leaves the target URL to launchQueue, which nothing here consumes, so it would swallow the mailto. There is deliberately still no `id`, and the manifest now says why: it is the one member resolved against the origin of start_url rather than against the manifest's own address, so no relative form can name a subpath mount, and the default id already is start_url -- writing one now would give every installed copy a new identity and orphan it as a second app. Verified by test rather than on a device: the extension driving Chrome was not connected, and Chrome on Linux has no Web Share to drive anyway. The preview dialog is covered by a component test that stubs the browser both ways.
This commit is contained in:
@@ -880,6 +880,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Spam",
|
||||
"folder\u0004Important": "Wichtig",
|
||||
"folder\u0004All mail": "Alle Nachrichten",
|
||||
"share sheet\u0004Share": "Teilen",
|
||||
"share sheet\u0004Share…": "Teilen…",
|
||||
"folder": "Ordner",
|
||||
"“{name}” moved into “{parent}”": "„{name}“ wurde nach „{parent}“ verschoben",
|
||||
"“{name}” moved to the top level": "„{name}“ wurde auf die oberste Ebene verschoben",
|
||||
@@ -930,6 +932,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "Die Adresse konnte nicht kopiert werden",
|
||||
"Could not empty folder: {error}": "Ordner konnte nicht geleert werden: {error}",
|
||||
"Could not load source: {error}": "Quelltext konnte nicht geladen werden: {error}",
|
||||
"Could not share: {error}": "Teilen nicht möglich: {error}",
|
||||
"Could not mark as read: {error}": "Konnte nicht als gelesen markiert werden: {error}",
|
||||
"Could not save draft: {error}": "Entwurf konnte nicht gespeichert werden: {error}",
|
||||
"Could not save filter: {error}": "Filter konnte nicht gespeichert werden: {error}",
|
||||
|
||||
@@ -801,6 +801,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Spam",
|
||||
"folder\u0004Important": "Importante",
|
||||
"folder\u0004All mail": "Todos los mensajes",
|
||||
"share sheet\u0004Share": "Compartir",
|
||||
"share sheet\u0004Share…": "Compartir…",
|
||||
"folder": "carpeta",
|
||||
"“{name}” moved into “{parent}”": "«{name}» se ha movido a «{parent}»",
|
||||
"“{name}” moved to the top level": "«{name}» se ha movido al nivel superior",
|
||||
@@ -903,6 +905,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "No se pudo copiar la dirección",
|
||||
"Could not empty folder: {error}": "No se pudo vaciar la carpeta: {error}",
|
||||
"Could not load source: {error}": "No se pudo cargar el código fuente: {error}",
|
||||
"Could not share: {error}": "No se pudo compartir: {error}",
|
||||
"Could not mark as read: {error}": "No se pudo marcar como leído: {error}",
|
||||
"Could not save draft: {error}": "No se pudo guardar el borrador: {error}",
|
||||
"Could not save filter: {error}": "No se pudo guardar el filtro: {error}",
|
||||
|
||||
@@ -806,6 +806,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Spam",
|
||||
"folder\u0004Important": "Important",
|
||||
"folder\u0004All mail": "Tous les messages",
|
||||
"share sheet\u0004Share": "Partager",
|
||||
"share sheet\u0004Share…": "Partager…",
|
||||
"folder": "dossier",
|
||||
"“{name}” moved into “{parent}”": "« {name} » a été déplacé dans « {parent} »",
|
||||
"“{name}” moved to the top level": "« {name} » a été déplacé au niveau supérieur",
|
||||
@@ -908,6 +910,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "Impossible de copier l’adresse",
|
||||
"Could not empty folder: {error}": "Impossible de vider le dossier : {error}",
|
||||
"Could not load source: {error}": "Impossible de charger la source : {error}",
|
||||
"Could not share: {error}": "Impossible de partager : {error}",
|
||||
"Could not mark as read: {error}": "Impossible de marquer comme lu : {error}",
|
||||
"Could not save draft: {error}": "Impossible d’enregistrer le brouillon : {error}",
|
||||
"Could not save filter: {error}": "Impossible d’enregistrer le filtre : {error}",
|
||||
|
||||
@@ -861,6 +861,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "迷惑メール",
|
||||
"folder\u0004Important": "重要",
|
||||
"folder\u0004All mail": "すべてのメール",
|
||||
"share sheet\u0004Share": "共有",
|
||||
"share sheet\u0004Share…": "共有…",
|
||||
"folder": "フォルダー",
|
||||
"“{name}” moved into “{parent}”": "「{name}」を「{parent}」に移動しました",
|
||||
"“{name}” moved to the top level": "「{name}」を最上位に移動しました",
|
||||
@@ -911,6 +913,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "アドレスをコピーできませんでした",
|
||||
"Could not empty folder: {error}": "フォルダーを空にできませんでした: {error}",
|
||||
"Could not load source: {error}": "ソースを読み込めませんでした: {error}",
|
||||
"Could not share: {error}": "共有できませんでした: {error}",
|
||||
"Could not mark as read: {error}": "既読にできませんでした: {error}",
|
||||
"Could not save draft: {error}": "下書きを保存できませんでした: {error}",
|
||||
"Could not save filter: {error}": "フィルターを保存できませんでした: {error}",
|
||||
|
||||
@@ -797,6 +797,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Spam",
|
||||
"folder\u0004Important": "Belangrijk",
|
||||
"folder\u0004All mail": "Alle berichten",
|
||||
"share sheet\u0004Share": "Delen",
|
||||
"share sheet\u0004Share…": "Delen…",
|
||||
"folder": "map",
|
||||
"“{name}” moved into “{parent}”": "“{name}” is verplaatst naar “{parent}”",
|
||||
"“{name}” moved to the top level": "“{name}” is naar het hoogste niveau verplaatst",
|
||||
@@ -899,6 +901,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "Het adres kon niet worden gekopieerd",
|
||||
"Could not empty folder: {error}": "Map legen mislukt: {error}",
|
||||
"Could not load source: {error}": "De bron kon niet worden geladen: {error}",
|
||||
"Could not share: {error}": "Delen is niet gelukt: {error}",
|
||||
"Could not mark as read: {error}": "Markeren als gelezen mislukt: {error}",
|
||||
"Could not save draft: {error}": "Concept opslaan mislukt: {error}",
|
||||
"Could not save filter: {error}": "Filter opslaan mislukt: {error}",
|
||||
|
||||
@@ -804,6 +804,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Spam",
|
||||
"folder\u0004Important": "Importante",
|
||||
"folder\u0004All mail": "Todas as mensagens",
|
||||
"share sheet\u0004Share": "Compartilhar",
|
||||
"share sheet\u0004Share…": "Compartilhar…",
|
||||
"folder": "pasta",
|
||||
"“{name}” moved into “{parent}”": "“{name}” foi movida para “{parent}”",
|
||||
"“{name}” moved to the top level": "“{name}” foi movida para o nível superior",
|
||||
@@ -906,6 +908,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "Não foi possível copiar o endereço",
|
||||
"Could not empty folder: {error}": "Não foi possível esvaziar a pasta: {error}",
|
||||
"Could not load source: {error}": "Não foi possível carregar o código-fonte: {error}",
|
||||
"Could not share: {error}": "Não foi possível compartilhar: {error}",
|
||||
"Could not mark as read: {error}": "Não foi possível marcar como lida: {error}",
|
||||
"Could not save draft: {error}": "Não foi possível salvar o rascunho: {error}",
|
||||
"Could not save filter: {error}": "Não foi possível salvar o filtro: {error}",
|
||||
|
||||
@@ -803,6 +803,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Спам",
|
||||
"folder\u0004Important": "Важное",
|
||||
"folder\u0004All mail": "Вся почта",
|
||||
"share sheet\u0004Share": "Поделиться",
|
||||
"share sheet\u0004Share…": "Поделиться…",
|
||||
"folder": "папка",
|
||||
"“{name}” moved into “{parent}”": "«{name}» перемещена в «{parent}»",
|
||||
"“{name}” moved to the top level": "«{name}» перемещена на верхний уровень",
|
||||
@@ -905,6 +907,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "Не удалось скопировать адрес",
|
||||
"Could not empty folder: {error}": "Не удалось очистить папку: {error}",
|
||||
"Could not load source: {error}": "Не удалось загрузить исходный текст: {error}",
|
||||
"Could not share: {error}": "Не удалось поделиться: {error}",
|
||||
"Could not mark as read: {error}": "Не удалось отметить как прочитанное: {error}",
|
||||
"Could not save draft: {error}": "Не удалось сохранить черновик: {error}",
|
||||
"Could not save filter: {error}": "Не удалось сохранить фильтр: {error}",
|
||||
|
||||
@@ -797,6 +797,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "Спам",
|
||||
"folder\u0004Important": "Важливе",
|
||||
"folder\u0004All mail": "Уся пошта",
|
||||
"share sheet\u0004Share": "Поділитися",
|
||||
"share sheet\u0004Share…": "Поділитися…",
|
||||
"folder": "тека",
|
||||
"“{name}” moved into “{parent}”": "«{name}» переміщено до «{parent}»",
|
||||
"“{name}” moved to the top level": "«{name}» переміщено на верхній рівень",
|
||||
@@ -899,6 +901,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "Не вдалося скопіювати адресу",
|
||||
"Could not empty folder: {error}": "Не вдалося очистити теку: {error}",
|
||||
"Could not load source: {error}": "Не вдалося завантажити вихідний текст: {error}",
|
||||
"Could not share: {error}": "Не вдалося поділитися: {error}",
|
||||
"Could not mark as read: {error}": "Не вдалося позначити як прочитане: {error}",
|
||||
"Could not save draft: {error}": "Не вдалося зберегти чернетку: {error}",
|
||||
"Could not save filter: {error}": "Не вдалося зберегти фільтр: {error}",
|
||||
|
||||
@@ -860,6 +860,8 @@ export const catalog: Catalog = {
|
||||
"folder\u0004Junk Mail": "垃圾邮件",
|
||||
"folder\u0004Important": "重要",
|
||||
"folder\u0004All mail": "全部邮件",
|
||||
"share sheet\u0004Share": "分享",
|
||||
"share sheet\u0004Share…": "分享…",
|
||||
"folder": "文件夹",
|
||||
"“{name}” moved into “{parent}”": "「{name}」已移入「{parent}」",
|
||||
"“{name}” moved to the top level": "「{name}」已移至顶层",
|
||||
@@ -910,6 +912,7 @@ export const catalog: Catalog = {
|
||||
"Could not copy the address": "无法复制该地址",
|
||||
"Could not empty folder: {error}": "无法清空文件夹:{error}",
|
||||
"Could not load source: {error}": "无法加载原文:{error}",
|
||||
"Could not share: {error}": "无法分享:{error}",
|
||||
"Could not mark as read: {error}": "无法标为已读:{error}",
|
||||
"Could not save draft: {error}": "无法保存草稿:{error}",
|
||||
"Could not save filter: {error}": "无法保存过滤器:{error}",
|
||||
|
||||
Reference in New Issue
Block a user