OASIS_MOBILE/src/views/fork/identities.js
s1to d843d47374 identidades: enlace a exportar e importar
Sacar o meter una identidad ya existente lo hace el modulo legacy, que es quien
sabe cifrar el secret con una contraseña. Se enlaza desde la lista para que
este donde se busca.
2026-08-19 11:18:55 +02:00

72 lines
2.8 KiB
JavaScript

/**
* Selector de identidades para los ajustes.
*
* Vive aparte de settings_view.js para que las reescrituras de upstream sobre ese
* fichero no arrastren esto: alli solo hay una linea que llama a renderIdentities().
*
* No cambia de identidad en caliente. Anota cual sera la del proximo arranque y lo
* dice; el porque esta en src/backend/accounts.js.
*/
module.exports = ({ i18n, html }) => {
const { form, button, div, h2, p, section, input, span, ul, li, a } = html;
const accounts = require('../../backend/accounts.js');
const renderIdentities = (activeAccount) => {
const names = accounts.list();
const feeds = new Map(names.map((n) => [n, accounts.feedIdOf(n)]));
// dos carpetas con el mismo feed son la misma identidad copiada: publicar desde
// las dos parte el registro y no tiene arreglo, asi que se avisa en la lista
const seen = new Map();
for (const [n, id] of feeds) {
if (!id) continue;
seen.set(id, (seen.get(id) || 0) + 1);
}
const row = (name) => {
const id = feeds.get(name);
const isActive = name === activeAccount;
const duplicated = id && seen.get(id) > 1;
return li({ class: "identity-row" },
div({ class: "identity-info" },
span({ class: "identity-name" }, name),
span({ class: "identity-feed" }, id ? `${id.slice(0, 18)}` : "—"),
duplicated ? span({ class: "identity-warn" }, i18n.identitiesSameFeed) : null
),
isActive
? span({ class: "identity-active" }, i18n.identitiesActive)
: form({ method: "POST", action: "/settings/identity/use" },
input({ type: "hidden", name: "account", value: name }),
button({ type: "submit" }, i18n.identitiesUse)
)
);
};
// en movil el backend lo mantiene vivo un servicio en primer plano, asi que
// cerrar la app no basta para reiniciarlo: hace falta pedirlo
const restart = process.env.OASIS_MOBILE === '1'
? form({ method: "POST", action: "/settings/identity/restart" },
button({ type: "submit" }, i18n.identitiesRestart))
: null;
return section(
div({ class: "tags-header" },
h2(i18n.identitiesTitle),
p(i18n.identitiesDescription),
ul({ class: "identity-list" }, names.map(row)),
form({ method: "POST", action: "/settings/identity/create" },
input({ type: "text", name: "account", placeholder: i18n.identitiesNewName,
maxlength: "32", autocomplete: "off" }),
button({ type: "submit" }, i18n.identitiesCreate)
),
// sacar o meter una identidad ya existente es cosa del modulo legacy, que
// es el que sabe cifrar el secret con una contraseña
p(a({ href: "/legacy", class: "identity-legacy" }, i18n.identitiesBackup)),
restart
)
);
};
return { renderIdentities };
};