diff --git a/src/cards.css b/src/cards.css index 2a407b4..207fabc 100644 --- a/src/cards.css +++ b/src/cards.css @@ -10,7 +10,7 @@ } @media (orientation: portrait) { .mbox { - padding: 0 calc(.5 * var(--gap)); + padding: 0 var(--gap-half); } } .mbox:last-child { diff --git a/src/form.css b/src/form.css index 5a0151b..ad97eba 100644 --- a/src/form.css +++ b/src/form.css @@ -187,6 +187,16 @@ button:disabled { flex-grow: 0; } + +input[type="checkbox"] { + margin: 0; +} +label.checkbox { + align-items: baseline; + display: flex; + gap: var(--gap-half); +} + button#publish { align-self: end; order: 2; diff --git a/src/index.html b/src/index.html index 23f0f3e..74a180b 100644 --- a/src/index.html +++ b/src/index.html @@ -83,6 +83,15 @@ +
+ +
diff --git a/src/main.css b/src/main.css index a60d2f1..e30552c 100644 --- a/src/main.css +++ b/src/main.css @@ -14,6 +14,7 @@ --focus-outline: var(--focus-outline-width) var(--focus-outline-style) var(--focus-outline-color); --font-small: 1.2rem; --gap: 2.4rem; + --gap-half: 1.2rem; } ::selection { diff --git a/src/main.js b/src/main.js index e223e7c..832976d 100644 --- a/src/main.js +++ b/src/main.js @@ -259,7 +259,29 @@ const textNoteList = []; // could use indexDB const eventRelayMap = {}; // eventId: [relay1, relay2] const hasEventTag = tag => tag[0] === 'e'; +const dropDuplicateToggle = document.querySelector('#duplicates'); +let dropDuplicate = JSON.parse(localStorage.getItem('filter_duplicates')) ?? true; +dropDuplicateToggle.addEventListener('click', (e) => { + localStorage.setItem('filter_duplicates', e.target.checked); + dropDuplicate = e.target.checked; +}); +dropDuplicateToggle.checked = dropDuplicate; + +function isValidNote(evt) { + if (dropDuplicate) { + const similarEvents = textNoteList.filter(({content}) => content === evt.content); + if (similarEvents?.length >= 5) { + console.info(`DROP event ${evt.id} already got ${similarEvents.length}`, similarEvents); + return false; + } + } + return true; +} + function handleTextNote(evt, relay) { + if (!isValidNote(evt)) { + return; + } if (eventRelayMap[evt.id]) { eventRelayMap[evt.id] = [relay, ...(eventRelayMap[evt.id])]; } else { diff --git a/src/tabs.css b/src/tabs.css index 57a0c07..cac828e 100644 --- a/src/tabs.css +++ b/src/tabs.css @@ -45,7 +45,7 @@ input[type="radio"]:checked + label { .tab-content { max-width: 96ch; min-height: 200px; - padding: calc(.5 * var(--gap)) 0 100px 0; + padding: var(--gap-half) 0 100px 0; } .tabbed { align-items: start;