use attributes of html element type.
so that the following example is correctly typed:
elem('input', {
className: 'foo',
hidden: false,
onclick: () => alert('hi'),
tabIndex: 1,
valueAsNumber: 1,
});
but this fails as foo is no valid attribute on div element:
elem('div', {foo: 'bar'});
typed elem so that it returns the exact type of the HTMLElement,
and that name must be a key of HTMLElementTagNameMap.
example:
elem('form'); // returns HTMLFormElement
elem('abc'); // not assignable to parameter of type 'keyof HTMLElementTagNameMap'
convert pubkey to npub and event id to note and store for
later. use npub and note for uri's so that we dont need to
guess what the view of a specific uri has to render.
this is only the first step that changes uri's, next step is
for the view to react to npub or note and render the
correct view accordingly.
move and typed relay related code to relays.ts
upgrade nostr-tools to latest greatest, major version with
breaking changes:
- relayPool is gone in favor of SimplePool, but this commit just
used relayInit directly as relays should become configurable at
some point
proof of concept to use generic view containers instead of specifc
functions to show and hide particular views.
a view has an identifier (path) which is used to subscribe to
relevant data. changing a view updates the history so that browser
back displays the last view. each view container has its own
scrollbar so that the scrolling position should be preserved when
changing back and forth between different views.
this change also removes CSS tabs in favor of view or overlays
such settings or write a new text note.
profile and notes deeplink use now native HTML anchors to improve
accessibility (copy/paste, open-in-new-tab, search engines).
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
there is currently lots of chinese spam, probably since damus was
accepted in appstore.
temporary disabled damus, snort.social and nostr.info relays, and
added some less known german and swiss relays.
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
relay.snort.social seems to be a popular relay, adding a new one
to the hardcoded list of relays, this should be configurable in
the future.
related damus relay is often not responding or slow, but keeping
it for now.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
instead of just adding 1 line for all replies to point to the
original note, using smaller profile pic for replies of replies
help to understand the context of the replies.
this is done without increasing indentation as heavy nesting can
mess up the layout so only indentation is visible and the space
for the actual content gets to small.
if needed users can inspect replies and navigate to the deeplink
to see how the next 3 levels are nested.
replies were not sorted correctly, reason for this was that an
array of dom elements was sorted, but instead it should sort the
notes.
regression introduced in:
- 2e40a273c4
a fast relay might return a newly published note within the same
second, but nostrweb only shows notes that are older than now.
was introduced in 4a68940681
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
before this change every new incoming text note called a render,
that filters, sorts and iterates all known text notes and creates
missing dom elements and appends into the right place.
this change throttles and debounces (both!) the render function,
that less checks have to be performed, especially on page load
when potentially 100s of events arrive within a short time.
it is important to throttle and debounce, else either the last call
is missed or no render is called while events are being received.
this change surfaced an error in recommend server that depended on
all known text notes already being rendered and inside the dom.
this function should probably be handled by render feed itself.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
some replies rendered twice in different positions, seems to be
related to deprecated positional event tags and a regression
introduced in a596121821
on receiving events it analizes the event tags and stores the id
of the replied event so the client can easily search for replies
later. marked tags are prefered with a fallback to positional tags
as described in nip-10.
mentions are ignored at the moment.
example event that had some replies rendered twice:
22e4ea80161ac591059da611d3ab63c583cb1d47a706826db2fc6955ac0a70b5
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
some words were incorrectly detected as links.
changed:
- split words by any whitespace character, not just char 32
- match words _beginning_ with http, https or www.
example of broken link user white space character code 160, see:
feb290999a2746bf0914ede8a811b52eccd423f9f5373232e4f5947131fb47aa
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
before it was only testing if the nonce commitment is high enough
but didn't verify leading zero bits.
with this change rendering checks now the leading zero bits count
of the event id.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
some notes have a created at field that is 1 year in the future,
these are always shown on to of the feed. changed to only render
notes that are from the past.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
added a slider to adjust the difficulty filter, current default is
0 so all notes are rendered. increasing the filter will hide notes
with lower difficulty target.
changed the max difficulty from 256 to 32 for now so that the
range slider is usable.
this does not yet hide reactions with lower difficulty.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
mining often takes a few seconds. it can be confusing if nothing
happens when a user is publishing their profile, upvoting a note
or posting a new note.
added visual feedback that nostrweb is working with an option to
cancel the mining process.
adding settings to change mining difficulty and timeout, so users
can change or disable pow. also added some explanation and link
to nip-13.
setting arbitrary low default to 16 zero mining difficulty and
5 seconds timeout.
now that nonce tag is always the first element in the tags list,
a bug surfaced that replies from nostrweb did not render anymore.
reason was that the code expected the first tag to be an e tag and
took its reply-id. this commit is a quick fix that takes the first
reply-id from the first e tag.
the proper way is a bit more complicated as nip-10 defines a
preferred and deprecated way.
this is a quick and dirty fix so that replies work with nip-13 pow
events, but nip-10 event tags should be properly supported but in
a later commit.
mining may take a long time if the mining difficulty is high.
calculating pow for text notes, upvotes and profile meta
data now has a timeout of 10s. if the timeout exceeds a user
facing error is shown with the option to try again.
the error is currently very basic, and only displays timeout -
something went wrong, cancel and try again button.
added pow to text notes, reactions and metadata events. pow is
mined async in a worker so that the main process does not freeze.
noxy profile images, link and image previews are now now only
invoked if an event has some valid work proof. noxy can decide
if there is enough work and whether or not to serve data for a
certain event.
target difficulty can be implemented in a later step, this change
only check if there is any valid nonce tag with commitment target
greater than 0.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
the actual event that is being reacted must be the last event tag,
was wrongly using the first one and displayed wrong star if tags
had more than 1 event tag.
upvoting now also includes e and p tags from the event that is
upvoted.
see also https://github.com/nostr-protocol/nips/blob/master/25.md
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
adding damus again (was disabled when it was down and heavy spam
happened last year), remove nostr.sandwich.farm as it currently
errors with '502 Bad Gateway'.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Added deeplinks with browser history support. Each note and author
have now a detail view under nostr.ch/<event-id-or-pubkey> in a
future commit also /e/<event-id> and /p/<pubkey> could be supported.
User can now navigate with browser back (with the expection of the
settings overlay).
Not everything is supported in the detail view (yet) i.e reply and
stars are partially working (dont update visually), leaving this as
open bug. This should fix itself once only 1 render container is
used instead of different divs in the html for each view.
Ideally the detail view should also query for related events,
something to add in a future commit
Notes often miss name or picture of authors if the note was
rendered before any metadata (kind 0) has been recieved.
Update name and picture of existing notes. Pictures are only
updated if a valid url.
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
this is another relay, so we have two to play with. this one is running
on the same machine where live nostrweb is hosted at.
at the moment, relay is running nostr-rs-relay v0.7.2:
$ curl -H 'accept: application/nostr+json' https://relay.nostr.ch/
{
"id": "wss://relay.nostr.ch/",
"name": "a nostr relay",
"description": "just another nostr relay",
"supported_nips": [
1,
2,
9,
11,
12,
15,
16,
20,
22,
26
],
"software": "https://git.sr.ht/~gheartsfield/nostr-rs-relay",
"version": "0.7.2"
}
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Metadata can contain empty fields or broken images. Improved
rendering of meta preview links with missing info, also added a
subtile transparent dark background color to preview images, as
some images contain white text on transparent background and are
invisible in light mode.
On mobile the keyboard covered half of the buttons, changed form
to be aligned at the top of the screen and made textarea a bit
smaller so that the mobile keyboard and the form are both visible.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Instead of just blindly fetch noxy requests, this adds a simple
fetch queue and waits until the pending response is done. It
continues with the next one in the queue whichever seen first,
This is not in chronological order, but incoming event order
(incoming events from different relays are probably out of order).
Only for browsers that support loading=lazy attribute, but this
should reduce the load on noxy and only fetch images that are
relevant (in the viewport of close to it).
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
The pubkey should not always be regenerated when a privatekey is
pasted. The reason is that on paste event is fired before the
privateKeyInput value is updated.
Added code comments on when the condition passes and should be save
to re-generate the pubkey.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
If the user pastes a private-key and the pubkey field is empty,
it should be ok to generate and autofill the pubkey without
confusing the user. There might be circumstances where it is
preferred to see an error if the pubkey does not correspond with
the private key.
Added an on paste event listener that tries to generate and auto-
fill the pubkey (if empty).
Also disabled autocomplete on the settings form to indicate to not
save the key in password manager.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Links should be rendered as anchors so that they are clickable.
For now only links starting with http:// https:// or www. are
supported.
Temporary disabled text notes shortening.
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Move canvas placeholder image to getMetadata so that the logic is
in one place. Also added an exception for pubkeys starting with
at least 6 zeros to invert the color.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
The about page was not linked, added footer section on the settings
view to link to the about page. Also added a link from the about
page to link back to index.html.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
this is a simple static text page showing current version from
the npm package and git commit hash at which the app was built.
it's served at /about.html but i didn't link it from the root.
not sure where the best place is.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
This is an approach to close the reply-to-form automatically when
focus is lost and only if the input is empty. A second way to close
the reply-to-form is provided by toggling the reply icon.
Text notes longer than 280 are shortened and appended with '…' to
indicate that this note can be expanded, but this dotdotdot was
real text and was not removed once the note is expanded.
Changed to showing the dots through CSS and only if the attribute
exists, so it does not show on expanded notes.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Loading images from random url leaks meta data to other servers.
Enabled showing kind 0 picture from noxy (nostr proxy),
see https://git.qcode.ch/nostr/noxy
Only href that are a valid url and use http(s) should be allowed
to prevent malicious urls such as 'javascript:alert(1)'.
Kept the fallback to the speak bubble if there is no kind 0 event
for this pubkey or picture is missing.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Pub and private key settings only showed errors if both values were
truthy, but it did not validate if one input was falsy, in which
case it only showed the last error.
Removed truthy check as it is not needed.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
Safari does not take the addressbar into account when using 100vh,
this is the cauase that the navigation is sometimes hidden when
the user scrolls up/down.
changed to 100dvh with fallback to 100vh.
ci/woodpecker/pr/woodpecker Pipeline was successfulDetails
ci/woodpecker/push/woodpecker Pipeline was successfulDetails
- writing a new message is now presented in full-screen, so that
there are no distractions, i.e. other posts
- added back button and listen to esc key to close new message
- on portrait mode the navigation buttons are now positioned at
the bottom of the screen
- write new message botton (bubble) is also positioned bottomright
- replies now use a line to the last reply instead of indentation,
better use of available space, especially on small screen
- ignore newlines at the end of a post
- added subtile growin effect to the multiline textfield, to hint
that the textarea is growing with more content
Send button should be disabled if there are only white spaces or
newlines, trimming only right as white spaces at the beginning
could mean somethig i.e in markdown.
- use growing textarea input to support multiline textnotes
- keep replyTo id in localstorage instead of global variable
- render reply to form on load if there was a replyTo in storage
- added favicon.ico to get rid of anoying logs in the future
- clicking the idea bubble brings back the text input field
- stop accidentally submitting the reply form
- updated idea cloud to dark/light mode neutral gray
- contact list not needed yet, disabled
- add a detailed list of reactions in star tooltip
- removed debug debounce was for testing chronological feed order
- started username prototype
Added support for starring.
Stores recation events in a reactionMap, so rendering can use it
later.
Improved reply to replies, by keeping a separate replyDomMap.
Changed from heart to star, reason: thumbsup or a heart are good
for positive events, but not so suitable to react to a bad event.
So currently negavtive votes are just counted as a star as well.
Did not add another dom map, but just querySelector in case an
existing star needs to be updated later.
Used different CSS-only tab technique. The implementation before
messed up the whole height of the page and used unnecessary
absolute positioning.
Added comment icon from MFG Labs iconset (SIL)
- https://github.com/MfgLabs/mfglabs-iconset
Added outlined and filled heart from Elusiv icons (SIL)
- https://github.com/dovy/elusive-iconfont
Time ago seconds should be rounded.
Keeping current reply info so it can be accessed later to
publish the reply.
Before only known replies were rendered, now incoming replies
get added to the existing text note instantly. This needs to
create a reply container if this is the first reply of this event.
Added time ago formatting and a helper function that switches
between relative time (if event < 24h) or absolute formatted time
(if older than 1 day).
Styled profile image to be aligned at the top together with the
event metadata and content.
Still need to decide on which relays to enable.
JavaScript lint fixes.
chronological order: Getting there..
cleanup: removed debounce code for now
keep also recommend server events in the dom map, not sure if just
everything should be in the map.
Events should be ordered by created_at.
The randomly incoming events should be injected to their closest
event sibling. Keeping a map of eventIds and dom nodes to reference
and inject the new events.
An alternative to keeping a map could be to add a data-attribute
to each event and use querySelector. It is a trade-off os using
more memory in order to not query the dom tree.