export function tokenOptionsAccordion(collection) { const uniqueId = "token_" + app.utils.randomString(); const data = store({ get tokensList() { if (collection?.name === "_superusers") { return [ { key: "authToken", label: "Auth" }, { key: "passwordResetToken", label: "Password reset" }, { key: "fileToken", label: "Protected file" }, ]; } return [ { key: "authToken", label: "Auth" }, { key: "verificationToken", label: "Email verification" }, { key: "passwordResetToken", label: "Password reset" }, { key: "emailChangeToken", label: "Email change" }, { key: "fileToken", label: "Protected file" }, ]; }, }); return t.details( { pbEvent: "tokenOptionsAccordion", name: "other", className: "accordion token-options-accordion", }, t.summary( null, t.i({ className: "ri-key-2-line", ariaHidden: true }), t.span({ className: "txt", textContent: "Token options (invalidate, duration)" }), ), t.div({ className: "grid sm" }, () => { return data.tokensList.map((token) => { const fieldId = uniqueId + token.key; return t.div( { className: "col-sm-6" }, t.div( { className: "field token-field" }, t.label({ htmlFor: fieldId, textContent: () => token.label + " duration (in seconds)", }), t.input({ id: fieldId, type: "number", min: 1, step: 1, required: true, name: () => token.key + ".duration", value: () => collection[token.key].duration, oninput: (e) => (collection[token.key].duration = parseInt(e.target.value, 10)), }), ), t.div( { className: "field-help m-b-10" }, t.button({ type: "button", className: () => `link-hint ${collection[token.key].secret ? "txt-success" : ""}`, textContent: "Invalidate all previously issued tokens", onclick: () => { // toggle if (collection[token.key].secret) { delete collection[token.key].secret; } else { collection[token.key].secret = app.utils.randomSecret(50); } }, }), ), ); }); }), ); }