diff --git a/docs/design/panel-de-firma.md b/docs/design/panel-de-firma.md
index 273005f9..2bd42536 100644
--- a/docs/design/panel-de-firma.md
+++ b/docs/design/panel-de-firma.md
@@ -82,7 +82,7 @@ Cada uno tiene su historia en «Flujos/Firma/SigningPanel», salvo que se diga o
| Sin certificados | `NoCertificates` | El selector se queda en su sitio, desactivado y diciendo «Sin certificados»; debajo, «Añadir un certificado…» (primario, el ancho que sobra) y «Volver a buscar» (secundario); el pie deja solo «Firmar», desactivado |
| Sin certificados, con lector | `NoCertificatesWithReader` | La misma forma, con la línea del lector entre el selector desactivado y las salidas |
| Búsqueda fallida | `SearchFailed` | La misma forma, con el error clasificado debajo de las salidas; la caja dice que no se pudo buscar, no que no haya ninguno |
-| Lector sin tarjeta, leyendo, tarjeta lista e ilegible | `ReaderWithoutCard`, `ReadingTheCard`, `DnieReady`, `CardReady`, `UnreadableCardOnWindows`, `UnreadableCardOnLinux` | La línea del lector bajo el selector; sin lector (`Ready`), no hay línea. Ilegible, añade la ayuda de la plataforma: Windows Update o la página de la DGP en Windows, OpenSC en Linux. Mientras se lee, los demás certificados se siguen pudiendo elegir |
+| Lector sin tarjeta, leyendo, tarjeta lista e ilegible | `ReaderWithoutCard`, `ReadingTheCard`, `DnieReady`, `CardReady`, `UnreadableCardOnWindows`, `UnreadableCardOnMacos`, `UnreadableCardOnLinux` | La línea del lector bajo el selector; sin lector (`Ready`), no hay línea. Ilegible, añade la ayuda de la plataforma: Windows Update o la página de la DGP en Windows, OpenSC o la página de la DGP en macOS, OpenSC en Linux. Mientras se lee, los demás certificados se siguen pudiendo elegir |
| Varios certificados | `SeveralCertificates` | El desplegable los lista todos al abrirse |
| Certificados abiertos | `Open` de «Dominio/Firma/CertificateSelect» | El buscador en lugar de la caja y la lista flotando |
| Firma visible | `VisibleSignature*` | Una página, varias, todas, otra página a la vista y sin colocar |
diff --git a/rfirma-app/po/ca.po b/rfirma-app/po/ca.po
index b51258b4..4ce9c35d 100644
--- a/rfirma-app/po/ca.po
+++ b/rfirma-app/po/ca.po
@@ -533,6 +533,9 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instal·la OpenSC perquè l'rFirma la pugui llegir."
+msgid "panel.certificate.reader.unreadableHelp.macos"
+msgstr "Instal·la OpenSC o el mòdul de la DGP perquè l'rFirma la pugui llegir."
+
#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Emès per {{issuer}}"
diff --git a/rfirma-app/po/en.po b/rfirma-app/po/en.po
index b045a3f8..cb91dc21 100644
--- a/rfirma-app/po/en.po
+++ b/rfirma-app/po/en.po
@@ -533,6 +533,9 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Install OpenSC so that rFirma can read it."
+msgid "panel.certificate.reader.unreadableHelp.macos"
+msgstr "Install OpenSC or the DGP module so that rFirma can read it."
+
#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Issued by {{issuer}}"
diff --git a/rfirma-app/po/es.po b/rfirma-app/po/es.po
index 887a98ea..67ecdc03 100644
--- a/rfirma-app/po/es.po
+++ b/rfirma-app/po/es.po
@@ -533,6 +533,9 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instala OpenSC para que rFirma pueda leerla."
+msgid "panel.certificate.reader.unreadableHelp.macos"
+msgstr "Instala OpenSC o el módulo de la DGP para que rFirma pueda leerla."
+
#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Emitido por {{issuer}}"
diff --git a/rfirma-app/po/eu.po b/rfirma-app/po/eu.po
index 00a4e188..b7d80fb7 100644
--- a/rfirma-app/po/eu.po
+++ b/rfirma-app/po/eu.po
@@ -534,6 +534,9 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instalatu OpenSC rFirmak txartela irakur dezan."
+msgid "panel.certificate.reader.unreadableHelp.macos"
+msgstr "Instalatu OpenSC edo DGPren modulua rFirmak txartela irakur dezan."
+
#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Jaulkitzailea: {{issuer}}"
diff --git a/rfirma-app/po/gl.po b/rfirma-app/po/gl.po
index a080228c..eab79cbb 100644
--- a/rfirma-app/po/gl.po
+++ b/rfirma-app/po/gl.po
@@ -531,6 +531,9 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr "Instala OpenSC para que rFirma poida lela."
+msgid "panel.certificate.reader.unreadableHelp.macos"
+msgstr "Instala OpenSC ou o módulo da DGP para que rFirma poida lela."
+
#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr "Emitido por {{issuer}}"
diff --git a/rfirma-app/po/messages.pot b/rfirma-app/po/messages.pot
index 934330c3..196de416 100644
--- a/rfirma-app/po/messages.pot
+++ b/rfirma-app/po/messages.pot
@@ -521,6 +521,9 @@ msgstr ""
msgid "panel.certificate.reader.unreadableHelp.linux"
msgstr ""
+msgid "panel.certificate.reader.unreadableHelp.macos"
+msgstr ""
+
#. {{issuer}} es el nombre de la entidad emisora del certificado.
msgid "panel.certificate.issuer"
msgstr ""
diff --git a/rfirma-app/src/signing/ReaderLine.test.tsx b/rfirma-app/src/signing/ReaderLine.test.tsx
index 10c62db2..d1e64d84 100644
--- a/rfirma-app/src/signing/ReaderLine.test.tsx
+++ b/rfirma-app/src/signing/ReaderLine.test.tsx
@@ -32,6 +32,13 @@ describe("the reader line under the certificate selector", () => {
expect(screen.getByRole("status")).toHaveTextContent(/OpenSC/);
});
+ it("points to OpenSC and the DGP page on macOS", () => {
+ renderWithCatalog();
+
+ expect(screen.getByRole("status")).toHaveTextContent(/OpenSC/);
+ expect(screen.getByRole("status")).toHaveTextContent(/DGP/);
+ });
+
it("offers nothing on a platform it has no advice for", () => {
renderWithCatalog();
diff --git a/rfirma-app/src/signing/ReaderLine.tsx b/rfirma-app/src/signing/ReaderLine.tsx
index eae42cbb..22c79278 100644
--- a/rfirma-app/src/signing/ReaderLine.tsx
+++ b/rfirma-app/src/signing/ReaderLine.tsx
@@ -7,11 +7,12 @@ import { hasAReader, type ReaderStatus } from "./certificate";
import "./ReaderLine.css";
/** La plataforma de la que depende la ayuda para una tarjeta ilegible. */
-export type CardHelpPlatform = "windows" | "linux" | "other";
+export type CardHelpPlatform = "windows" | "macos" | "linux" | "other";
/** La plataforma que corresponde al `userAgent` del WebView. */
function cardHelpPlatformFor(userAgent: string): CardHelpPlatform {
if (/windows/i.test(userAgent)) return "windows";
+ if (/macintosh|mac os x/i.test(userAgent)) return "macos";
if (/linux/i.test(userAgent) && !/android/i.test(userAgent)) return "linux";
return "other";
}
@@ -69,11 +70,16 @@ function readerText(
function CardHelp({ platform }: { platform: CardHelpPlatform }) {
const { t } = useTranslation();
if (platform === "other") return null;
- return (
-
- {platform === "windows"
- ? t("panel.certificate.reader.unreadableHelp.windows")
- : t("panel.certificate.reader.unreadableHelp.linux")}
-
- );
+ return {cardHelpText(platform, t)};
+}
+
+function cardHelpText(platform: Exclude, t: TFunction): string {
+ switch (platform) {
+ case "windows":
+ return t("panel.certificate.reader.unreadableHelp.windows");
+ case "macos":
+ return t("panel.certificate.reader.unreadableHelp.macos");
+ case "linux":
+ return t("panel.certificate.reader.unreadableHelp.linux");
+ }
}
diff --git a/rfirma-app/src/signing/SigningPanel.presentation.test.tsx b/rfirma-app/src/signing/SigningPanel.presentation.test.tsx
index 0d6c583f..4e9ebf61 100644
--- a/rfirma-app/src/signing/SigningPanel.presentation.test.tsx
+++ b/rfirma-app/src/signing/SigningPanel.presentation.test.tsx
@@ -41,6 +41,7 @@ const {
CardReady,
UnreadableCardOnLinux,
UnreadableCardOnWindows,
+ UnreadableCardOnMacos,
NoCertificatesWithReader,
} = composed;
@@ -135,6 +136,7 @@ describe("the signing panel, by state", () => {
{ Story: CardReady, said: "Tarjeta lista" },
{ Story: UnreadableCardOnWindows, said: "rFirma no puede leer la tarjeta del lector" },
{ Story: UnreadableCardOnLinux, said: "rFirma no puede leer la tarjeta del lector" },
+ { Story: UnreadableCardOnMacos, said: "rFirma no puede leer la tarjeta del lector" },
] as const;
for (const { Story, said } of cases) {
diff --git a/rfirma-app/src/signing/SigningPanel.stories.tsx b/rfirma-app/src/signing/SigningPanel.stories.tsx
index 6389f5a9..67880b1f 100644
--- a/rfirma-app/src/signing/SigningPanel.stories.tsx
+++ b/rfirma-app/src/signing/SigningPanel.stories.tsx
@@ -138,6 +138,10 @@ export const UnreadableCardOnLinux: Story = {
args: { certificate: withReader({ kind: "unreadable" }), platform: "linux" },
};
+export const UnreadableCardOnMacos: Story = {
+ args: { certificate: withReader({ kind: "unreadable" }), platform: "macos" },
+};
+
export const NoCertificatesWithReader: Story = {
args: { certificate: withReader({ kind: "noCard" }, { kind: "empty" }) },
};