Small contenteditable fix, try using since on feeds

This commit is contained in:
Jonathan Staab 2023-03-25 09:33:59 -05:00
parent d0ccdf4888
commit 855fb68f3a
9 changed files with 58 additions and 33 deletions

View File

@ -1,27 +1,27 @@
module.exports = {
root: true,
env: {
browser: true,
es2021: true
browser: true,
es2021: true,
},
plugins: ['svelte3', '@typescript-eslint'],
plugins: ["svelte3", "@typescript-eslint"],
overrides: [
{
files: ['*.svelte'],
processor: 'svelte3/svelte3'
}
files: ["*.svelte"],
processor: "svelte3/svelte3",
},
],
extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
parser: '@typescript-eslint/parser',
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: "latest",
sourceType: "module",
tsconfigRootDir: __dirname,
project: ['./tsconfig.json'],
extraFileExtensions: ['.svelte']
ecmaVersion: "latest",
sourceType: "module",
tsconfigRootDir: __dirname,
project: ["./tsconfig.json"],
extraFileExtensions: [".svelte"],
},
settings: {
'svelte3/typescript': require('typescript'),
"svelte3/typescript": require("typescript"),
},
rules: {
"a11y-click-events-have-key-events": "off",
@ -30,6 +30,7 @@ module.exports = {
"no-async-promise-executor": "off",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/ban-ts-comment": "off",
"no-useless-escape": "off",
},
ignorePatterns: ["*.svg"],

View File

@ -102,6 +102,7 @@ const listen = async pubkey => {
}
listener = await network.listen({
delay: 5000,
relays: getUserReadRelays(),
filter: [
{kinds: [1, 4], authors: [pubkey], since},

View File

@ -3,7 +3,7 @@
import {fly} from "svelte/transition"
import {navigate} from "svelte-routing"
import {prop, path as getPath, reverse, pluck, uniqBy, sortBy, last} from "ramda"
import {sleep, createScroller, Cursor} from "src/util/misc"
import {sleep, timedelta, createScroller, Cursor} from "src/util/misc"
import Spinner from "src/partials/Spinner.svelte"
import user from "src/agent/user"
import {getPersonWithFallback} from "src/agent/tables"
@ -18,7 +18,9 @@
let loading = sleep(30_000)
let annotatedMessages = []
let showNewMessages = false
let cursor = new Cursor()
let cursor = new Cursor({
delta: timedelta(7, "days"),
})
$: {
// Group messages so we're only showing the person once per chunk

View File

@ -21,6 +21,7 @@
return "nostr:" + nprofile
},
decode: link => {
// @ts-ignore
return nip19.decode(last(link.split(":"))).data.pubkey
},
}
@ -104,7 +105,7 @@
}
const onKeyUp = e => {
const {word, trailingSpaces} = getInfo()
const {word} = getInfo()
// Populate search data
applySearch(word)
@ -146,7 +147,7 @@
const topics = pluck("value", annotations.filter(propEq("prefix", "#")))
// Remove zero-width and non-breaking spaces
content = content.replace(/[\u200B\u00A0]/g, ' ').trim()
content = content.replace(/[\u200B\u00A0]/g, " ").trim()
// We're still using old style mention interpolation until NIP-27
// gets merged https://github.com/nostr-protocol/nips/pull/381/files

View File

@ -7,32 +7,42 @@
return true
}
if (node.tagName === "DIV") {
if (node.tagName === "DIV" && !node.getAttribute?.("style")) {
return true
}
return false
}
const isFancy = node => node instanceof Element && !isLineBreak(node)
const isFancy = node => node instanceof HTMLElement && !isLineBreak(node)
const onInput = e => {
const selection = window.getSelection()
const {focusNode: node, focusOffset: offset} = selection
for (const node of input.childNodes) {
if (isLineBreak(node)) {
continue
}
// Remove gunk that gets copy/pasted, or bold/italic tags that can be added with hotkeys
if (node instanceof Element && !node.dataset.coracle) {
node.replaceWith(document.createTextNode(node.textContent))
if (node instanceof HTMLElement && !node.dataset.coracle) {
const text = document.createTextNode(node.textContent)
if (node.tagName === "DIV") {
const div = document.createElement("div")
div.appendChild(text)
node.replaceWith(div)
} else {
node.replaceWith(text)
}
}
}
const selection = window.getSelection()
const {focusNode: node, focusOffset: offset} = selection
// If we're editing something we've already linked, un-link it
if (node !== input && node.parentNode !== input && isFancy(node.parentNode)) {
// @ts-ignore
node.parentNode.replaceWith(node)
selection.collapse(node, offset)
input.normalize()

View File

@ -123,7 +123,7 @@ export const poll = (t, cb) => {
}
export const createScroller = (loadMore, {reverse = false} = {}) => {
const THRESHOLD = 1200
const THRESHOLD = 2000
// NOTE TO FUTURE SELF
// If the scroller is saturating request channels on a slow relay, the
@ -144,7 +144,7 @@ export const createScroller = (loadMore, {reverse = false} = {}) => {
}
// No need to check all that often
await sleep(1000)
await sleep(500)
if (!done) {
requestAnimationFrame(check)
@ -164,16 +164,21 @@ export const createScroller = (loadMore, {reverse = false} = {}) => {
export const randomChoice = xs => xs[Math.floor(Math.random() * xs.length)]
export class Cursor {
delta: number
since: number
until: number
limit: number
count: number
constructor(limit = 20) {
constructor({limit = 50, delta = timedelta(6, "hours")}) {
this.delta = delta
this.since = now() - delta
this.until = now()
this.limit = limit
this.count = 0
}
getFilter() {
return {
since: this.since,
until: this.until,
limit: this.limit,
}
@ -208,6 +213,8 @@ export class Cursor {
// Only paginate part of the way so we can avoid missing stuff
this.until -= Math.round(gap * scale * this.limit)
}
this.since = Math.min(this.since, this.until) - this.delta
}
}
@ -388,7 +395,7 @@ export const hexToBech32 = (prefix, url) =>
export const bech32ToHex = b32 => utf8.encode(bech32.fromWords(bech32.decode(b32, false).words))
export const numberFmt = new Intl.NumberFormat
export const numberFmt = new Intl.NumberFormat()
export const formatSats = sats => {
if (sats < 1_000) return numberFmt.format(sats)

View File

@ -3,7 +3,7 @@
import {partition, always, propEq, uniqBy, sortBy, prop} from "ramda"
import {fly} from "svelte/transition"
import {quantify} from "hurdak/lib/hurdak"
import {createScroller, now, Cursor} from "src/util/misc"
import {createScroller, now, timedelta, Cursor} from "src/util/misc"
import {asDisplayEvent, mergeFilter} from "src/util/nostr"
import Spinner from "src/partials/Spinner.svelte"
import Content from "src/partials/Content.svelte"
@ -15,6 +15,7 @@
export let filter
export let relays = []
export let delta = timedelta(6, "hours")
export let shouldDisplay = always(true)
export let parentsTimeout = 500
@ -24,7 +25,7 @@
// Add a short buffer so we can get the most possible results for recent notes
const since = now()
const maxNotes = 100
const cursor = new Cursor()
const cursor = new Cursor({delta})
const seen = new Set()
const loadBufferedNotes = () => {

View File

@ -1,6 +1,7 @@
<script lang="ts">
import Feed from "src/views/feed/Feed.svelte"
import {isLike} from "src/util/nostr"
import {timedelta} from "src/util/misc"
import {sampleRelays, getPubkeyWriteRelays} from "src/agent/relays"
export let pubkey
@ -10,4 +11,4 @@
const shouldDisplay = e => isLike(e.content)
</script>
<Feed {relays} {filter} {shouldDisplay} parentsTimeout={10_000} />
<Feed {relays} {filter} {shouldDisplay} parentsTimeout={10_000} delta={timedelta(1, "days")} />

View File

@ -1,4 +1,5 @@
<script lang="ts">
import {timedelta} from "src/util/misc"
import Feed from "src/views/feed/Feed.svelte"
import {sampleRelays, getPubkeyWriteRelays} from "src/agent/relays"
@ -8,4 +9,4 @@
const filter = {kinds: [1], authors: [pubkey]}
</script>
<Feed {relays} {filter} parentsTimeout={3000} />
<Feed {relays} {filter} parentsTimeout={3000} delta={timedelta(1, "days")} />