Compare commits

...

990 Commits

Author SHA1 Message Date
kieran 44a014b8c6
feat: replaceable query filters
continuous-integration/drone/push Build is failing Details
2024-07-17 16:44:35 +01:00
kieran 24a72529c2
chore: bump pkgs
continuous-integration/drone/push Build is failing Details
2024-07-08 10:06:03 +01:00
kieran c39811e700
fix: load social graph for follows only
continuous-integration/drone/push Build is failing Details
2024-07-04 12:23:23 +01:00
kieran 69f6694f5c
chore: extract isRequestSatisfied 2024-07-04 12:19:02 +01:00
kieran dc4758d302
fix: reduce reloads for timeline
continuous-integration/drone/push Build is failing Details
2024-07-04 12:01:01 +01:00
kieran 64ad548d75
refactor: query cache relay once per query emit 2024-07-04 11:45:20 +01:00
kieran 4a48f4f340
feat: remove buildDiff 2024-07-04 11:25:26 +01:00
kieran 8e84dc6a89
fix: apk signer
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-07-01 14:57:46 +01:00
kieran f362389aef chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-07-01 13:48:48 +00:00
kieran 06fae1d916
chore: remove tauri build
continuous-integration/drone/tag Build is failing Details
continuous-integration/drone/push Build is failing Details
2024-07-01 14:47:07 +01:00
kieran a027a4d90a
fix: lockfile 2024-07-01 14:43:45 +01:00
kieran 1e40c1f71d
fix: remove mute list shit
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-07-01 14:31:04 +01:00
kieran 40aa21cb4b
chore: bump pkgs
continuous-integration/drone/push Build is failing Details
2024-06-25 16:16:53 +01:00
kieran bdc94cec8b
refactor: tweak profile loader 2024-06-25 16:14:53 +01:00
kieran 1a405f7796
fix: tweak re-connect
continuous-integration/drone/push Build is failing Details
2024-06-18 12:47:47 +01:00
kieran d8e0c935b9
fix: handle disconnect as connect failure
continuous-integration/drone/push Build is failing Details
2024-06-18 12:26:15 +01:00
kieran 5ea7cd17d8
fix: fail after local relay
continuous-integration/drone/push Build is failing Details
2024-06-18 12:05:28 +01:00
kieran 338c4eb18a
fix: remove cache-relay on connect failed
continuous-integration/drone/push Build is failing Details
2024-06-18 11:24:23 +01:00
kieran e9adb6c724 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-06-18 10:12:55 +00:00
kieran f2b08ce3a7
fix: startup
continuous-integration/drone/push Build is failing Details
2024-06-18 11:11:45 +01:00
kieran 3486f0f8fb
fix: disable version mark script
continuous-integration/drone/push Build is failing Details
2024-06-18 11:06:02 +01:00
kieran 66172d18e6
fix: remove inline sw registration (CSP)
continuous-integration/drone/push Build is failing Details
2024-06-18 11:02:48 +01:00
kieran dd45d1f428
fix: then null prop
continuous-integration/drone/push Build is failing Details
2024-06-18 10:52:23 +01:00
kieran 87a2742c26 chore: Update translations
continuous-integration/drone/push Build is running Details
2024-06-18 09:51:58 +00:00
kieran 229c34eab7
fix: disable for you feed using localhost relay
continuous-integration/drone/push Build is failing Details
2024-06-18 10:50:49 +01:00
kieran 37000ecc7a
feat: use localhost relay over worker-relay
continuous-integration/drone/push Build is failing Details
2024-06-18 10:49:29 +01:00
kieran 44435db21d
fix: fetch results
continuous-integration/drone/push Build is failing Details
2024-06-18 10:09:41 +01:00
kieran 64a34e43f0
fix: build
continuous-integration/drone/push Build is failing Details
2024-06-17 14:28:41 +01:00
kieran e26b881297
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-06-17 14:26:46 +01:00
kieran 5bd00491f6
chore: cleanup worker relay 2024-06-17 14:26:46 +01:00
kieran 471c10feb0 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-06-17 13:21:50 +00:00
kieran a31c054326
chore: cache compressed filters
continuous-integration/drone/push Build is failing Details
2024-06-17 14:20:26 +01:00
kieran 240c3ba1c3 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-06-05 14:39:17 +00:00
kieran ebc45ae9c1
chore: move sqlite files
continuous-integration/drone/push Build is failing Details
fix: debug print for deletes
2024-06-05 15:33:11 +01:00
kieran b2b25377cd
chore: bump pkgs
continuous-integration/drone/push Build encountered an error Details
2024-06-05 14:26:13 +01:00
kieran c47d8e7dcd
feat: dev-docs
continuous-integration/drone/push Build encountered an error Details
2024-06-05 13:25:34 +01:00
kieran 57bf51c41c
refactor: move connection sync module
continuous-integration/drone/push Build encountered an error Details
2024-06-05 13:08:55 +01:00
kieran 4185f117cb
chore: adjust sync method
continuous-integration/drone/push Build encountered an error Details
2024-06-04 13:16:27 +01:00
Kieran de1504b4bf chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-06-03 08:04:37 +00:00
Kieran 5eb5255ed8
fix: lockfile
continuous-integration/drone/push Build is failing Details
2024-06-03 09:03:34 +01:00
Kieran 8feb178ed5
Merge pull request #585 from enjikaka/feature/tidal-encrypted-media
continuous-integration/drone/push Build is failing Details
[TIDAL Embeds] Add allow and sandbox attributes
2024-06-03 08:59:36 +01:00
Jeremy Karlsson 0c90f248fd
Add allow and sandbox attributes to TIDAL Embeds. 2024-06-03 09:53:53 +02:00
kieran f2f8b6b225
chore: ToNostrEventTag.equals
continuous-integration/drone/push Build is failing Details
2024-05-28 13:09:34 +01:00
kieran bc2169a186
chore: bump packages
continuous-integration/drone/push Build is failing Details
2024-05-23 12:06:23 +01:00
kieran b764cc1535
feat: worker-relay delete
continuous-integration/drone/push Build is failing Details
fix: worker-relay insert replacable events duplicate
2024-05-23 11:59:48 +01:00
kieran bb5bf34fe9
chore: bump system-wasm
continuous-integration/drone/push Build is failing Details
2024-05-22 20:14:40 +01:00
kieran 1c29e3b1c6 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-05-22 17:38:06 +00:00
kieran 6cbc3aeb7f
fix: lazy init nip46, no pubkey
continuous-integration/drone/push Build is failing Details
2024-05-22 18:24:51 +01:00
kieran 9e896c5c27 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-05-15 14:54:03 +00:00
kieran 1512f38e7c
chore: bump pkgs
continuous-integration/drone/push Build is failing Details
2024-05-15 15:52:55 +01:00
kieran bb2b0901c4 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-05-14 12:17:32 +00:00
kieran 5763d91e8a
feat: NIP-96 server list
continuous-integration/drone/push Build is failing Details
2024-05-14 13:16:03 +01:00
kieran 7d0d3030f4
fix: attach file extension to nip96 uploads 2024-05-14 12:16:27 +01:00
kieran f8f54a4e50
fix: service worker bug
continuous-integration/drone/push Build is failing Details
2024-05-13 14:54:03 +01:00
kieran 9b99d0e2ea
chore: add cache-control headers for service-worker.js
continuous-integration/drone/push Build is failing Details
2024-05-13 14:45:58 +01:00
kieran 8daadb47c2 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-05-13 13:34:11 +00:00
kieran 1060122263
fix: service worker
continuous-integration/drone/push Build is failing Details
2024-05-13 14:33:14 +01:00
kieran 9feb98f277 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-05-13 13:20:49 +00:00
kieran b5ca5327db
feat: custom nip96 server
continuous-integration/drone/push Build is failing Details
2024-05-13 14:19:28 +01:00
kieran ecd3876287 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-05-09 10:40:29 +00:00
kieran 7b781f38df
fix: lockfile
continuous-integration/drone/push Build is failing Details
2024-05-09 11:38:53 +01:00
kieran ef9efb0422
chore: default uploads to nostr.build
continuous-integration/drone/push Build is failing Details
2024-05-09 11:32:32 +01:00
kieran eef43d68d7
chore: bump
continuous-integration/drone/push Build encountered an error Details
2024-05-01 18:23:15 +01:00
kieran 746021d40a
fix: isReplyToThis 2024-05-01 18:22:11 +01:00
kieran e4f611834e
fix: nip96 bugs
continuous-integration/drone/push Build encountered an error Details
2024-05-01 17:58:40 +01:00
kieran 1c44eeabf2
chore: bump pkgs
continuous-integration/drone/push Build encountered an error Details
2024-05-01 11:13:18 +01:00
kieran 2ceddf40b9
fix: simplify reply check 2024-05-01 11:11:04 +01:00
kieran d3bcb75f3a
fix: select state.version for selector hook
continuous-integration/drone/push Build encountered an error Details
2024-05-01 10:52:24 +01:00
kieran 6398e470ef
fix: follow graph / readonly login
continuous-integration/drone/push Build encountered an error Details
2024-05-01 10:34:28 +01:00
kieran 778ce1a24f
chore: delete files
continuous-integration/drone/push Build encountered an error Details
2024-05-01 09:50:50 +01:00
kieran 4873e0ad72
chore: deploy:notestr
continuous-integration/drone/push Build encountered an error Details
2024-04-30 10:22:45 +01:00
kieran ddd1b3e83f
fix: startup bad migration
continuous-integration/drone/push Build encountered an error Details
2024-04-29 17:45:25 +01:00
kieran 87144d9395
refactor: upgrade nip17 2024-04-29 17:41:11 +01:00
kieran c775236438
chore: enable nip44 on nip7 signer 2024-04-29 15:55:35 +01:00
kieran a6707c111f
chore: some notification fixes
continuous-integration/drone/push Build encountered an error Details
2024-04-29 13:52:07 +01:00
kieran b199d1a366
fix: sync contacts
continuous-integration/drone/push Build encountered an error Details
2024-04-29 11:39:26 +01:00
kieran a17c98ad25
fix: muted words
continuous-integration/drone/push Build encountered an error Details
2024-04-29 11:22:26 +01:00
kieran 08d4a73ca6
fix: unknown thread context
continuous-integration/drone/push Build is running Details
2024-04-29 11:01:55 +01:00
kieran 76a561624c
fix: missing words
continuous-integration/drone/push Build encountered an error Details
2024-04-29 10:54:06 +01:00
kieran a591a3c176
chore: meku fixes
continuous-integration/drone/push Build encountered an error Details
2024-04-29 10:21:28 +01:00
kieran 9abb236ede
chore: add meku config
continuous-integration/drone/push Build encountered an error Details
2024-04-29 10:06:08 +01:00
kieran e6faf5d3ad
chore: use babel transformer for formatted message id
continuous-integration/drone/push Build encountered an error Details
2024-04-29 09:54:41 +01:00
kieran b642f13d36
fix: displayAs
continuous-integration/drone/push Build encountered an error Details
2024-04-26 14:28:24 +01:00
kieran 85261eaeab
chore: formatting
continuous-integration/drone/push Build encountered an error Details
2024-04-26 14:06:53 +01:00
kieran b7d2c599e1
feat: new timeline render flow 2024-04-26 14:06:52 +01:00
kieran 38af05edb8
fix: connection race 2024-04-26 14:06:52 +01:00
kieran 5af182c1bd
chore: reduce notifications view size 2024-04-26 14:06:51 +01:00
kieran d0d30cb94f
fix: reconnect spam 2024-04-26 14:06:51 +01:00
kieran 52688e6389
fix: reactions loading 2024-04-26 14:06:51 +01:00
kieran a6a1198f04 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-04-24 11:09:57 +00:00
kieran 9ad5c2fa70
chore: setup ngit
continuous-integration/drone/push Build is running Details
2024-04-24 12:08:15 +01:00
kieran 986a7afd42
chore: update tauri
continuous-integration/drone/push Build is failing Details
2024-04-23 16:05:13 +01:00
kieran a3299ab29a
fix: various
continuous-integration/drone/push Build is failing Details
2024-04-23 15:43:07 +01:00
kieran 9ddd8fc6c2
fix: connection props
continuous-integration/drone/push Build is failing Details
2024-04-23 13:39:53 +01:00
kieran eee76e64e5
feat: NDK (WIP)
continuous-integration/drone/push Build is failing Details
2024-04-23 13:08:45 +01:00
kieran ea54ee2b00 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-04-22 20:17:01 +00:00
kieran ee9f941b11
fix: moderation updates
continuous-integration/drone/push Build is running Details
2024-04-22 21:15:43 +01:00
kieran bfdcbca08b
fix: build
continuous-integration/drone/push Build encountered an error Details
2024-04-22 15:24:25 +01:00
kieran 80a4b5d8e6
feat: UserState
continuous-integration/drone/push Build is failing Details
2024-04-22 14:38:14 +01:00
kieran 5a7657a95d
feat: diff-sync follows
continuous-integration/drone/push Build is failing Details
2024-04-15 22:31:51 +01:00
kieran edf64e4125
feat: safe sync appdata 2024-04-15 13:23:26 +01:00
kieran a089ae2ec6
fix: push-prod
continuous-integration/drone/push Build is failing Details
2024-04-12 18:44:14 +01:00
kieran 4384c638b9
fix: build order
continuous-integration/drone/push Build is running Details
2024-04-12 18:43:26 +01:00
kieran ecd74fbb12
fix: push-prod
continuous-integration/drone/push Build encountered an error Details
2024-04-12 18:40:26 +01:00
kieran 0ab896923e chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-04-12 17:32:02 +00:00
kieran 3c3e35ad4f
chore: remove debug
continuous-integration/drone/push Build is running Details
2024-04-12 18:31:06 +01:00
kieran e5c8634c59
feat: insertBatchSize 2024-04-12 18:28:50 +01:00
kieran e62bb58362
feat: redirect to login when attempting reaction while logged out
continuous-integration/drone/push Build encountered an error Details
closes #680
2024-04-12 13:53:53 +01:00
kieran 64703cf05d
chore: update reactions modal icons
continuous-integration/drone/push Build encountered an error Details
closes #683
2024-04-12 13:39:26 +01:00
kieran 6a96afc82c
chore: remove dislike
continuous-integration/drone/push Build encountered an error Details
closes #685
2024-04-12 13:23:22 +01:00
kieran 0babc928fa
feat: profile card timming
continuous-integration/drone/push Build encountered an error Details
closes #687
2024-04-12 13:19:35 +01:00
kieran 77178bc728 chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-04-12 12:07:26 +00:00
kieran b4bcc4d371
fix: plain image link preview size
continuous-integration/drone/push Build is running Details
2024-04-12 13:06:36 +01:00
kieran 8d306ce466
feat: render embeds from link preview
continuous-integration/drone/push Build encountered an error Details
closes #693
2024-04-12 12:59:40 +01:00
kieran 5292b8880e
closes #709 2024-04-12 12:14:03 +01:00
kieran 3e32bc7789
fix: topic buttons
closes #711
2024-04-12 12:12:40 +01:00
kieran 19d72722db
feat: improve key export page
closes #712
2024-04-12 12:09:51 +01:00
kieran f601e88b8f
refactor: cleanup ecash nuts embed
closes #718
2024-04-12 11:56:10 +01:00
kieran 2f76dd9b10
closes #720
continuous-integration/drone/push Build encountered an error Details
2024-04-12 11:38:40 +01:00
kieran eea2fdfc12 chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-04-12 10:34:10 +00:00
kieran e98b7fa17e
fix: remove reposts from grid
continuous-integration/drone/push Build is running Details
closes #722
2024-04-12 11:33:27 +01:00
kieran 81827dec96 chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-04-12 10:20:32 +00:00
kieran 9a88b52b25
fix: hashtag parser
continuous-integration/drone/push Build is running Details
closes #728
2024-04-12 11:19:46 +01:00
kieran 5c5c31aadf chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-04-12 10:10:29 +00:00
kieran 12cf7380a5
feat: Unified NWC icon
continuous-integration/drone/push Build is running Details
closes #732
2024-04-12 11:09:34 +01:00
kieran 06e8f1fd73
chore: enable KO translations
continuous-integration/drone/push Build encountered an error Details
closes #735
2024-04-12 11:04:54 +01:00
kieran 6394e65400
fix: deps
continuous-integration/drone/push Build is failing Details
2024-04-11 14:47:02 +01:00
kieran 0720d40cc1
bump
continuous-integration/drone/push Build encountered an error Details
2024-04-11 14:45:22 +01:00
kieran 93ea3e8e80
chore: fixes
continuous-integration/drone/push Build encountered an error Details
2024-04-11 14:43:05 +01:00
kieran 27a111466a chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-04-11 12:30:12 +00:00
kieran 8137317bfe
refactor: extract wallet system
continuous-integration/drone/push Build is running Details
2024-04-11 13:27:21 +01:00
Martti Malmi d1095847d8 link to subscriptions page from renew task
continuous-integration/drone/push Build is failing Details
2024-04-11 15:11:11 +03:00
Martti Malmi 746a4177cf fix typo 2024-04-09 22:44:50 +03:00
kieran 95b160dd04
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-04-05 14:13:12 +01:00
kieran a938e466d7
refactor: outbox (inbox query) improvements
feat: sync account tool
2024-04-05 14:13:12 +01:00
kieran a88fda2a22 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-04-04 15:32:59 +00:00
kieran ee31726961
refactor: thread loading improvements
continuous-integration/drone/push Build is running Details
2024-04-04 16:30:46 +01:00
kieran ad2b6dbcf7 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-04-04 10:21:38 +00:00
kieran d0427040b9
Merge remote-tracking branch 'brugeman/fix/nip46-main'
continuous-integration/drone/push Build is running Details
2024-04-04 11:20:17 +01:00
kieran 8c9cc7931a
Merge remote-tracking branch 'alex4/avatar-zapsplit-fix'
continuous-integration/drone/push Build is failing Details
2024-04-04 11:13:37 +01:00
Kieran a3f1393999 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-03-19 12:04:21 +00:00
Kieran 382f9b6e1b fix: remove COEP
continuous-integration/drone/push Build is failing Details
2024-03-19 12:01:27 +00:00
Kieran c8b8daeb29 tweak avatars 2024-03-19 12:01:27 +00:00
Martti Malmi f20db30062 update iris & nostr/_headers
continuous-integration/drone/push Build is failing Details
2024-03-14 10:50:35 +02:00
Martti Malmi ead73d06a8 rm localhost relay from iris.json 2024-03-14 10:48:36 +02:00
artur 4f7b9f1b99 Add oauth event handler everywhere, dedup auth_url handling, add requested perms, add since to reply filter 2024-03-08 08:49:36 +03:00
Kieran 4a7073b231 fix: service-worker
continuous-integration/drone/push Build is failing Details
2024-03-07 17:08:51 +00:00
Kieran 2b98f0fc4a Merge branch 'main' of https://git.v0l.io/Kieran/snort
continuous-integration/drone/push Build is failing Details
2024-03-07 16:38:27 +00:00
Kieran f937c0edfa chore: remove COOP/COEP 2024-03-07 16:38:22 +00:00
Kieran a2fe2255c8 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-03-07 14:12:50 +00:00
Kieran 583aff433c chore: bump pkg
continuous-integration/drone/push Build is failing Details
2024-03-07 13:59:56 +00:00
Kieran 3153f632c7 fix: multiple tag queries
continuous-integration/drone/push Build was killed Details
2024-03-07 13:58:56 +00:00
Kieran dbf2346176 fix: main branch
continuous-integration/drone/push Build is failing Details
2024-03-07 13:42:29 +00:00
Kieran 782feedae4 refactor: always fallback to in-memory relay
continuous-integration/drone/push Build is failing Details
2024-03-04 16:51:14 +00:00
Kieran 098251fee3 fix: embed sqlite3.wasm in lib for production builds
continuous-integration/drone/push Build is failing Details
2024-03-04 15:25:15 +00:00
Kieran 99b4d01ff7 fix: remove bad URL constructor
continuous-integration/drone/push Build is failing Details
2024-03-04 13:09:09 +00:00
Kieran 6785ef72e1 Merge branch 'main' of https://git.v0l.io/Kieran/snort 2024-03-04 12:23:23 +00:00
Kieran 226618ac77 refactor: fix worker-relay for external users 2024-03-04 12:22:48 +00:00
Martti Malmi 780b3ebe1c chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-03-04 08:48:13 +00:00
Martti Malmi 23584205aa failing thread root load, show current note
continuous-integration/drone/push Build is failing Details
2024-03-04 10:44:54 +02:00
Martti Malmi 1f4427641e chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-03-04 08:38:01 +00:00
Martti Malmi da099ca214 fix deck clickable articles
continuous-integration/drone/push Build is failing Details
2024-03-04 10:29:00 +02:00
Martti Malmi 2f1f2a5e97 fix note search, rm sort:popular
continuous-integration/drone/push Build is failing Details
2024-03-04 10:13:52 +02:00
Martti Malmi 65552604dc nostr-system fx[1]?.length 2024-02-29 22:56:47 +02:00
Martti Malmi 1fbff0d04a Deck dir
continuous-integration/drone/push Build is failing Details
2024-02-29 21:19:47 +02:00
Kieran a0aa86a0b3 delete command on timeout
continuous-integration/drone/push Build is failing Details
2024-02-29 12:13:08 +00:00
Kieran ed7929db50 worker-relay error timeout
continuous-integration/drone/push Build was killed Details
2024-02-29 12:11:49 +00:00
Kieran be48c9cc37 fix: duplicate relays 2024-02-29 12:11:21 +00:00
Martti Malmi 5796892e54 shorten some files
continuous-integration/drone/push Build is failing Details
2024-02-29 12:02:27 +02:00
Martti Malmi 95dc979b8d fix highlighted text in searched notes
continuous-integration/drone/push Build is failing Details
2024-02-29 11:14:17 +02:00
Martti Malmi 04e7d0b54f split NoteContextMenu
continuous-integration/drone/push Build is failing Details
2024-02-28 13:01:35 +02:00
Martti Malmi bf4e9c9776 split ZapPool 2024-02-28 12:57:26 +02:00
Martti Malmi 8fef783cf8 split Menu 2024-02-28 12:53:35 +02:00
Martti Malmi a9c7edb09d split Thread into smaller files
continuous-integration/drone/push Build is failing Details
2024-02-27 17:01:39 +02:00
Martti Malmi a5532b23f3 stringify worker error msg
continuous-integration/drone/push Build is failing Details
2024-02-27 13:53:26 +02:00
Martti Malmi ce5fbf0819 don't reload for you feed on refresh
continuous-integration/drone/push Build is failing Details
2024-02-27 12:36:16 +02:00
Kieran 5e1af603b7 refactor: preload with follow list
continuous-integration/drone/push Build is failing Details
2024-02-22 11:46:53 +00:00
Kieran 670898c016 chore: bump system-react
continuous-integration/drone/push Build is failing Details
2024-02-22 11:14:37 +00:00
Kieran 7558e91d28 feat: automate social graph 2024-02-22 11:12:26 +00:00
Kieran 3f0bd88db8 chore: bump system-react
continuous-integration/drone/push Build is failing Details
2024-02-20 11:32:08 +00:00
Kieran 8b9acd3109 feat: abstract OutboxModel into RequestRouter
continuous-integration/drone/push Build was killed Details
2024-02-20 11:28:02 +00:00
Martti Malmi e5f8bebb53 iframes broken on some browsers, show link url
continuous-integration/drone/push Build is failing Details
2024-02-16 10:44:08 +02:00
Martti Malmi 86906682f9 always scroll to top on route change, except on back nav
continuous-integration/drone/push Build is failing Details
2024-02-16 10:28:07 +02:00
Kieran 73753c2764 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-15 16:52:37 +00:00
Kieran 1be9254221 bump system-react
continuous-integration/drone/push Build is failing Details
2024-02-15 16:45:09 +00:00
Kieran eedbe90197 fix: oAuth bugs
continuous-integration/drone/push Build is failing Details
2024-02-15 15:35:24 +00:00
Kieran c19e7ad20c feat: NIP-46 oAuth sign up
continuous-integration/drone/push Build is failing Details
2024-02-15 11:40:05 +00:00
Kieran 0d9d5a0a4c feat: nip46 oAuth login 2024-02-15 11:28:09 +00:00
Martti Malmi 512307f42d fix feed glitch by memoizing NoteText
continuous-integration/drone/push Build is failing Details
2024-02-12 12:54:29 +02:00
Martti Malmi 96947fad2e chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-12 10:46:03 +00:00
Martti Malmi e2164800a9 scroll to top on opening notifications & thread pages
continuous-integration/drone/push Build is running Details
2024-02-12 12:36:34 +02:00
Martti Malmi ff5d2ee32d chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-12 10:17:34 +00:00
Martti Malmi 48ba5cecbd chore: Update translations
continuous-integration/drone/push Build is running Details
2024-02-12 10:14:53 +00:00
Martti Malmi 6022b6007a chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-12 10:13:20 +00:00
Martti Malmi b0f230e70d chore: Update translations
continuous-integration/drone/push Build is running Details
2024-02-12 10:11:56 +00:00
Martti Malmi a66361049d chore: Update translations
continuous-integration/drone/push Build is running Details
2024-02-12 10:08:43 +00:00
Martti Malmi 875996347b chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-12 10:07:12 +00:00
Martti Malmi c43d0c7a86 chore: Update translations
continuous-integration/drone/push Build is running Details
2024-02-12 10:06:01 +00:00
Martti Malmi ac4028f191 chore: Update translations
continuous-integration/drone/push Build is running Details
2024-02-12 10:04:39 +00:00
Martti Malmi 18c366502c defaultPreferences.defaultRootTab
continuous-integration/drone/push Build is running Details
2024-02-12 11:57:30 +02:00
Martti Malmi 3e43300077 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-12 08:51:27 +00:00
Martti Malmi 2d74f55e06 quick signup (iris)
continuous-integration/drone/push Build is failing Details
2024-02-12 10:44:00 +02:00
Martti Malmi 248b35d3ca fix: ensure __migration table exists
continuous-integration/drone/push Build is failing Details
2024-02-07 11:06:54 +02:00
Martti Malmi 2f0b4f8d96 handle invalid tags 2024-02-07 11:06:54 +02:00
Martti Malmi d1129b3b15 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-07 08:49:58 +00:00
Martti Malmi b07961802c reactions tab
continuous-integration/drone/push Build is running Details
2024-02-07 10:36:17 +02:00
Martti Malmi df16384f07 seen_at db index, migrations, img crossorigin, errorpage clear opfs
continuous-integration/drone/push Build is failing Details
2024-02-07 09:22:28 +02:00
Martti Malmi edbfa02c52 ask relays for some ForYou feed events
continuous-integration/drone/push Build is failing Details
2024-02-06 11:05:27 +02:00
Martti Malmi 0a05cf864c note layout fix
continuous-integration/drone/push Build is failing Details
2024-02-05 23:31:26 +02:00
Martti Malmi 47e0c5a8cc change note seen timeout 2000 -> 1000 2024-02-05 12:39:28 +02:00
Martti Malmi 280a7eaac2 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-05 10:01:12 +00:00
Martti Malmi aefe8a8210 LRUCache ParsedZaps, import from system dir in worker
continuous-integration/drone/push Build is running Details
2024-02-05 11:50:05 +02:00
Martti Malmi a97e895cb8 fix rendering glitch 2024-02-05 11:14:05 +02:00
Martti Malmi 7ceab04cbc set event seen_at times, sort by seen_at in ForYouFeed 2024-02-05 11:06:46 +02:00
Martti Malmi 5bc3c10d36 move for you feed creation to worker 2024-02-05 11:06:46 +02:00
Martti Malmi 351a249a32 migrations file, add seen_at column to events 2024-02-05 11:06:46 +02:00
Alex Gleason e0e0a857b0
Fix avatar CSS on zap splits
continuous-integration/drone/pr Build is failing Details
2024-02-04 16:23:57 -06:00
Martti Malmi c5e534a730 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-04 05:56:15 +00:00
Martti Malmi 2099eddebc show reply count in feed
continuous-integration/drone/push Build is running Details
2024-02-04 07:50:45 +02:00
Martti Malmi d42d26fc20 tauri config & readme 2024-02-04 07:28:03 +02:00
Martti Malmi 006cad49bb chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-03 18:39:27 +00:00
Martti Malmi e652cc7703 ForYou
continuous-integration/drone/push Build is running Details
2024-02-03 20:34:19 +02:00
Martti Malmi c23856daf4 NavSidebar select-none 2024-02-03 20:34:19 +02:00
Martti Malmi 3c017f89be ForYou: favor recentness in most notes 2024-02-03 20:34:19 +02:00
Martti Malmi e2ab1b4e3f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-03 15:15:03 +00:00
Martti Malmi d0bc8df6a1 ForYou: events from favorite authors, debug logging
continuous-integration/drone/push Build is running Details
2024-02-03 17:09:00 +02:00
Martti Malmi e746109f5c mix some recent events into the for you feed 2024-02-03 17:09:00 +02:00
Martti Malmi 0716fb4752 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-03 13:01:42 +00:00
Martti Malmi 2ab7e63e55 common like counts in scoring
continuous-integration/drone/push Build is running Details
2024-02-03 14:55:18 +02:00
Martti Malmi 4dff677809 global tab fix, root tab routing 2024-02-03 13:38:03 +02:00
Martti Malmi ce2218bc93 exclude your own events from ForYou 2024-02-03 12:43:07 +02:00
Martti Malmi f4ab402e34 for you 2024-02-03 00:32:45 +02:00
Martti Malmi 19a396c7d3 better feed algo 2024-02-03 00:28:54 +02:00
Martti Malmi 35ec58377c for you feed etc 2024-02-02 23:20:34 +02:00
Martti Malmi 2ab2001014 add times to notifications
continuous-integration/drone/push Build is failing Details
2024-02-02 16:06:47 +02:00
Martti Malmi 5ea195a341 show (disabled) repost btn even when not logged in
continuous-integration/drone/push Build is failing Details
2024-02-02 15:46:34 +02:00
Martti Malmi 523fd1a0ba notifs style 2024-02-02 15:46:34 +02:00
Martti Malmi 1fd37a42d2 orderDescending not needed with SortedMap 2024-02-02 15:46:34 +02:00
Martti Malmi cdd814cf73 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-02 12:03:21 +00:00
Martti Malmi 8c9381fc6c AutoLoadMore
continuous-integration/drone/push Build is running Details
2024-02-02 13:57:17 +02:00
Martti Malmi 6feac60a4a chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-02 10:23:49 +00:00
Martti Malmi f3272bed57 move loadMore button to TimelineRenderer
continuous-integration/drone/push Build is running Details
2024-02-02 12:17:14 +02:00
Martti Malmi 3fa4dbf100 img cursor-pointer
continuous-integration/drone/push Build is failing Details
2024-02-02 11:04:15 +02:00
Martti Malmi a9c8fd9ba5 img grid load more btn
continuous-integration/drone/push Build is failing Details
2024-02-02 10:47:49 +02:00
Martti Malmi 4b335faa36 debounce profile search from relays
continuous-integration/drone/push Build is failing Details
2024-02-02 09:21:26 +02:00
Martti Malmi cfb9c4adfd send REQ with ids_only unchanged 2024-02-02 08:41:55 +02:00
Martti Malmi 6bc5387afc link to profile from chat
continuous-integration/drone/push Build is failing Details
2024-02-01 10:35:45 +02:00
Martti Malmi cd5cc07857 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-02-01 08:17:27 +00:00
Martti Malmi 13a773a1ad check alreadyHaves from system.cacheRelay
continuous-integration/drone/push Build is running Details
2024-02-01 10:11:12 +02:00
Martti Malmi eb9f23b73b add https:// to youtube urls in _headers
continuous-integration/drone/push Build is failing Details
2024-01-31 21:16:10 +02:00
Martti Malmi e88cc64cb2 add iris.json alby oauth config
continuous-integration/drone/push Build is failing Details
2024-01-31 15:22:44 +02:00
Martti Malmi 0de93a0a53 no ids_only in negentropy msgs, GET in rsp to HAVE
continuous-integration/drone/push Build is running Details
2024-01-31 15:15:22 +02:00
Martti Malmi 579589f635 nip-114: filter.ids_only, HAVE message 2024-01-31 13:55:35 +02:00
Kieran 7c1f2c539f Merge pull request 'Donate page update' (#730) from trycatchkamal/snort:main into main
continuous-integration/drone/push Build is failing Details
Reviewed-on: #730
2024-01-31 09:57:18 +00:00
Kamal Raj Sekar ce4d99dc88 updated contributors list
continuous-integration/drone/pr Build is failing Details
2024-01-31 01:50:59 +00:00
Kieran 74d6cc9932
fix: lockfile
continuous-integration/drone/push Build is failing Details
2024-01-30 23:02:39 +00:00
Kieran 07510d92ca
refactor: include relays in kind3
continuous-integration/drone/push Build is failing Details
2024-01-30 22:38:23 +00:00
Kieran ad8d0af976
chore: bump pacakges
continuous-integration/drone/push Build is failing Details
2024-01-30 22:04:29 +00:00
Kieran 2ef1b591e2 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-30 20:38:48 +00:00
Kieran a7c0cf7397
chore: add worker-relay readme
continuous-integration/drone/push Build is running Details
2024-01-30 20:32:43 +00:00
Kieran a14a5fa96b
chore: publish worker-relay 2024-01-30 20:09:38 +00:00
Kieran 8c19f4de68
chore: Remove here map 2024-01-30 20:09:38 +00:00
Kieran 5fc844b911 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-29 14:46:38 +00:00
Kieran 14c8c9a080
feat: render NIP-107 data
continuous-integration/drone/push Build is failing Details
2024-01-29 14:38:31 +00:00
Martti Malmi 470e5b31ce update preview api url in sw
continuous-integration/drone/push Build is failing Details
2024-01-27 10:26:27 +02:00
Martti Malmi 82d5b9fb64 note translation sw & lru cache
continuous-integration/drone/push Build was killed Details
2024-01-27 10:20:19 +02:00
Martti Malmi dc99d2a653 SearchBox: ask relays
continuous-integration/drone/push Build is failing Details
2024-01-26 20:36:05 +02:00
Martti Malmi e343c5cb9b add headers to iris 2024-01-26 19:58:48 +02:00
Kieran b07f9abe16
fix: infinite scroll
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-01-26 17:22:02 +00:00
Kieran 404a07f45a
fix: docker build
continuous-integration/drone/push Build is failing Details
2024-01-26 16:55:30 +00:00
Kieran 3fb7b7adc4
fix: ci buildx push
continuous-integration/drone/push Build is failing Details
2024-01-26 15:42:00 +00:00
Kieran 28f7133236
fix: ci add builx builder
continuous-integration/drone/push Build is failing Details
2024-01-26 15:37:51 +00:00
Kieran c18f8eddbb
fix: ci build command
continuous-integration/drone/push Build is failing Details
2024-01-26 15:29:40 +00:00
Kieran d55c9ad122
fix: ci try node:current img
continuous-integration/drone/push Build is failing Details
2024-01-26 15:23:27 +00:00
Kieran fea7a9a63a
chore: update vite
continuous-integration/drone/push Build is failing Details
2024-01-26 15:17:29 +00:00
Kieran 5d9b306d41
fix: drone build
continuous-integration/drone/push Build is failing Details
2024-01-26 15:05:14 +00:00
Kieran 8061410333
fix: NWC wrong method names
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2024-01-26 13:37:49 +00:00
Kieran 52b52deb72
chore: remove unused
continuous-integration/drone/push Build is failing Details
2024-01-26 13:34:31 +00:00
Kieran 68583e24b8
chore: always show deck link
continuous-integration/drone/push Build is failing Details
2024-01-26 13:30:48 +00:00
Kieran 88766c6c08
chore: formatting 2024-01-26 13:29:59 +00:00
Kieran c8c0cc2ac5
fix: dm chat list hidden on mobile 2024-01-26 13:29:15 +00:00
Kieran 3355822bcd
chore: release notes 2024-01-26 13:14:18 +00:00
Kieran 0fd8cf3f49
fix: profile page notes
continuous-integration/drone/push Build is failing Details
2024-01-26 12:17:47 +00:00
Kieran 1aaee2a2cb
chore: cleanup
continuous-integration/drone/push Build is failing Details
2024-01-26 11:47:25 +00:00
Kieran dae96109b8 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-26 11:26:24 +00:00
Kieran f9a0516718
fix: null relay tag in event reply
continuous-integration/drone/push Build is failing Details
2024-01-26 11:24:58 +00:00
Kieran d3e6ddc64c
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-01-26 11:18:23 +00:00
Kieran 7a6637a86f
feat: query save/restore 2024-01-26 11:18:23 +00:00
Kieran 22863a289d
fix: notification avatar overflow
refactor: sort notification group avatar by WoT score
2024-01-26 11:18:23 +00:00
Kieran f10ad6dd53
fix: profile mentions 2024-01-26 11:18:22 +00:00
Kieran d3873ea281
fix: preload 2024-01-26 11:18:22 +00:00
Kieran 4f4649da2c
feat: price chart 2024-01-26 11:18:22 +00:00
Kieran 9a220fafd5
refactor: revert LocalSearch 2024-01-26 11:18:22 +00:00
Kieran e72f779ab7 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-25 16:24:41 +00:00
Kieran 9a3207bfa3
feat: add fallback sync
continuous-integration/drone/push Build is running Details
2024-01-25 16:02:16 +00:00
Kieran d7460651c8
feat: negentropy 2024-01-25 15:21:42 +00:00
Kieran 9a0bbb8b74
refactor: hashtags timeline weaver to worker relay 2024-01-24 11:43:51 +00:00
Kieran f9d08267a6 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-23 22:24:52 +00:00
Kieran e9d9bf34d8
refactor: migrate chats to relay worker cache
continuous-integration/drone/push Build is failing Details
2024-01-23 22:16:53 +00:00
Kieran c968fa43a6 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-23 15:47:12 +00:00
Kieran 982f4df0a3
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-01-23 15:36:48 +00:00
Kieran 5cea096067
feat: @snort/system CacheRelay 2024-01-23 15:35:28 +00:00
Kieran d6c578fafc
fix: config
continuous-integration/drone/push Build is failing Details
2024-01-22 17:21:46 +00:00
Kieran e9cf2e141b
chore: update _headers 2024-01-22 16:58:15 +00:00
Kieran 02ec637266
chore: remove unused
continuous-integration/drone/push Build is failing Details
2024-01-22 16:48:48 +00:00
Kieran e7f9b5e2ea
refactor: improve whitelabel config
continuous-integration/drone/push Build is failing Details
2024-01-22 16:41:50 +00:00
Kieran 4aa00405ee chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-22 15:06:57 +00:00
Kieran 65a96eb77b
refactor: more config options for generic config
continuous-integration/drone/push Build is failing Details
2024-01-22 15:00:17 +00:00
Kieran 6fd02cffbb
feat: generic nostr.com client config
continuous-integration/drone/push Build is failing Details
2024-01-22 13:52:18 +00:00
Kieran ef8a5c29bf
chore: update hostname
continuous-integration/drone/push Build is failing Details
2024-01-22 12:58:15 +00:00
Kieran 381a849a11 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-22 11:38:58 +00:00
Kieran 45fbd06bff
feat: play stream with zap.stream embed
continuous-integration/drone/push Build is failing Details
2024-01-22 11:33:38 +00:00
Martti Malmi d1ebd49d56 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-20 11:09:15 +00:00
Martti Malmi 6354472d05 "view as user" button in profile
continuous-integration/drone/push Build is failing Details
2024-01-20 13:00:47 +02:00
Kieran 6a1a990e57 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-20 00:00:44 +00:00
Kieran d1972542b7
fix: iframe credentialless
continuous-integration/drone/push Build is failing Details
2024-01-19 23:59:01 +00:00
Kieran 9ceb3c705f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-19 23:23:53 +00:00
Kieran 9be57a6e84
configure sqlite relay
continuous-integration/drone/push Build is running Details
2024-01-19 23:16:45 +00:00
Martti Malmi 6722ad5f8e lrucache fix
continuous-integration/drone/push Build is failing Details
2024-01-20 00:42:31 +02:00
Martti Malmi 29cb9a61b4 lrucache fix
continuous-integration/drone/push Build is failing Details
2024-01-20 00:26:02 +02:00
Kieran a66f7f5fd8 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-19 22:18:19 +00:00
Kieran 2033137ae2
refactor: return fuzzy profile search
continuous-integration/drone/push Build is failing Details
2024-01-19 22:16:48 +00:00
Martti Malmi 3d2f11f206 correct LRUCache size param
continuous-integration/drone/push Build is failing Details
2024-01-20 00:07:12 +02:00
Martti Malmi 08bfd38563 add profile events from db to fuzzy search
continuous-integration/drone/push Build is running Details
2024-01-20 00:01:13 +02:00
Martti Malmi 8fb127b347 initial state from LRUCache 2024-01-20 00:00:50 +02:00
Kieran 5ddc5ee8df
fix: delete from search
continuous-integration/drone/push Build is failing Details
2024-01-19 20:05:46 +00:00
Kieran 53c8ccbd0f
feat: local releay search
continuous-integration/drone/push Build is failing Details
2024-01-19 19:56:14 +00:00
Kieran 9654f70c22 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-19 13:40:42 +00:00
Kieran bf66f273e3
chore: include sourcemap
continuous-integration/drone/push Build is failing Details
2024-01-19 13:38:37 +00:00
Kieran da6fa415dd
fix: use command queue for batch event write
continuous-integration/drone/push Build is failing Details
2024-01-19 13:25:14 +00:00
Kieran 72b98a4ab5
fix: set coop/coep in function mw
continuous-integration/drone/push Build is failing Details
2024-01-19 13:12:39 +00:00
Kieran 7e88d96ddb
fix: COEP header
continuous-integration/drone/push Build is failing Details
2024-01-19 13:01:38 +00:00
Kieran cb0b75c652
feat: add fallback memory relay
continuous-integration/drone/push Build is failing Details
2024-01-19 11:56:18 +00:00
Kieran 8e33d10319 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-19 10:37:24 +00:00
Kieran 0b307ae691
refactor: delay batches until req's finish
continuous-integration/drone/push Build is failing Details
2024-01-19 10:26:37 +00:00
Kieran 2b1cf34424
refactor: move inMemoryDb hook 2024-01-19 10:09:36 +00:00
Kieran 0307bacd30
fixes
continuous-integration/drone/push Build is failing Details
2024-01-18 22:47:48 +00:00
Kieran aa9d5d72be chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-18 22:44:43 +00:00
Kieran ba3e901e9b
refactor: fix followgraph / add indexes
continuous-integration/drone/push Build is failing Details
2024-01-18 22:39:27 +00:00
Kieran 6eef8c7fef
feat: profile cache worker relay 2024-01-18 22:39:27 +00:00
Kieran 084558b3e7 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-18 21:17:38 +00:00
Kieran 32a6d56cf5
feat: use worker relay for events cache
continuous-integration/drone/push Build is running Details
2024-01-18 21:13:32 +00:00
Kieran c2f78dad1e chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-18 16:08:18 +00:00
Kieran 0239db393f
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-01-18 16:01:19 +00:00
Kieran f147edd03c
fix: relay-worker insert replacable events 2024-01-18 16:01:19 +00:00
Martti Malmi e3f8d48ddb logging
continuous-integration/drone/push Build is failing Details
2024-01-18 16:40:01 +02:00
Kieran d019544053 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-18 14:19:35 +00:00
Kieran 712848a129
feat: skip internal query store
continuous-integration/drone/push Build is failing Details
2024-01-18 14:06:13 +00:00
Kieran 3ff651ec37
feat: request builder option fillStore 2024-01-18 13:06:52 +00:00
Kieran f20cd8a119
chore: remove unused 2024-01-18 12:40:59 +00:00
Kieran 2d4c323cf7
feat: emit updates from relay-worker 2024-01-18 12:28:16 +00:00
Kieran 6d8c0325e4
feat: process worker messages in queue 2024-01-18 12:27:05 +00:00
Martti Malmi 2ea516e636 useSubscribe, handle emitted requests in sqlite
continuous-integration/drone/push Build is failing Details
2024-01-18 13:47:29 +02:00
Kieran b7e61ebde5
fix: remove semicolon
continuous-integration/drone/push Build is failing Details
2024-01-17 23:01:24 +00:00
Kieran 2e27c1b41a
chore: fix strings
continuous-integration/drone/push Build is pending Details
2024-01-17 23:00:53 +00:00
Kieran 34b2d9b743 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-17 21:17:55 +00:00
Kieran d990e9ffad
chore: move headers file
continuous-integration/drone/push Build is failing Details
2024-01-17 21:10:07 +00:00
Kieran 62ff3df30d chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-17 16:39:35 +00:00
Kieran f043a9ee96
chore: add extra headers
continuous-integration/drone/push Build is failing Details
2024-01-17 16:34:44 +00:00
Kieran adb9fe5c2e
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-01-17 15:48:30 +00:00
Kieran aa58ec4185
feat: upgrade caches to worker 2024-01-17 15:47:01 +00:00
Martti Malmi 3c808688f8 fix mobile footer sized padding
continuous-integration/drone/push Build is failing Details
2024-01-16 20:08:27 +02:00
Martti Malmi aa430de168 rm nip 113 2024-01-16 20:08:07 +02:00
Kieran fe46959424 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-15 19:59:25 +00:00
Kieran 9ae097907a
fix: config preferences
continuous-integration/drone/push Build is failing Details
2024-01-15 19:49:38 +00:00
Kieran a7ac246a43
feat: worker-relay pkg
continuous-integration/drone/push Build is failing Details
2024-01-15 16:57:20 +00:00
Kieran 6899e46622
chore: bump pkgs
continuous-integration/drone/push Build is failing Details
2024-01-15 12:04:59 +00:00
Kieran e45d6ffa52 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-15 11:34:15 +00:00
Kieran 3b6e194ded chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-15 11:29:06 +00:00
Kieran 21d7df0eac
refactor: use link preview from nostr-services api
continuous-integration/drone/push Build is failing Details
2024-01-15 11:16:41 +00:00
Martti Malmi ad79091356 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-15 08:25:32 +00:00
Martti Malmi 148acc764c add event ids from q.feed.takeSnapshot() to filter.not
continuous-integration/drone/push Build is failing Details
2024-01-15 10:21:16 +02:00
Martti Malmi 1f90b2fe90 add some search relays
continuous-integration/drone/push Build is failing Details
2024-01-15 01:57:27 +02:00
Kieran bc22ee7d56
fix: wallet pay plain invoice
continuous-integration/drone/push Build is failing Details
2024-01-14 17:01:10 +00:00
Martti Malmi eb2601448c fix global tab
continuous-integration/drone/push Build is failing Details
2024-01-14 14:58:52 +02:00
Martti Malmi 773db5dea6 no walletbalance in narrow sidebar
continuous-integration/drone/push Build is failing Details
2024-01-14 12:12:36 +02:00
Martti Malmi 4fe2554d9d enable subscriptions on iris 2024-01-14 12:10:25 +02:00
Martti Malmi d4233a818e lint 2024-01-13 23:06:25 +02:00
Martti Malmi 13b7a16dc7 system.HandleEvent -> querymanager -> matching queries
continuous-integration/drone/push Build is failing Details
2024-01-13 22:45:30 +02:00
Martti Malmi 736c2577db chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-13 18:54:14 +00:00
Martti Malmi 7935d3d86a memoize Timeline subject
continuous-integration/drone/push Build is running Details
2024-01-13 20:45:17 +02:00
Martti Malmi 57d4d6b2c6 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-13 13:33:53 +00:00
Martti Malmi 47fc8e1414 fix polls
continuous-integration/drone/push Build is failing Details
2024-01-13 15:25:21 +02:00
Martti Malmi a98bbd65b5 fix profile notes tab
continuous-integration/drone/push Build is failing Details
2024-01-12 17:51:23 +02:00
Martti Malmi ef673c2a05 tab selector vs content naming, refactoring
continuous-integration/drone/push Build is failing Details
2024-01-12 17:33:02 +02:00
Martti Malmi ffa4a192f6 split ProfilePage
continuous-integration/drone/push Build is failing Details
2024-01-12 17:02:44 +02:00
Kieran 5ab39aafe8 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-12 13:55:39 +00:00
Kieran 43ed484bcc
chore: generate docs
continuous-integration/drone/push Build is failing Details
2024-01-12 13:53:42 +00:00
Martti Malmi 2cadab20b4 fix feed padding bottom
continuous-integration/drone/push Build is failing Details
2024-01-12 15:37:15 +02:00
Martti Malmi 1cef1e0187 light theme
continuous-integration/drone/push Build is failing Details
2024-01-12 15:28:16 +02:00
Martti Malmi e0c4b64865 light theme notecreator style
continuous-integration/drone/push Build is failing Details
2024-01-12 15:22:14 +02:00
Martti Malmi a9405388c0 light theme primary button bg
continuous-integration/drone/push Build is failing Details
2024-01-12 15:13:46 +02:00
Martti Malmi 775ee6423f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-12 12:40:53 +00:00
Martti Malmi 1aaff4f553 extend default preferences from config
continuous-integration/drone/push Build is failing Details
2024-01-12 14:37:13 +02:00
Martti Malmi 6657161a32 open zaps tab
continuous-integration/drone/push Build is failing Details
2024-01-12 14:06:13 +02:00
Martti Malmi 7ee210da16 open reactions modal from note footer zappers list
continuous-integration/drone/push Build is failing Details
2024-01-12 14:01:26 +02:00
Martti Malmi 26e12d1c0b chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-11 23:08:03 +00:00
Martti Malmi 703da5389a add +n after zappers
continuous-integration/drone/push Build is failing Details
2024-01-12 01:04:41 +02:00
Martti Malmi ad2029d1d7 no hover bg color in notecreator
continuous-integration/drone/push Build is failing Details
2024-01-12 00:09:44 +02:00
Martti Malmi 20d3fdaa6e chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-11 21:51:15 +00:00
Martti Malmi 69d6dfd5d6 rename SendSats -> ZapModal
continuous-integration/drone/push Build is failing Details
2024-01-11 23:47:25 +02:00
Martti Malmi c8dae9fae6 split SendSats 2024-01-11 23:33:24 +02:00
Martti Malmi 649bab228b split notefooter into smaller components, CONFIG.showPowIcon
continuous-integration/drone/push Build is failing Details
2024-01-11 23:04:43 +02:00
Martti Malmi edca8a9636 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-11 14:40:01 +00:00
Martti Malmi 9bdf60a24f extract zap button component from note footer
continuous-integration/drone/push Build is failing Details
2024-01-11 16:32:52 +02:00
Martti Malmi dffb33bfda notefooter icons
continuous-integration/drone/push Build is failing Details
2024-01-11 15:46:13 +02:00
Martti Malmi de6685ade3 show zapper avatars on the same notefooter row 2024-01-11 15:46:13 +02:00
Kieran 536f8ddc5b
refactor: adjust response headers
continuous-integration/drone/push Build is failing Details
2024-01-11 11:18:26 +00:00
Kieran d45d601712 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-11 10:00:36 +00:00
Kieran c75ab861b5
fix: muted note styles
continuous-integration/drone/push Build is running Details
closes #721
2024-01-11 09:54:11 +00:00
Kieran 3fe6ed952c
Merge remote-tracking branch 'kamal/enhancements/snort#702' 2024-01-11 09:38:50 +00:00
Kieran 8090bb1718
chore: add jeremy
continuous-integration/drone/push Build is failing Details
2024-01-11 09:32:43 +00:00
Martti Malmi 501ad41fff chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-11 09:24:36 +00:00
Martti Malmi ee01623bf1 memoize proxyimg
continuous-integration/drone/push Build is running Details
2024-01-11 11:19:16 +02:00
Martti Malmi eb9cf7f361 fuzzy search on search page
continuous-integration/drone/push Build is failing Details
2024-01-11 10:54:27 +02:00
Martti Malmi 45f66fd139 gallery img sizing
continuous-integration/drone/push Build is failing Details
2024-01-11 09:21:30 +02:00
Martti Malmi 8043f1034f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-11 07:14:00 +00:00
Martti Malmi 76d3c78c0a replied note auto height, resized feed imgs
continuous-integration/drone/push Build is running Details
2024-01-11 08:56:23 +02:00
Kieran 21e1202b97
refactor: pass nip5 to api
continuous-integration/drone/push Build is failing Details
2024-01-10 22:44:37 +00:00
Martti Malmi ab8121c4b2 fix broken proxyimg placeholder
continuous-integration/drone/push Build is failing Details
2024-01-10 23:26:51 +02:00
Martti Malmi d3c9fef9af smaller avatar cache, exclude gifs from img cache
continuous-integration/drone/push Build is failing Details
2024-01-10 23:01:11 +02:00
Martti Malmi 8c8a7c7e88 avatar image sw cache
continuous-integration/drone/push Build is failing Details
2024-01-10 22:49:36 +02:00
Martti Malmi cb233f4ccb cacheableresponse plugin fixes img sw cache
continuous-integration/drone/push Build is failing Details
2024-01-10 22:16:04 +02:00
Kieran 326ce2ba68
fix: opengraph middleware
continuous-integration/drone/push Build is failing Details
2024-01-10 20:07:06 +00:00
Martti Malmi 8cca297d6d eslint: react-refresh/only-export-components error
continuous-integration/drone/push Build is failing Details
2024-01-10 21:13:08 +02:00
Martti Malmi a3fc25f64c show media in replied note
continuous-integration/drone/push Build is failing Details
2024-01-10 21:00:39 +02:00
Martti Malmi a1f61e2d13 limit replying-to note size
continuous-integration/drone/push Build is running Details
2024-01-10 20:54:48 +02:00
Martti Malmi 51758eaf5e separator border in replying to note
continuous-integration/drone/push Build is failing Details
2024-01-10 20:32:51 +02:00
Martti Malmi 5baffd00b9 fix the rest of warnings
continuous-integration/drone/push Build is failing Details
2024-01-10 20:21:19 +02:00
Martti Malmi e6a42db658 fix more warnings, store transformed text in LRUCache of 1000 2024-01-10 19:54:01 +02:00
Martti Malmi 8e37e0fbed fix some warnings
continuous-integration/drone/push Build is failing Details
2024-01-10 19:31:37 +02:00
Martti Malmi 7220435d15 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-10 16:50:28 +00:00
Martti Malmi 53488a9c59 memoize imagegriditem
continuous-integration/drone/push Build is running Details
2024-01-10 18:48:36 +02:00
Martti Malmi 1278867ad0 search page routing, resized grid images
continuous-integration/drone/push Build is failing Details
2024-01-10 18:25:24 +02:00
Kieran be4ee620ad chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-10 16:18:56 +00:00
Kieran 87386c9950
feat: use new opengraph functions
continuous-integration/drone/push Build is running Details
2024-01-10 16:16:33 +00:00
Martti Malmi baf6cc34ee reorganize, fix some fast refresh warnings
continuous-integration/drone/push Build is failing Details
2024-01-10 18:03:52 +02:00
Martti Malmi 071eed0d8c search page params 2024-01-10 17:44:54 +02:00
Martti Malmi 6f9a1fd706 middle column pb-[50vh] 2024-01-10 17:34:12 +02:00
Martti Malmi 90342325fd eslint warning fixes 2024-01-10 17:29:24 +02:00
Martti Malmi b686b8ff26 useBadgesFeed fix
continuous-integration/drone/push Build is failing Details
2024-01-10 17:23:18 +02:00
Martti Malmi 835385836f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-10 14:51:13 +00:00
Martti Malmi 93608f817f show zap pool notification only if wallet is ready
continuous-integration/drone/push Build is failing Details
2024-01-10 16:36:37 +02:00
Martti Malmi 9e2582ac81 show only 1 task at a time 2024-01-10 16:36:30 +02:00
Martti Malmi 35d7ec4685 followed by foafs 2024-01-10 16:36:23 +02:00
Martti Malmi 062212f311 useHistoryState for TimelineFollows latest time 2024-01-10 16:36:16 +02:00
Martti Malmi 52adf6fb1f store link previews in lrucache to prevent layout shift 2024-01-10 16:36:09 +02:00
Martti Malmi 90b15ee668 error page, sw 2024-01-10 16:36:02 +02:00
Martti Malmi 7be4b0bd18 rm custom sw registration, vite-plugin-pwa handles 2024-01-10 16:35:54 +02:00
Martti Malmi b8cdb4bf58 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-10 10:10:18 +00:00
Martti Malmi cf6b431d73 sw fix
continuous-integration/drone/push Build is failing Details
2024-01-10 12:01:45 +02:00
Kieran 91f0afdb89
fix: build
continuous-integration/drone/push Build is failing Details
2024-01-09 18:55:42 +00:00
Kieran 8a5a089b4d
Merge remote-tracking branch 'origin/main'
continuous-integration/drone/push Build encountered an error Details
2024-01-09 16:40:51 +00:00
Kieran 80fa5a132b
refactor: reactions grouping and other fixes 2024-01-09 16:40:31 +00:00
Martti Malmi 1a4a76d7fa chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-09 13:25:01 +00:00
Martti Malmi 7073e8d9dd trackEvent in ErrorBoundary, disable trackEvent in dev
continuous-integration/drone/push Build is running Details
2024-01-09 15:22:26 +02:00
Martti Malmi 376096c5af chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-09 13:03:40 +00:00
Martti Malmi 3eeeee4b06 use queueMicrotask instead of setTimeout 0
continuous-integration/drone/push Build is running Details
2024-01-09 14:56:26 +02:00
Kieran 4455651d47
refactor: Query emits Filters 2024-01-09 12:54:07 +00:00
Martti Malmi 8216cb8741 note creator style, rm hashtags 2024-01-09 14:52:08 +02:00
Martti Malmi 18beed13c3 thread inView rendering
continuous-integration/drone/push Build is failing Details
2024-01-09 14:07:39 +02:00
Martti Malmi 3dbbe5b0f0 fix timeline note waitUntilInView rendering
continuous-integration/drone/push Build is failing Details
2024-01-09 13:58:33 +02:00
Martti Malmi 64b0329ffe fix adding profiles to search
continuous-integration/drone/push Build is failing Details
2024-01-09 13:36:23 +02:00
Martti Malmi 2624920c65 setTimeout instead of requestAnimationFrame
continuous-integration/drone/push Build encountered an error Details
2024-01-09 12:50:20 +02:00
Martti Malmi 6026ed34a8 on init, load cached profiles to fuzzy search
continuous-integration/drone/push Build encountered an error Details
2024-01-09 12:38:39 +02:00
Kieran 45245153ab
refactor: dont inject analytics script
continuous-integration/drone/push Build is failing Details
2024-01-09 10:30:55 +00:00
Martti Malmi 44983068e4 ProxyImg initial src
continuous-integration/drone/push Build is failing Details
2024-01-09 12:15:23 +02:00
Martti Malmi 7a409c1455 system-react module entrypoint, reaction loading memos
continuous-integration/drone/push Build is failing Details
2024-01-09 12:07:14 +02:00
Kieran bbdfb43834
system-worker progress
continuous-integration/drone/push Build is failing Details
2024-01-09 09:30:09 +00:00
Martti Malmi 24e145a0a0 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-09 08:56:15 +00:00
Martti Malmi 4b5c87acdf primary button color
continuous-integration/drone/push Build is running Details
2024-01-09 10:53:40 +02:00
Martti Malmi 98e671ee45 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-09 08:34:26 +00:00
Martti Malmi a68cdeeb20 navbar wallet layout
continuous-integration/drone/push Build is running Details
2024-01-09 10:32:14 +02:00
Martti Malmi 53754a5a69 fix build
continuous-integration/drone/push Build is failing Details
2024-01-09 10:11:52 +02:00
Martti Malmi 898d8bfe02 chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-01-09 07:46:21 +00:00
Martti Malmi 3a42ec9029 correct iris username length prompt
continuous-integration/drone/push Build encountered an error Details
2024-01-09 09:41:30 +02:00
Kieran 927718e236
chore: typo
continuous-integration/drone/push Build encountered an error Details
2024-01-08 15:15:48 +00:00
Kieran 5d3abc553a
feat: NoteStore event-emitter
continuous-integration/drone/push Build was killed Details
2024-01-08 15:10:23 +00:00
Martti Malmi ca2cb76380 constant onClick param in some Notes
continuous-integration/drone/push Build is failing Details
2024-01-08 16:34:22 +02:00
Martti Malmi 8a75b5bce8 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-08 14:15:39 +00:00
Martti Malmi c80eb25d29 MetadataCache -> CachedMetadata, addCachedMetadataToFuzzySearch
continuous-integration/drone/push Build is failing Details
2024-01-08 16:12:43 +02:00
Kieran 88924941a5
feat: NostrQueryManager
continuous-integration/drone/push Build is failing Details
2024-01-08 13:56:10 +00:00
Kieran cae865a3e7
feat: emit closed 2024-01-08 13:56:10 +00:00
Martti Malmi add3b45fcd chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-08 13:47:40 +00:00
Martti Malmi d3bc1b1c1d note options constant param
continuous-integration/drone/push Build is running Details
2024-01-08 15:42:25 +02:00
Martti Malmi a20c8dbbf4 add requestAnimationFrame to socialgraph handleevent
continuous-integration/drone/push Build is failing Details
2024-01-08 14:44:51 +02:00
Kieran 5cae0ffeed
chore: upgrade lnc dependency
continuous-integration/drone/push Build is failing Details
2024-01-08 12:41:22 +00:00
Kieran 0bb758ae41 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-08 12:26:08 +00:00
Kieran 30b21cfe91
fix: image meta
continuous-integration/drone/push Build is running Details
2024-01-08 12:23:48 +00:00
Martti Malmi 84bda4e33d NoteHeader, NoteInner -> Note
continuous-integration/drone/push Build is failing Details
2024-01-08 14:06:30 +02:00
Kieran 2fbe90a39e
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-01-08 11:35:56 +00:00
Kieran d25b6ef5f1
chore: remove unused config 2024-01-08 11:35:56 +00:00
Kieran 185aca0442
refactor: remove event caches 2024-01-08 11:35:56 +00:00
Kieran 08241bbbf6
refactor: prevent duplicate preload 2024-01-08 11:35:56 +00:00
Kieran a54924f339
refactor: extract imeta directly in text parser 2024-01-08 11:35:55 +00:00
Kieran 29ca482511
refactor: remove slow sha256 from interaction cache 2024-01-08 11:35:55 +00:00
Kieran 13da7f822c
refactor: reduce hexToBech32 calls 2024-01-08 11:35:55 +00:00
Martti Malmi e6e7878e31 ReplyTag component
continuous-integration/drone/push Build was killed Details
2024-01-08 13:35:34 +02:00
Martti Malmi 7c21747d7f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-08 11:29:23 +00:00
Martti Malmi 5adaed2737 Note -> EventComponent, split NoteInner
continuous-integration/drone/push Build is running Details
2024-01-08 13:16:42 +02:00
Martti Malmi 615f3ca504 useReactions leaveOpen false 2024-01-08 13:16:42 +02:00
Martti Malmi 79fad227c5 smaller inMemoryDb 2024-01-08 13:16:42 +02:00
Martti Malmi b6023a8d95 waitUntilInView = index > 5 2024-01-08 13:16:42 +02:00
Martti Malmi 11e616c612 rm related prop 2024-01-08 13:16:42 +02:00
Martti Malmi e905b4134d dont pass related to notes 2024-01-08 13:16:42 +02:00
Martti Malmi 26a3e95086 add why-did-you-render 2024-01-08 13:16:42 +02:00
Kieran 5db33314a8 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-08 10:31:49 +00:00
Kieran 9ec27bcea3
feat: track hashtags input usage
continuous-integration/drone/push Build is running Details
2024-01-08 10:25:31 +00:00
Kieran 27210f91ae
chore: disable toast 2024-01-08 10:20:57 +00:00
Kieran 283d5cafb3 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-07 18:50:05 +00:00
Kieran 02e6d5c98c
fix: created_at on refresh
continuous-integration/drone/push Build is failing Details
2024-01-07 18:44:07 +00:00
Martti Malmi b40a8cb9ad do not modify filters in place
continuous-integration/drone/push Build is failing Details
2024-01-07 13:40:01 +02:00
Kieran cb8318df56
chore: add sitemap
continuous-integration/drone/push Build is failing Details
2024-01-06 23:59:19 +00:00
Martti Malmi 1aadda1c6b try disabling alreadyHave check
continuous-integration/drone/push Build is failing Details
2024-01-06 01:05:23 +02:00
Kieran 39f4ee9c2b
fix: wallet save
continuous-integration/drone/push Build is failing Details
2024-01-05 20:54:46 +00:00
Kieran 40912bc979 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-05 20:16:09 +00:00
Kieran 5eaffcae7d
fix: warn on unused vars
continuous-integration/drone/push Build is failing Details
2024-01-05 20:15:06 +00:00
Kieran e3d282578d
chore: disable cashu
continuous-integration/drone/push Build is failing Details
2024-01-05 20:10:24 +00:00
Kieran afcee97131
fix: refresh from getBalance 2024-01-05 20:08:45 +00:00
Martti Malmi 3a2facd899 send not filter to relays that support nip-113
continuous-integration/drone/push Build is failing Details
2024-01-05 14:02:42 +02:00
Martti Malmi aa938034c5 fix build
continuous-integration/drone/push Build is failing Details
2024-01-05 13:42:50 +02:00
Martti Malmi dee9a3de2c add filter.not.ids = [alreadyHave] from memory 2024-01-05 13:21:18 +02:00
Martti Malmi cc753d5708 system.HandleEvent 2024-01-05 12:56:46 +02:00
Martti Malmi f9302f3917 move InMemoryDB to system
continuous-integration/drone/push Build is failing Details
2024-01-05 12:41:48 +02:00
Martti Malmi 3eb290a594 move InMemoryDB to system 2024-01-05 12:38:04 +02:00
Martti Malmi f39831dde8 chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-01-05 10:18:57 +00:00
Martti Malmi 1a9e571b0f use InMemoryDB instead of seenEvents LRUSet
continuous-integration/drone/push Build is running Details
2024-01-05 12:14:53 +02:00
Martti Malmi 29a8db28dd idb read queue
continuous-integration/drone/push Build is failing Details
2024-01-05 01:17:57 +02:00
Martti Malmi 70b85dcc9c disable seenEvents check in connection
continuous-integration/drone/push Build is failing Details
2024-01-05 01:05:46 +02:00
Martti Malmi 956871e5e5 fix idb unique indexes
continuous-integration/drone/push Build is failing Details
2024-01-05 00:09:46 +02:00
Martti Malmi c4b74b3cb1 hide broken banners 2024-01-04 23:35:48 +02:00
Martti Malmi 2f9fee56b1 idb query by all tags 2024-01-04 23:24:37 +02:00
Kieran b3f04c8cd9
fix: refresh token
continuous-integration/drone/push Build is failing Details
2024-01-04 20:43:51 +00:00
Martti Malmi e73aa303a8 fix build
continuous-integration/drone/push Build is failing Details
2024-01-04 22:36:31 +02:00
Martti Malmi f82109b6b3 fix idb search, only 1 read query at a time 2024-01-04 22:32:51 +02:00
Martti Malmi 2fa4065414 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-04 19:36:46 +00:00
Martti Malmi eefbc49384 reactions refactor, fix Tabs
continuous-integration/drone/push Build is failing Details
2024-01-04 21:34:07 +02:00
Martti Malmi db074316d7 sort reactions by follow distance 2024-01-04 21:26:09 +02:00
Martti Malmi 629099670c chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-04 17:43:51 +00:00
Martti Malmi 2e5295a0f7 format
continuous-integration/drone/push Build is failing Details
2024-01-04 19:41:13 +02:00
Martti Malmi c8215b1408 NoteTime memo 2024-01-04 19:41:13 +02:00
Kieran 3963db1a0a chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-04 17:14:23 +00:00
Kieran daad0bbe76
fix: add account:read for alby
continuous-integration/drone/push Build is failing Details
2024-01-04 17:12:52 +00:00
Martti Malmi 2e97546ab0 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-04 17:04:09 +00:00
Martti Malmi 3fe3c7a98d eslint: sort imports & exports
continuous-integration/drone/push Build is failing Details
2024-01-04 19:01:18 +02:00
Martti Malmi 046d4d97bd SortedMap.clear(), V type
continuous-integration/drone/push Build is failing Details
2024-01-04 18:49:05 +02:00
Kieran c612da125e
fix: build
continuous-integration/drone/push Build is failing Details
2024-01-04 16:37:12 +00:00
Kieran a976909036
fix: typo
continuous-integration/drone/push Build encountered an error Details
2024-01-04 16:32:26 +00:00
Kieran a622c459d7
fix: sorted map
continuous-integration/drone/push Build is running Details
2024-01-04 16:31:04 +00:00
Kieran 36b9538aa6
chore: fix error
continuous-integration/drone/push Build encountered an error Details
2024-01-04 16:21:50 +00:00
Martti Malmi f2bcd1100d chore: Update translations
continuous-integration/drone/push Build encountered an error Details
2024-01-04 16:15:41 +00:00
Martti Malmi 5d259cee95 store events in SortedMap to avoid sort on render
continuous-integration/drone/push Build encountered an error Details
2024-01-04 18:12:34 +02:00
Kieran 47d92fe171
chore: formatting
continuous-integration/drone/push Build is failing Details
2024-01-04 16:11:10 +00:00
Kieran 7bc00b4624
feat: cashu wallet setup
feat: wallet send/receive pages
2024-01-04 16:10:52 +00:00
Martti Malmi 1e08702072 assets dir
continuous-integration/drone/push Build is failing Details
2024-01-04 16:47:33 +02:00
Martti Malmi afa6d39a56 reorganize code into smaller files & dirs
continuous-integration/drone/push Build is failing Details
2024-01-04 15:48:19 +02:00
Martti Malmi 5ea2eb711f move wasm and system out of index.tsx
continuous-integration/drone/push Build is failing Details
2024-01-04 15:15:46 +02:00
Martti Malmi e08da34aa8 eslint errors fixed
continuous-integration/drone/push Build is failing Details
2024-01-04 14:33:20 +02:00
Martti Malmi c773ea0a0f chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-04 12:27:11 +00:00
Martti Malmi eeb6ec9dd8 eslint fixes
continuous-integration/drone/push Build is failing Details
2024-01-04 14:21:42 +02:00
Kieran 9f88b44b91
feat: finish alby wallet
continuous-integration/drone/push Build is failing Details
2024-01-04 12:05:13 +00:00
Kieran 0442c3512c
chore: fix more warnings 2024-01-04 11:04:52 +00:00
Kieran 13f4ec3f30
chore: fix some eslint warnings
continuous-integration/drone/push Build is failing Details
2024-01-04 10:45:58 +00:00
Martti Malmi 2a2c713486 eslint: react-refresh, react-hooks
continuous-integration/drone/push Build is failing Details
2024-01-04 12:32:43 +02:00
Martti Malmi b143520901 add eslint-plugin-react
continuous-integration/drone/push Build is failing Details
2024-01-04 11:43:17 +02:00
Martti Malmi 26146106d4 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-04 08:50:58 +00:00
Martti Malmi d31a03a565 use seenEvents in IndexedDB
continuous-integration/drone/push Build is failing Details
2024-01-04 10:44:46 +02:00
Martti Malmi 287ce32690 use LRUSet to skip already seen event processing
continuous-integration/drone/push Build is failing Details
2024-01-04 10:36:23 +02:00
Martti Malmi c2899eac26 disable indexedDbEvents in iris for now 2024-01-04 10:19:48 +02:00
Kieran 0043b7e8bd
feat: full event verify in wasm
continuous-integration/drone/push Build is failing Details
2024-01-03 23:20:37 +00:00
Martti Malmi 267c09a946 dont save p tags for now
continuous-integration/drone/push Build is failing Details
2024-01-04 00:03:17 +02:00
Martti Malmi 2fa75e8e3d fuzzysearch username -> display_name 2024-01-03 23:57:51 +02:00
Martti Malmi 2a2144b59b increase idb throttle time, query by pubkey+kind index 2024-01-03 23:56:17 +02:00
Martti Malmi 7ac5bb6d41 LRUSet for seenEvents 2024-01-03 23:33:35 +02:00
Martti Malmi 38093fdf3b load all profiles from indexeddb
continuous-integration/drone/push Build is failing Details
2024-01-03 21:29:17 +02:00
Martti Malmi 98e1be883b trending posts into system, check sigs
continuous-integration/drone/push Build is failing Details
2024-01-03 20:22:58 +02:00
Kieran e700c97c71 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-03 16:49:44 +00:00
Kieran 4d9226b3b6
feat: wallet connection flow
continuous-integration/drone/push Build is failing Details
2024-01-03 16:46:34 +00:00
Martti Malmi 0cc0a47501 fix: rm eventMatchesFilter
continuous-integration/drone/push Build is running Details
2024-01-03 18:34:28 +02:00
Martti Malmi d187fbc6e5 save only followDistance <= 2 evts to idb
continuous-integration/drone/push Build is failing Details
2024-01-03 17:39:55 +02:00
Martti Malmi 6582b4c7d5 chore: Update translations
continuous-integration/drone/push Build is running Details
2024-01-03 15:34:43 +00:00
Martti Malmi acbd3a9004 package.json
continuous-integration/drone/push Build is failing Details
2024-01-03 17:24:15 +02:00
Martti Malmi 1199418d0e check filter match on the worker side
continuous-integration/drone/push Build is failing Details
2024-01-03 17:19:22 +02:00
Martti Malmi 395848fd8c add optional idb "relay" worker
continuous-integration/drone/push Build is failing Details
2024-01-03 16:53:33 +02:00
Martti Malmi 8571ea0aa7 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-03 10:34:35 +00:00
Martti Malmi d840f2b952 NostrSystemEvent "event" id -> subId
continuous-integration/drone/push Build is failing Details
2024-01-03 12:27:05 +02:00
Kieran 43591c4ce6 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-02 18:20:53 +00:00
Kieran bc7ec4d77f
feat: new wallet design
continuous-integration/drone/push Build is failing Details
2024-01-02 18:11:44 +00:00
Kieran 0d10122394
fix: event hook
continuous-integration/drone/push Build is failing Details
2024-01-02 16:06:43 +00:00
Kieran 8bbbd11f7a
fix: nwc history 2024-01-02 16:05:21 +00:00
Kieran 7c8136b503
fix: check sig exists
continuous-integration/drone/push Build is failing Details
2024-01-02 15:51:19 +00:00
Martti Malmi 6ad99e7e95 ProxyImg fix
continuous-integration/drone/push Build is failing Details
2024-01-02 10:24:34 +02:00
Martti Malmi f7d8d1de16 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-02 07:38:33 +00:00
Martti Malmi 2c14d64a95 NoteInner prop waitUntilInView = false
continuous-integration/drone/push Build is running Details
2024-01-02 09:33:22 +02:00
Martti Malmi 81c9285d46 proxyimg fix
continuous-integration/drone/push Build is failing Details
2024-01-02 01:30:10 +02:00
Martti Malmi 6928ad04d7 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-01 22:59:18 +00:00
Martti Malmi 19eeb890ac broken img placeholder fix
continuous-integration/drone/push Build is running Details
2024-01-02 00:54:25 +02:00
Martti Malmi 3d98532e40 chore: Update translations
continuous-integration/drone/push Build is failing Details
2024-01-01 22:32:53 +00:00
Martti Malmi 4bbad0563b useMemo in Avatar
continuous-integration/drone/push Build is failing Details
2024-01-02 00:25:44 +02:00
Martti Malmi 13fc3bb843 notetime init value
continuous-integration/drone/push Build is running Details
2024-01-02 00:21:30 +02:00
Kieran 7b72f9f775
chore: formatting
continuous-integration/drone/push Build is failing Details
2023-12-28 17:40:53 +00:00
Kieran c2e1215667
refactor: extract connection pool
wip: setup system-worker
2023-12-28 17:40:26 +00:00
Martti Malmi e7e7fdc14d chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-27 20:42:52 +00:00
Martti Malmi 3e52bb755e show trending error only if no cached content
continuous-integration/drone/push Build is running Details
2023-12-27 22:35:51 +02:00
Martti Malmi 789476c677 NostrLink initialState
continuous-integration/drone/push Build is failing Details
2023-12-27 15:07:20 +02:00
Martti Malmi f47994b3ee faster nostrlinkhandler
continuous-integration/drone/push Build is failing Details
2023-12-27 14:45:00 +02:00
Martti Malmi 9d2b867552 sw caching for nostr.json and images
continuous-integration/drone/push Build is failing Details
2023-12-26 21:33:22 +02:00
Martti Malmi d82c7957be if suggested follows is empty, show trending users
continuous-integration/drone/push Build is failing Details
2023-12-26 20:50:34 +02:00
Martti Malmi 3af04a79cc rm dataProcessor from useCachedFetch hook deps
continuous-integration/drone/push Build is failing Details
2023-12-26 20:40:57 +02:00
Kieran 9fc0b676f5
feat: add dimensions from void.cat uploads
continuous-integration/drone/push Build was killed Details
2023-12-26 18:35:54 +00:00
Martti Malmi f70d752fae useCachedFetch hook for trending api calls
continuous-integration/drone/push Build is failing Details
2023-12-26 20:15:26 +02:00
Martti Malmi 6b88df96ab rm webrtc client for now
continuous-integration/drone/push Build is failing Details
2023-12-26 19:20:12 +02:00
Martti Malmi 1f03a5ee5a NostrBand cache fix 2023-12-26 19:20:11 +02:00
Martti Malmi 9c94e84b9d chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-26 08:17:40 +00:00
Martti Malmi 8c1bbe58f6 cache NostrBand requests in localstorage
continuous-integration/drone/push Build is failing Details
2023-12-26 10:07:11 +02:00
Martti Malmi 118ada989e chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-23 07:33:28 +00:00
Martti Malmi 1b9dc3f480 add missing login
continuous-integration/drone/push Build is failing Details
2023-12-23 09:26:52 +02:00
Martti Malmi 82bb71136e chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-22 08:14:56 +00:00
Martti Malmi 74591a6adb add telegram link to donate page
continuous-integration/drone/push Build is failing Details
2023-12-22 10:11:29 +02:00
Martti Malmi 87d3bbe1a1 move chat files to same dir, webrtc, chat
continuous-integration/drone/push Build is failing Details
2023-12-21 23:40:29 +02:00
Martti Malmi 1639937d8c webrtc works in dev, add some missing list keys 2023-12-21 22:40:08 +02:00
Martti Malmi e10a11b707 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-21 20:04:03 +00:00
Martti Malmi 9e6971423e webrtc
continuous-integration/drone/push Build is failing Details
2023-12-21 21:57:08 +02:00
Martti Malmi 782a2217b4 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-21 17:59:56 +00:00
Martti Malmi 1309937869 wip webrtc
continuous-integration/drone/push Build is failing Details
2023-12-21 19:51:37 +02:00
Kieran 0c2ed147b0
fix: match file extensions with lower case
continuous-integration/drone/push Build is failing Details
2023-12-20 16:07:04 +00:00
Kieran 9ed5757875 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-20 14:15:35 +00:00
Kieran 06b7dcad11
feat: tools pages
continuous-integration/drone/push Build is failing Details
Various other fixes:
- Better handeling of limit/since/before merging
- Expose timeout through request builder
- Expose PickN through request builder
- Fix tests
2023-12-20 14:08:05 +00:00
Martti Malmi 96368d4a2b fix build
continuous-integration/drone/push Build is failing Details
2023-12-20 13:41:24 +02:00
Martti Malmi bf822aae5b chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-20 10:34:53 +00:00
Martti Malmi 80690df15a fix spotlight modal for replies
continuous-integration/drone/push Build is failing Details
2023-12-20 12:31:24 +02:00
Martti Malmi df66a861f7 make grid media modal closable when not loaded 2023-12-20 12:06:52 +02:00
Martti Malmi f2d46e340a chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-19 14:22:08 +00:00
Martti Malmi 47f70b0157 preload next & prev grid image modal
continuous-integration/drone/push Build is running Details
2023-12-19 16:19:59 +02:00
Martti Malmi c1c99f1b9e full width modal imgs
continuous-integration/drone/push Build is failing Details
2023-12-19 15:41:25 +02:00
Martti Malmi 7eb8edbf74 modal full width vid
continuous-integration/drone/push Build is failing Details
2023-12-19 12:47:47 +02:00
Martti Malmi 34e892937e use ProxyImg in grid
continuous-integration/drone/push Build is failing Details
2023-12-19 11:15:38 +02:00
Martti Malmi 30df180e33 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-19 08:54:33 +00:00
Martti Malmi 083f512bdf go to next grid item with arrows
continuous-integration/drone/push Build is failing Details
2023-12-19 10:50:37 +02:00
Kieran 0f4352aa1b chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-18 17:00:48 +00:00
Kieran 7040253f32
feat: apply for leader
continuous-integration/drone/push Build is failing Details
2023-12-18 16:58:30 +00:00
Kieran a937c75c64 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-18 16:03:54 +00:00
Kieran 7523b41610
feat: community leaders
continuous-integration/drone/push Build is failing Details
2023-12-18 16:00:22 +00:00
Martti Malmi 457cba32a7 odell column title uppercase
continuous-integration/drone/push Build is failing Details
2023-12-18 17:11:26 +02:00
Martti Malmi be3f46c7f1 disable notification graph in iris
continuous-integration/drone/push Build is failing Details
2023-12-18 17:05:04 +02:00
Martti Malmi 509c1664c1 chore: Update translations
continuous-integration/drone/push Build is running Details
2023-12-18 15:03:10 +00:00
Martti Malmi a34bf6591c link to settings in sm and edit in md
continuous-integration/drone/push Build is failing Details
2023-12-18 17:01:16 +02:00
Martti Malmi eef4e526c1 fix edit profile link
continuous-integration/drone/push Build is failing Details
2023-12-18 16:54:42 +02:00
Martti Malmi 9bd5062922 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-18 14:47:07 +00:00
Martti Malmi 3021001c02 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-18 14:40:37 +00:00
Martti Malmi 33963f35ed translate settings divisions
continuous-integration/drone/push Build is failing Details
2023-12-18 16:37:35 +02:00
Martti Malmi 9702529437 new settings layout
continuous-integration/drone/push Build is failing Details
2023-12-18 16:29:06 +02:00
Martti Malmi 63b3ad2d57 note content rendering fix
continuous-integration/drone/push Build is failing Details
2023-12-18 13:26:50 +02:00
Martti Malmi e2e3c9e638 react without spinner
continuous-integration/drone/push Build is failing Details
2023-12-18 13:17:06 +02:00
Kamal Raj Sekar 3c97d73536 remove custom style and use tailwind
continuous-integration/drone/pr Build is failing Details
2023-12-18 08:05:04 +00:00
Kamal Raj Sekar 77925e6647 hiddennote style changes, new preference to hide muted notes 2023-12-18 08:05:02 +00:00
Martti Malmi 8aeda3f7a1 rm CONFIG.checkSigs (default always true)
continuous-integration/drone/push Build is failing Details
2023-12-18 10:04:32 +02:00
Martti Malmi 722a3a1a0e hide note creator toast on Iris
continuous-integration/drone/push Build is failing Details
2023-12-18 09:59:17 +02:00
Martti Malmi ffda31895a chore: Update translations
continuous-integration/drone/push Build was killed Details
2023-12-18 07:58:16 +00:00
Martti Malmi ad449bc295 CONFIG.signUp.defaultFollows
continuous-integration/drone/push Build is running Details
2023-12-18 09:55:06 +02:00
Martti Malmi 73026ff152 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-18 07:27:47 +00:00
Martti Malmi 04756d2741 push notifications
continuous-integration/drone/push Build is running Details
2023-12-18 09:24:22 +02:00
Martti Malmi bedcd7aba6 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-15 13:29:33 +00:00
Martti Malmi 933e891b37 notifications status in settings
continuous-integration/drone/push Build is failing Details
2023-12-15 15:23:24 +02:00
Martti Malmi 1389bfe1ed tailwind close btn that works on light theme
continuous-integration/drone/push Build is failing Details
2023-12-15 12:04:04 +02:00
Martti Malmi 39549dbe96 hide side nav "messages" in readonly
continuous-integration/drone/push Build is failing Details
2023-12-15 10:28:44 +02:00
Martti Malmi 57c0998eaa fix unknown tag error from notes
continuous-integration/drone/push Build is failing Details
2023-12-15 10:17:23 +02:00
Martti Malmi a4570084ef chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-15 07:23:19 +00:00
Martti Malmi 20a0a3aea4 ErrorBoundary for notes, wip notif settings
continuous-integration/drone/push Build is running Details
2023-12-15 09:19:10 +02:00
Kieran 2bf62f3a03
fix: unused imports
continuous-integration/drone/push Build is failing Details
2023-12-14 14:25:01 +00:00
Kieran 188f96c86f chore: Update translations
continuous-integration/drone/push Build is running Details
2023-12-14 14:24:37 +00:00
Kieran a7ab7b024f
fix: typo
continuous-integration/drone/push Build is running Details
2023-12-14 14:23:30 +00:00
Kieran 1ba9218a2f
chore: prepare release
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/tag Build is failing Details
2023-12-14 14:04:17 +00:00
Kieran 86ed4e042e
feat: edit profile button 2023-12-14 14:04:17 +00:00
Kieran 4212fe8dc9 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-14 12:37:42 +00:00
Kieran 817b791e13
refactor: cleanup
continuous-integration/drone/push Build is failing Details
closes https://github.com/v0l/snort/pull/575
2023-12-14 12:36:24 +00:00
Kieran 8dc12b31df
Squashed commit of the following:
commit 52ca4c48661f69e0885fda9bfca7b3171b9e6a36
Author: Kamal Raj Sekar <notify.kamalraj@gmail.com>
Date:   Thu Nov 30 16:41:45 2023 +0000

    compose the api call in debounce and useeffect

commit fc6a933643ad7f4ac26851eccec080f81e5a84d9
Author: Kamal Raj Sekar <notify.kamalraj@gmail.com>
Date:   Thu Nov 30 03:32:21 2023 +0000

    useeffect for lud16 verification, reuse nip05verifier and some cleanup

commit 0516b38a2f074e1d5457e26f484305410cfe102c
Merge: 202eaa07 aaa56738
Author: Kamal Raj Sekar <notify.kamalraj@gmail.com>
Date:   Tue Nov 21 06:04:01 2023 +0000

    Merge branch 'main' into enhancements/593-validation

commit 202eaa0773b19ae782381ac8e21c4a8200c57b26
Author: Kamal Raj Sekar <notify.kamalraj@gmail.com>
Date:   Tue Nov 21 05:49:15 2023 +0000

    Lud16 test and some clean up

commit 169596288d77e6eaa1998b5b8ec2b6944e240ae4
Author: Kamal Raj Sekar <notify.kamalraj@gmail.com>
Date:   Mon Nov 20 16:15:52 2023 +0000

    username and about length validation

commit d150a0622cfc90650d2342587c2d5d513085fe01
Author: Kamal Raj Sekar <notify.kamalraj@gmail.com>
Date:   Mon Nov 20 15:38:45 2023 +0000

    verify nostr address - nip05
2023-12-14 12:25:13 +00:00
Kieran a086dc101f
chore: formatting
continuous-integration/drone/push Build is failing Details
closes https://github.com/v0l/snort/pull/576
2023-12-14 12:19:01 +00:00
Kamal Raj Sekar 0d1e73d40f
refer border color variable 2023-12-14 12:19:01 +00:00
Kamal Raj Sekar 7a27bb022e
show border when there is no selected DM 2023-12-14 12:18:59 +00:00
Kieran 91ae31a267 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-14 12:16:05 +00:00
Kieran 444b7b5379
new close buttons
continuous-integration/drone/push Build is failing Details
closes https://github.com/v0l/snort/pull/577
2023-12-14 12:15:06 +00:00
Kieran 27f6597f88 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-14 12:06:29 +00:00
Kieran 9e65024652
feat: preferLargeMedia config
continuous-integration/drone/push Build is failing Details
2023-12-14 12:05:26 +00:00
Kieran 6e5fba4f15
feat: image integrity check
continuous-integration/drone/push Build is failing Details
2023-12-14 11:51:56 +00:00
Martti Malmi b38527ca1f subscribe to notifications from nav sidebar notifs click
continuous-integration/drone/push Build is failing Details
2023-12-14 13:01:19 +02:00
Martti Malmi 14692aceb9 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-14 09:46:11 +00:00
Martti Malmi e107d4cb7e show profileCard in some components
continuous-integration/drone/push Build is running Details
2023-12-14 11:43:28 +02:00
Martti Malmi 26a88537a5 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-13 15:15:45 +00:00
Martti Malmi e3642c5449 postsOnly=true in followed-by-friends feed
continuous-integration/drone/push Build is running Details
2023-12-13 17:13:39 +02:00
Martti Malmi ac94f7c1e4 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-13 14:58:05 +00:00
Martti Malmi 85846422dd followed-by-friends feed
continuous-integration/drone/push Build is failing Details
2023-12-13 16:55:06 +02:00
Martti Malmi 1b70815109 disable iris http cache
continuous-integration/drone/push Build is failing Details
2023-12-13 15:40:24 +02:00
Martti Malmi 8ab1b9a643 center images on mobile
continuous-integration/drone/push Build is failing Details
2023-12-13 14:32:38 +02:00
Martti Malmi 7cb51aa8cf rm rounded-sm, not compatible with object-contain
continuous-integration/drone/push Build is failing Details
2023-12-13 14:30:22 +02:00
Martti Malmi 4e2189a893 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-13 12:12:22 +00:00
Martti Malmi 87ad31df30 stretch small images to fit the container
continuous-integration/drone/push Build is failing Details
2023-12-13 14:10:54 +02:00
Martti Malmi f124082f6f video & img styles
continuous-integration/drone/push Build is failing Details
2023-12-13 13:27:42 +02:00
Martti Malmi e408389cdb separate components for different media types
continuous-integration/drone/push Build is failing Details
2023-12-13 12:12:10 +02:00
Martti Malmi 1fe6a2a50d pause / play vid with useInView
continuous-integration/drone/push Build is failing Details
2023-12-13 11:37:14 +02:00
Martti Malmi b199d297ce useInView rootMargin
continuous-integration/drone/push Build is failing Details
2023-12-13 11:25:23 +02:00
Martti Malmi 3fa13de33e chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-13 08:51:56 +00:00
Martti Malmi 20e40c1f65 long form note: fix text overflow, truncate in feed
continuous-integration/drone/push Build is failing Details
2023-12-13 10:49:08 +02:00
Kieran 4ed6ec7c3d
feat: use eventemitter3 in ExternalStore
continuous-integration/drone/push Build is failing Details
2023-12-12 22:47:06 +00:00
Kieran 8d6cdb3868
feat: schnorr check in wasm 2023-12-12 22:46:36 +00:00
Martti Malmi 9431b294c6 img width fix
continuous-integration/drone/push Build is failing Details
2023-12-12 21:27:12 +02:00
Martti Malmi 33888988af constant img & video container size when no imeta present
continuous-integration/drone/push Build is failing Details
2023-12-12 16:19:42 +02:00
Kieran 15806c56d0
feat: remove wallet button
continuous-integration/drone/push Build is failing Details
2023-12-12 13:55:34 +00:00
Martti Malmi f0af0c81f0 min-height for quote & spinner
continuous-integration/drone/push Build is failing Details
2023-12-12 15:44:43 +02:00
Kieran d9309b5fac chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-12 13:24:29 +00:00
Kieran b41e8a919a
feat: upgrade wallet support
continuous-integration/drone/push Build is failing Details
2023-12-12 13:22:26 +00:00
Martti Malmi 6951383045 hide profilecard by default, calculate new notes pos with js
continuous-integration/drone/push Build is failing Details
2023-12-12 14:51:07 +02:00
Martti Malmi ad57b440a9 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-12 12:32:01 +00:00
Martti Malmi e0a6df7f3a latest notes mobile fix
continuous-integration/drone/push Build is failing Details
2023-12-12 14:30:20 +02:00
Martti Malmi 47d187516f chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-12 12:08:25 +00:00
Martti Malmi dcb3389aa1 fix notecreator layout
continuous-integration/drone/push Build is running Details
2023-12-12 14:04:38 +02:00
Kieran fce7cc70a3
feat: parse imeta
continuous-integration/drone/push Build is failing Details
2023-12-11 11:36:23 +00:00
Kieran cb95032e7c chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-11 10:40:08 +00:00
Kieran b63d46e96d
chore: formatting
continuous-integration/drone/push Build was killed Details
2023-12-11 10:37:36 +00:00
Kieran 07e42405a0
chore: tweaks 2023-12-11 10:37:03 +00:00
Kieran 0f6fe23f18
chore: formatting
continuous-integration/drone/push Build is failing Details
2023-12-10 18:40:24 +00:00
Kieran 755ba17dab
chore: track events with props 2023-12-10 18:40:01 +00:00
Kieran d00f8b0d85
chore: formatting
continuous-integration/drone/push Build is failing Details
2023-12-10 17:41:34 +00:00
Kieran a1e9df8254
feat: track events in note creator 2023-12-10 17:41:33 +00:00
Kieran d2cec4909c
feat: track zappool payout activity 2023-12-10 17:41:33 +00:00
Kieran 91709c88be chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-10 17:29:18 +00:00
Kieran 5add66711a
fix: return hash from nostr.build
continuous-integration/drone/push Build is failing Details
2023-12-10 17:23:57 +00:00
Kieran d167579348
feat: add imeta hash 2023-12-10 17:19:09 +00:00
Martti Malmi 735d5fd5a5 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-08 16:32:50 +00:00
Martti Malmi 4d6331ce81 CONFIG.defaultPreferences.checkSigs
continuous-integration/drone/push Build is running Details
2023-12-08 18:30:52 +02:00
Martti Malmi bee8498283 style
continuous-integration/drone/push Build is failing Details
2023-12-08 13:30:55 +02:00
Martti Malmi 74bc8bafda update yarn.lock
continuous-integration/drone/push Build is failing Details
2023-12-08 11:35:07 +02:00
Martti Malmi 4f7152d3e0 layout, full width gallery on mobile
continuous-integration/drone/push Build is failing Details
2023-12-08 11:24:28 +02:00
Martti Malmi 31d9c52080 styles
continuous-integration/drone/push Build is failing Details
2023-12-08 09:48:39 +02:00
Kieran 1dc3059d0d
fix: depends
continuous-integration/drone/push Build is failing Details
2023-12-07 21:55:41 +00:00
Kieran bcab6b0f0e
feat: add marker param to toEventTag 2023-12-07 21:55:41 +00:00
Kieran a124d49a64
chore: bump pkg 2023-12-07 21:55:41 +00:00
Kieran c98f7ad12d
feat: add created_at to parsed zaps 2023-12-07 21:55:41 +00:00
Martti Malmi 6d0b3a0be5 rm spotlight media min-w
continuous-integration/drone/push Build is failing Details
2023-12-07 23:43:26 +02:00
Martti Malmi 94ae8847cc christmas season 30 -> 7 days, show S nav logo on mobile
continuous-integration/drone/push Build is failing Details
2023-12-07 23:22:52 +02:00
Martti Malmi a5dddcf093 redirect from /npub to /username
continuous-integration/drone/push Build is failing Details
2023-12-07 22:28:51 +02:00
Martti Malmi f048298d47 fix profile qr code & id
continuous-integration/drone/push Build is failing Details
2023-12-07 22:13:37 +02:00
Martti Malmi 21cd043809 paste npub|nprofile|nevent|note id into search box
continuous-integration/drone/push Build is failing Details
2023-12-07 21:44:55 +02:00
Martti Malmi 236b9b780e submit signup forms with enter, nsec/npub input handling
continuous-integration/drone/push Build is failing Details
2023-12-07 19:37:44 +02:00
Martti Malmi fb29d330fc remove nip05 from all ProfileImage rows
continuous-integration/drone/push Build is failing Details
2023-12-07 18:46:08 +02:00
Martti Malmi f5e84c3f8a modal vid & img min width, sort follower by distance
continuous-integration/drone/push Build is failing Details
2023-12-07 14:36:57 +02:00
Martti Malmi 8e6d11ffaa gallery-item fix
continuous-integration/drone/push Build is failing Details
2023-12-07 14:19:50 +02:00
Martti Malmi d59eead30e DisplayName in note replying to
continuous-integration/drone/push Build is failing Details
2023-12-07 14:16:42 +02:00
Martti Malmi 55b536233c trending notes grid modal
continuous-integration/drone/push Build is failing Details
2023-12-07 13:59:18 +02:00
Martti Malmi a1b2966188 trending notes showable as grid
continuous-integration/drone/push Build is failing Details
2023-12-07 13:33:36 +02:00
Martti Malmi 6ec5911b7c modal left & right btns 2023-12-07 12:54:11 +02:00
Martti Malmi e861f238f0 spotlight layout
continuous-integration/drone/push Build is failing Details
2023-12-07 11:59:05 +02:00
Martti Malmi 80d711f75f fix img gallery height, youtube embed 100% width on mobile
continuous-integration/drone/push Build is failing Details
2023-12-07 11:44:52 +02:00
Martti Malmi fbd6285b47 nip4decrypt
continuous-integration/drone/push Build is failing Details
2023-12-07 11:26:52 +02:00
Martti Malmi 728d104f91 icon for grid notes with multiple media items
continuous-integration/drone/push Build is failing Details
2023-12-07 10:50:44 +02:00
Martti Malmi 316b5578e8 set initial tab name correctly
continuous-integration/drone/push Build is failing Details
2023-12-07 10:20:22 +02:00
Martti Malmi 1e3a180150 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-07 08:12:59 +00:00
Martti Malmi 8bbd473b89 show correct feed name when not logged in
continuous-integration/drone/push Build is running Details
2023-12-07 10:11:45 +02:00
Martti Malmi c9e84ccbbf chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-07 07:12:06 +00:00
Martti Malmi e71d48ab91 hide nip05 from profile cards
continuous-integration/drone/push Build is running Details
2023-12-07 09:09:44 +02:00
Martti Malmi abd1d6453f e.stopPropagation on modal bg click 2023-12-06 17:32:48 +02:00
Martti Malmi eebe39b56e spotlight close btn
continuous-integration/drone/push Build is failing Details
2023-12-06 17:10:36 +02:00
Martti Malmi 3cb32b122b chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-06 14:59:03 +00:00
Martti Malmi ae1b762771 close thread spotlight on bg click
continuous-integration/drone/push Build is running Details
2023-12-06 16:57:52 +02:00
Martti Malmi d20543d7a3 spotlight videos
continuous-integration/drone/push Build is failing Details
2023-12-06 16:53:52 +02:00
Martti Malmi 199457b933 spotlight thread layout 2023-12-06 15:57:32 +02:00
Martti Malmi ada53a33b5 note img, video max-h-[80vh]
continuous-integration/drone/push Build is failing Details
2023-12-06 15:45:36 +02:00
Martti Malmi 50d90166fc autoplay vids on desktop, img constant height
continuous-integration/drone/push Build is failing Details
2023-12-06 11:57:31 +02:00
Martti Malmi 8dc0c28377 spotlight media & thread modals
continuous-integration/drone/push Build is failing Details
2023-12-06 11:38:04 +02:00
Martti Malmi fabf0f372f video icon shadow, focus search by cmd/ctrl + k
continuous-integration/drone/push Build is failing Details
2023-12-06 10:43:45 +02:00
Martti Malmi 8e77535a6a deck icon & media grid
continuous-integration/drone/push Build is failing Details
2023-12-06 10:13:59 +02:00
Martti Malmi a50aaba752 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-06 06:58:56 +00:00
Martti Malmi e4a4a1553a use Link and img elements for media grid
continuous-integration/drone/push Build is failing Details
2023-12-06 08:54:34 +02:00
Martti Malmi da93d3bdf6 show videos in media grid
continuous-integration/drone/push Build is failing Details
2023-12-05 21:19:24 +02:00
Martti Malmi 7aa6cc8295 decodeURIComponent for search term in header
continuous-integration/drone/push Build is failing Details
2023-12-05 20:57:49 +02:00
Martti Malmi 50bd37f3bd chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-05 18:51:42 +00:00
Martti Malmi 9e3032ce89 show trending hashtags instead of notes in sidebar if not logged in
continuous-integration/drone/push Build is failing Details
2023-12-05 20:49:21 +02:00
Martti Malmi 79c3c3ffc1 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-05 17:32:04 +00:00
Martti Malmi f15cb45879 hover:no-underline, smaller nav gap
continuous-integration/drone/push Build is running Details
2023-12-05 19:30:22 +02:00
Martti Malmi a6c5674f85 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-05 13:11:43 +00:00
Martti Malmi 78348364d7 nav layout
continuous-integration/drone/push Build is failing Details
2023-12-05 15:10:45 +02:00
Martti Malmi fd914ff952 DisplayAsSelector
continuous-integration/drone/push Build is failing Details
2023-12-05 14:56:12 +02:00
Martti Malmi 5b992ed3ab nav & footer hover styles
continuous-integration/drone/push Build is failing Details
2023-12-05 14:43:34 +02:00
Martti Malmi 1812e0391f chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-05 12:02:54 +00:00
Martti Malmi 8b4fc1dd3f chore: Update translations
continuous-integration/drone/push Build is running Details
2023-12-05 12:01:52 +00:00
Martti Malmi eb54ea98c7 neutral displayAsSelector active border-b
continuous-integration/drone/push Build is running Details
2023-12-05 14:00:22 +02:00
Martti Malmi 79c3cfd903 active nav styles & icons
continuous-integration/drone/push Build is running Details
2023-12-05 12:31:12 +02:00
Martti Malmi 3682f38398 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-05 08:21:55 +00:00
Martti Malmi f966586ae8 mobile sign-in btn, save msg draft, more subtle error
continuous-integration/drone/push Build is running Details
2023-12-05 10:19:07 +02:00
Martti Malmi 4e1cfddf88 logged-out signup btn margin 2023-12-05 10:19:07 +02:00
Martti Malmi d19f023c4c chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-04 22:35:23 +00:00
Martti Malmi 3badcd0ab6 store selected global relay in history
continuous-integration/drone/push Build is running Details
2023-12-05 00:32:55 +02:00
Martti Malmi 9af52bfefd new notes btn positioning 2023-12-04 23:05:00 +02:00
Martti Malmi 9ade6a553f header layout 2023-12-04 22:49:51 +02:00
Martti Malmi aa41b350fc back button in header 2023-12-04 22:30:24 +02:00
Martti Malmi 6e4de8c17a add search term to header, rm search page autofocus
continuous-integration/drone/push Build is failing Details
2023-12-04 20:54:48 +02:00
Martti Malmi 386276845c catch bech32toHex error
continuous-integration/drone/push Build is failing Details
2023-12-04 20:11:31 +02:00
Martti Malmi c57db533fc feed selector styling
continuous-integration/drone/push Build is failing Details
2023-12-04 16:28:53 +02:00
Martti Malmi 2920c2afaa hashtag header
continuous-integration/drone/push Build is failing Details
2023-12-04 16:20:21 +02:00
Martti Malmi 5f2cc0567f chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-04 14:18:33 +00:00
Martti Malmi ff65b43c55 feed selector on all feed pages
continuous-integration/drone/push Build is failing Details
2023-12-04 16:16:42 +02:00
Martti Malmi c493b959e7 note and profile titles in header 2023-12-04 15:40:22 +02:00
Martti Malmi b11482ede1 desktop header, feed selector & page name in header 2023-12-04 12:20:18 +02:00
Martti Malmi fdd8abc9fb chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-04 07:52:56 +00:00
Martti Malmi dc3cd20c2d hide some footer icons in readonly
continuous-integration/drone/push Build is failing Details
2023-12-04 09:50:40 +02:00
Kieran ca6fde4f10 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-03 14:07:59 +00:00
Kieran f3dfeab0f8
fix: close ok row
continuous-integration/drone/push Build is failing Details
2023-12-03 14:06:40 +00:00
Kieran fadfdb576a chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-02 22:45:52 +00:00
Kieran cfb446c7c8
feat: toast notify on publish
continuous-integration/drone/push Build is running Details
2023-12-02 22:44:56 +00:00
Kieran 46ee7385fc chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-02 21:35:36 +00:00
Kieran 7deae68884 Merge pull request 'add follow buttons in people search results' (#715) from w3irdrobot/snort:follow-buttons-people-search into main
continuous-integration/drone/push Build is running Details
Reviewed-on: #715
2023-12-02 21:34:34 +00:00
Kieran 826d6a5765 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-02 21:29:54 +00:00
Kieran f26155ddd8
feat: invite codes
continuous-integration/drone/push Build is failing Details
2023-12-02 21:27:57 +00:00
Kieran 6f8e8eca0f
feat: ref codes 2023-12-02 21:27:57 +00:00
Martti Malmi 9e4a0542ea chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-02 19:46:52 +00:00
Martti Malmi 052d3b0037 column border color
continuous-integration/drone/push Build is running Details
2023-12-02 21:45:09 +02:00
Martti Malmi 9f6ca8e756 slightly less bad search box bg 2023-12-02 21:45:09 +02:00
w3irdrobot a57a53ca76
add follow buttons in people search results
continuous-integration/drone/pr Build is failing Details
2023-12-01 17:27:26 -05:00
Martti Malmi 601ecaa9de chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-01 17:12:44 +00:00
Martti Malmi 9fec0ab95b .pb-footer-height
continuous-integration/drone/push Build is running Details
2023-12-01 19:11:10 +02:00
Martti Malmi 297186c33c viewport meta tag 2023-12-01 18:51:53 +02:00
Martti Malmi 81a4c1aac1 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-01 16:30:43 +00:00
Martti Malmi 984e216f0b .pb-safe-area
continuous-integration/drone/push Build is running Details
2023-12-01 18:29:24 +02:00
Martti Malmi f659bef15d chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-01 15:55:33 +00:00
Martti Malmi d3f3e50c0b rm "follows you" from own profile page
continuous-integration/drone/push Build is running Details
2023-12-01 17:54:15 +02:00
Martti Malmi 1d5107bd89 hide mobile footer in dm view, fix ProxyImg
continuous-integration/drone/push Build is failing Details
2023-12-01 17:42:45 +02:00
Martti Malmi 689839e043 scroll up on active NavLink click, mobile messages & footer 2023-12-01 17:42:45 +02:00
Martti Malmi dda38ab824 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-12-01 14:25:03 +00:00
Martti Malmi e9f70cd040 mobile footer
continuous-integration/drone/push Build is failing Details
2023-12-01 16:22:54 +02:00
Martti Malmi 7443012995 don't show profilecard in searchbox results
continuous-integration/drone/push Build is failing Details
2023-11-30 15:28:38 +02:00
Martti Malmi a3f9aa2fbf chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-30 13:13:22 +00:00
Martti Malmi 07db21d4d0 "not followed by anyone you follow"
continuous-integration/drone/push Build is running Details
2023-11-30 15:12:06 +02:00
Martti Malmi d4b343a18c ShortNote fix
continuous-integration/drone/push Build is failing Details
2023-11-30 15:03:41 +02:00
Martti Malmi 4ce15ca1c5 restore graph to navbar on iris
continuous-integration/drone/push Build is failing Details
2023-11-30 14:46:38 +02:00
Martti Malmi 69d47621ac chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-30 12:42:24 +00:00
Martti Malmi 91a10024e0 read-only mode nav avatar icon and text
continuous-integration/drone/push Build is running Details
2023-11-30 14:40:46 +02:00
Martti Malmi 96e49dac41 fix navigating between NostrLinkHandler urls
continuous-integration/drone/push Build is failing Details
2023-11-30 13:51:06 +02:00
Martti Malmi ce93ee1c41 trending notes bg color
continuous-integration/drone/push Build is failing Details
2023-11-30 13:14:29 +02:00
Martti Malmi a4f691d260 disable media and line breaks in trending notes
continuous-integration/drone/push Build is failing Details
2023-11-30 13:10:46 +02:00
Martti Malmi 468dc3bae6 smaller trending notes
continuous-integration/drone/push Build is failing Details
2023-11-30 12:52:13 +02:00
Martti Malmi e8abd5ac09 notifications repost icon color
continuous-integration/drone/push Build is failing Details
2023-11-30 11:25:50 +02:00
Martti Malmi ad3ec993a6 darker font color in light theme
continuous-integration/drone/push Build is failing Details
2023-11-29 16:51:11 +02:00
Martti Malmi 302aa2ec06 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 14:01:42 +00:00
Martti Malmi 67af84e8bb smaller header in mobile size
continuous-integration/drone/push Build is failing Details
2023-11-29 16:00:19 +02:00
Martti Malmi 7c63cf1ab5 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 13:41:47 +00:00
Martti Malmi fa701308c0 chore: Update translations
continuous-integration/drone/push Build was killed Details
2023-11-29 13:40:58 +00:00
Martti Malmi 1febb82c22 chore: Update translations
continuous-integration/drone/push Build is running Details
2023-11-29 13:40:05 +00:00
Martti Malmi 2bd58a526c chore: Update translations
continuous-integration/drone/push Build was killed Details
2023-11-29 13:39:17 +00:00
Martti Malmi 26e146251c chore: Update translations
continuous-integration/drone/push Build is running Details
2023-11-29 13:38:23 +00:00
Martti Malmi b37d2b0fe8 move FollowedBy below bio in profile
continuous-integration/drone/push Build is running Details
2023-11-29 15:36:56 +02:00
Martti Malmi 902e2dd960 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 13:27:49 +00:00
Martti Malmi d704ded3d8 notif and qr profile link prefixes from config
continuous-integration/drone/push Build is running Details
2023-11-29 15:26:44 +02:00
Martti Malmi 1f82d38acb img grid paddings
continuous-integration/drone/push Build is failing Details
2023-11-29 15:09:51 +02:00
Kieran bbcedbd99c
feat: add birthday
continuous-integration/drone/push Build is failing Details
2023-11-29 12:44:13 +00:00
Martti Malmi d84843a46d no avatar title when profilecard is shown
continuous-integration/drone/push Build is failing Details
2023-11-29 14:37:14 +02:00
Martti Malmi 51e68b1288 ProfileCard: FollowedBy, fix tab selector z-index
continuous-integration/drone/push Build is failing Details
2023-11-29 14:25:19 +02:00
Martti Malmi 3acb2d4d34 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 12:14:32 +00:00
Martti Malmi d2b95375b6 ProfileLink to /npub if profile not present
continuous-integration/drone/push Build is running Details
2023-11-29 14:13:14 +02:00
Martti Malmi 61e93bd194 remove npub copy from profile (still in qr view) 2023-11-29 14:12:09 +02:00
Martti Malmi 3a07e2abee hide nip05 in notes on iris 2023-11-29 14:12:09 +02:00
Martti Malmi c3a6304573 better "followed by" layout 2023-11-29 14:12:09 +02:00
Kieran 5be04c86b3 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 12:08:30 +00:00
Kieran 8b1745ae08
chore: typo
continuous-integration/drone/push Build is running Details
2023-11-29 12:07:12 +00:00
Kieran 933ab4a71f
chore: add deck config
continuous-integration/drone/push Build was killed Details
2023-11-29 12:06:46 +00:00
Kieran 511f401367
feat: limit deck to subscribers
continuous-integration/drone/push Build is running Details
2023-11-29 12:05:47 +00:00
Kieran 96e954d5e7 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 10:54:49 +00:00
Kieran ca472a5756
chore: formatting
continuous-integration/drone/push Build is failing Details
2023-11-29 10:53:17 +00:00
Kieran b6197f533f
chore: tweak right bar padding 2023-11-29 10:52:42 +00:00
Kieran 11e3136008
chore: tweak donate page styles 2023-11-29 10:52:42 +00:00
Kieran 8dc6f2884f
feat: filter nav sidebar 2023-11-29 10:52:42 +00:00
Kieran d27045794a
fix: align subscription 2023-11-29 10:52:41 +00:00
Kieran 11824269f2
chore: tweak proxyimg for avatar 2023-11-29 10:52:41 +00:00
Martti Malmi ea5e324793 restore layout overflow-x-hidden
continuous-integration/drone/push Build is failing Details
2023-11-29 12:02:58 +02:00
benthecarman 9b5721faa4
Trim Zap comment
continuous-integration/drone/push Build is failing Details
We had a bug when trying to parse the json of a comment. It had a \n at the end of it and a browser's json parser couldn't handle it. This should fix
2023-11-29 09:49:49 +00:00
Martti Malmi 6df3459dba chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 08:27:43 +00:00
Martti Malmi de1ad63924 add donate link to navsidebar
continuous-integration/drone/pr Build is failing Details
continuous-integration/drone/push Build is failing Details
2023-11-29 10:26:10 +02:00
Martti Malmi 37cc990f18 make feed selector sticky
continuous-integration/drone/pr Build is failing Details
2023-11-29 10:07:40 +02:00
Martti Malmi 1ffc2c6bf2 LoginSession.feedDisplayAs
continuous-integration/drone/pr Build is failing Details
2023-11-29 09:47:22 +02:00
Martti Malmi 83299f2feb rm trending hashtags & users
continuous-integration/drone/push Build is failing Details
2023-11-29 09:03:30 +02:00
Martti Malmi 9299722ac0 fix build
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/pr Build is failing Details
2023-11-29 08:49:16 +02:00
Martti Malmi acbe59b7bb chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-29 06:39:47 +00:00
Martti Malmi 79095b234b replace Feed / Grid with icons
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/pr Build is failing Details
2023-11-29 08:37:29 +02:00
Martti Malmi 700decbe06 fix grid img link url
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/pr Build is failing Details
2023-11-28 23:08:26 +02:00
Martti Malmi 71fcf4f4ac chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-28 20:53:34 +00:00
Martti Malmi 65686ae9f3 tighter grid layout on mobile
continuous-integration/drone/push Build is running Details
continuous-integration/drone/pr Build is failing Details
2023-11-28 22:52:19 +02:00
Martti Malmi d240e82a95 correct proxy resize value for grid 2023-11-28 22:52:19 +02:00
Martti Malmi ad163625c3 prop to hide displayAs selector 2023-11-28 22:52:19 +02:00
Martti Malmi 1330db056a DisplayAsSelector.tsx 2023-11-28 22:52:19 +02:00
Martti Malmi 6d1d1bfc44 init displayAs 2023-11-28 22:52:19 +02:00
Martti Malmi bc6bced1b8 navigate to note by grid img click 2023-11-28 22:52:19 +02:00
Martti Malmi aecb4408a0 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-28 19:43:54 +00:00
Martti Malmi ef4667c879 add feed / grid selector to feeds
continuous-integration/drone/push Build is running Details
continuous-integration/drone/pr Build is failing Details
2023-11-28 21:42:26 +02:00
Martti Malmi c4273b9bdf image grid 2023-11-28 21:42:26 +02:00
Martti Malmi 04fea3e43b chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-28 18:21:15 +00:00
Martti Malmi 9393e3342d setting for showing content warning posts
continuous-integration/drone/push Build is running Details
continuous-integration/drone/pr Build is failing Details
2023-11-28 20:19:11 +02:00
Martti Malmi 9749883cc1 checkmark hover text
continuous-integration/drone/push Build is failing Details
continuous-integration/drone/pr Build is failing Details
2023-11-28 14:49:49 +02:00
Martti Malmi 4d57cde8f0 avatar classnames 2023-11-28 14:49:49 +02:00
Martti Malmi 95aa6f78bb CONFIG.bypassImgProxyError to load directly from origin 2023-11-28 14:49:49 +02:00
Martti Malmi 07e2c15f54 NavSidebar search for non-logged-in 2023-11-28 14:49:49 +02:00
Martti Malmi a06b7ccada tailwind classes for media grid 2023-11-28 14:49:49 +02:00
Martti Malmi 509228d532 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-28 10:24:58 +00:00
Martti Malmi ad0f691577 reorganize files & rm unused
continuous-integration/drone/pr Build is failing Details
continuous-integration/drone/push Build is running Details
2023-11-28 12:05:55 +02:00
Martti Malmi 79e303f097 hide sign-up/moderation in iris
continuous-integration/drone/pr Build is failing Details
2023-11-28 11:52:20 +02:00
Martti Malmi 398ab46e42 note creation file reordering
continuous-integration/drone/pr Build is failing Details
2023-11-28 11:39:12 +02:00
Martti Malmi 3541f7fea3 Merge remote-tracking branch 'kieran/main'
continuous-integration/drone/pr Build is failing Details
2023-11-28 11:23:41 +02:00
Martti Malmi d28f287173 new note btn circular
continuous-integration/drone/pr Build is failing Details
2023-11-28 11:23:02 +02:00
Martti Malmi d41e7e5ce0 use CONFIG.defaultRelays for new users
continuous-integration/drone/pr Build is failing Details
2023-11-28 10:47:57 +02:00
Martti Malmi 9d0f7f4596 hide NoteBroadcaster in iris 2023-11-28 10:40:36 +02:00
Martti Malmi 31129fab2c increase right column paddings 2023-11-27 22:57:48 +02:00
Martti Malmi 6190f3cd9d HasNotificationsMarker for left nav 2023-11-27 21:20:29 +02:00
Martti Malmi 836af8fbd2 remove some awaits from generateNewLogin 2023-11-27 18:37:11 +02:00
mmalmi 625c8d4d43 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-27 15:25:04 +00:00
mmalmi 7dfb7ec363 Merge pull request '3-column layout' (#699) from mmalmi/snort:main into main
continuous-integration/drone/push Build is running Details
2023-11-27 15:22:02 +00:00
Martti Malmi 8deb27b3e2 increase avatar z-index
continuous-integration/drone/pr Build is failing Details
2023-11-27 17:19:15 +02:00
Martti Malmi e184a96dc9 no navLogo for snort
continuous-integration/drone/pr Build is failing Details
2023-11-27 16:30:20 +02:00
Martti Malmi 09dd97111a Merge remote-tracking branch 'kieran/main'
continuous-integration/drone/pr Build is failing Details
2023-11-27 15:53:01 +02:00
Martti Malmi 9db117e270 goToEvent target handling
continuous-integration/drone/pr Build is failing Details
2023-11-27 15:31:45 +02:00
Martti Malmi 6b3102f30a note hover color
continuous-integration/drone/pr Build is failing Details
2023-11-27 15:06:51 +02:00
Martti Malmi 360ca20eba rm dms 4th column
continuous-integration/drone/pr Build is failing Details
2023-11-27 14:28:44 +02:00
Martti Malmi dcd7faa3aa dm rounded corner
continuous-integration/drone/pr Build is failing Details
2023-11-27 14:26:33 +02:00
Martti Malmi 77ab39470f remove attachment button from dms
continuous-integration/drone/pr Build is failing Details
2023-11-27 14:22:48 +02:00
Martti Malmi ae73e2b383 chat layout
continuous-integration/drone/pr Build is failing Details
2023-11-27 14:14:02 +02:00
Martti Malmi ecd5ea111d dm layout fix
continuous-integration/drone/pr Build is failing Details
2023-11-27 11:10:58 +02:00
Martti Malmi 9043a1851d dm cursor-pointer
continuous-integration/drone/pr Build is failing Details
2023-11-26 22:58:30 +02:00
Kieran edf4c0db99
chore: bump packages
continuous-integration/drone/push Build is failing Details
2023-11-26 17:56:04 +00:00
Kieran 095564d16b chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-26 17:26:52 +00:00
Kieran 42a95d8de0 Merge pull request 'More freedom in steps for zap pools sliders' (#701) from vivganes/snort:zap-pool-patch into main
continuous-integration/drone/push Build is running Details
Reviewed-on: #701
2023-11-26 17:25:36 +00:00
vivganes 61b4dba008 more freedom in steps for zap pools sliders
continuous-integration/drone/pr Build is failing Details
2023-11-26 17:13:31 +00:00
Martti Malmi 1080c4aa0e restore @uidotdev/usehooks
continuous-integration/drone/pr Build is failing Details
2023-11-26 17:09:35 +02:00
Martti Malmi 11cdd51eed update yarn.lock
continuous-integration/drone/pr Build is failing Details
2023-11-26 17:04:26 +02:00
Martti Malmi 0434ae43d8 hide right column in some views
continuous-integration/drone/pr Build is failing Details
2023-11-26 16:59:29 +02:00
Martti Malmi 8bc323489e split MessagesPage into smaller files 2023-11-26 16:45:42 +02:00
Martti Malmi 2e54104618 relative times
continuous-integration/drone/pr Build is failing Details
2023-11-26 16:21:56 +02:00
Martti Malmi 9fd1685fa1 fix mobile logo aspect ratio
continuous-integration/drone/pr Build is failing Details
2023-11-26 16:09:29 +02:00
Martti Malmi c2bd6ae856 Merge remote-tracking branch 'kieran/main'
continuous-integration/drone/pr Build is failing Details
2023-11-26 15:52:50 +02:00
Martti Malmi a612db65c7 add follow distance indicator to profile pages
continuous-integration/drone/pr Build is failing Details
2023-11-26 12:07:41 +02:00
Martti Malmi a592974b93 add ErrorBoundary around layout outlet
continuous-integration/drone/pr Build is failing Details
2023-11-26 11:28:42 +02:00
Martti Malmi 920f8ae20d use dynamic imports instead of lazy loading for NetworkGraph 2023-11-26 11:17:59 +02:00
Martti Malmi a92fc267c3 close profilecard on mouse leave
continuous-integration/drone/pr Build is failing Details
2023-11-25 22:54:24 +02:00
Martti Malmi 561ee94ab0 smaller trending notes
continuous-integration/drone/pr Build is failing Details
2023-11-25 21:20:18 +02:00
Martti Malmi 9a0b7c08d9 show more / less for long posts
continuous-integration/drone/pr Build is failing Details
2023-11-25 20:56:23 +02:00
Martti Malmi 8d44eb6a09 show ProfilePage settings button only in mobile size
continuous-integration/drone/pr Build is failing Details
2023-11-24 22:46:28 +02:00
Martti Malmi e6be61e12a show own posts in follows feed
continuous-integration/drone/pr Build is failing Details
2023-11-24 21:17:04 +02:00
Kieran 602592c424 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-24 17:05:42 +00:00
Kieran b62519db31
chore: drop twitter embed
continuous-integration/drone/push Build is failing Details
2023-11-24 17:04:04 +00:00
Martti Malmi 4813e4e4f1 smaller trending hashtags listing
continuous-integration/drone/pr Build is failing Details
2023-11-24 17:18:58 +02:00
Martti Malmi b7545295d4 tmp disable tweet embed (require is not defined error)
continuous-integration/drone/pr Build is failing Details
2023-11-24 17:04:12 +02:00
Martti Malmi e0b85b90f9 user?.pubkey
continuous-integration/drone/pr Build is failing Details
2023-11-24 16:37:12 +02:00
Martti Malmi 13b76e7709 show "followed by" on profile pages
continuous-integration/drone/pr Build is failing Details
2023-11-24 16:18:32 +02:00
Martti Malmi 47aec5437d fuse fuzzy user search
continuous-integration/drone/pr Build is failing Details
2023-11-24 15:50:40 +02:00
Kieran 0f9f8ecb95
fix: brave toString weirdness
continuous-integration/drone/push Build is failing Details
2023-11-24 12:10:56 +00:00
Martti Malmi 2c14a8f404 scrollable left navbar 2023-11-24 13:32:19 +02:00
Kieran e21e549969 chore: Update translations
continuous-integration/drone/push Build is failing Details
2023-11-24 10:41:04 +00:00
Kieran edfe9c3697
fix: clear cache on install
continuous-integration/drone/push Build is failing Details
2023-11-24 10:39:15 +00:00
Martti Malmi 29bba9aef3 close graph on esc
continuous-integration/drone/pr Build is failing Details
2023-11-23 11:51:44 +02:00
Martti Malmi 6bef3ccf58 remove link directional particles from social graph
continuous-integration/drone/pr Build is failing Details
2023-11-23 11:43:55 +02:00
Martti Malmi a0151745bf mv social graph link from settings menu to nav
continuous-integration/drone/pr Build is failing Details
2023-11-23 11:41:38 +02:00
Martti Malmi 6a6accfed6 narrow navbar in deck view
continuous-integration/drone/pr Build is failing Details
2023-11-23 11:28:30 +02:00
Martti Malmi 4eb0408c27 use same navbar in deck view
continuous-integration/drone/pr Build is failing Details
2023-11-23 11:01:17 +02:00
Martti Malmi ef77606427 active settings menu item style
continuous-integration/drone/pr Build is failing Details
2023-11-23 10:57:28 +02:00
Martti Malmi 7e69e9a42a active nav item style
continuous-integration/drone/pr Build is failing Details
2023-11-23 10:31:19 +02:00
Martti Malmi bfc42bcd36 add search icon to navbar
continuous-integration/drone/pr Build is failing Details
2023-11-23 10:14:41 +02:00
Martti Malmi f3eb414c6a hide right col scrollbar 2023-11-23 09:52:19 +02:00
Martti Malmi 62e99a4ed4 right column trending bg
continuous-integration/drone/pr Build is failing Details
2023-11-22 18:14:34 +02:00
Martti Malmi 90c00c5fa4 TrendingUsers and Hashtags default count Infinity
continuous-integration/drone/pr Build is failing Details
2023-11-22 17:28:22 +02:00
Martti Malmi b52b84e466 deck icon
continuous-integration/drone/pr Build is failing Details
2023-11-22 17:21:00 +02:00
Martti Malmi de524b50fc make whole page element scrollable
continuous-integration/drone/pr Build is failing Details
2023-11-22 17:10:00 +02:00
Martti Malmi 1af8316453 add Deck nav link
continuous-integration/drone/pr Build is failing Details
2023-11-22 16:45:39 +02:00
Martti Malmi 55fae3aa41 restore useLoginFeed
continuous-integration/drone/pr Build is failing Details
2023-11-22 16:13:36 +02:00
Martti Malmi 131e564bd0 left nav layout
continuous-integration/drone/pr Build is failing Details
2023-11-22 15:24:30 +02:00
Martti Malmi c5bc1cdbe7 app icon in navbar
continuous-integration/drone/pr Build is failing Details
2023-11-22 15:13:33 +02:00
Martti Malmi e788e01c6d sticky header in mobile size
continuous-integration/drone/pr Build is failing Details
2023-11-22 15:02:45 +02:00
Martti Malmi 28bf0ea581 sticky right column
continuous-integration/drone/pr Build is failing Details
2023-11-22 14:31:08 +02:00
Martti Malmi ced63ab6d1 new note text in sidebar btn 2023-11-22 14:25:43 +02:00
Martti Malmi e97b9bdba4 scrollable trending column 2023-11-22 14:13:40 +02:00
Martti Malmi f9e7bc8558 add trending stuff to right column 2023-11-22 14:06:42 +02:00
Martti Malmi f9d0318f36 rm main-content border 2023-11-22 13:53:59 +02:00
Martti Malmi f5bb524628 Revert "lazy load Notifications page"
continuous-integration/drone/pr Build is failing Details
This reverts commit d8dfc962c1.
2023-11-22 13:32:18 +02:00
Martti Malmi 77984f9124 right col border
continuous-integration/drone/pr Build is failing Details
2023-11-22 13:22:39 +02:00
Martti Malmi cb5fd78382 sidebar items for non-logged-in user 2023-11-22 13:22:39 +02:00
Martti Malmi 9aafc329cb home icon 2023-11-22 13:22:38 +02:00
Martti Malmi 59ffb84458 /new/discover -> /discover 2023-11-22 13:22:38 +02:00
Martti Malmi c5d22b84be layout 2023-11-22 13:22:38 +02:00
Martti Malmi 8e5acc3ea5 settings & notes icons 2023-11-22 13:22:38 +02:00
Martti Malmi 667bce637f profile link to nav sidebar 2023-11-22 13:22:38 +02:00
Martti Malmi 4dfa610c87 simplify settings page 2023-11-22 13:22:38 +02:00
Martti Malmi dd941ae70e wip 3-col layout 2023-11-22 13:22:38 +02:00
Martti Malmi 60af57059b use vitest instead of jest 2023-11-22 13:22:38 +02:00
Martti Malmi f69e05d8fc rollup visualizer output to build dir 2023-11-22 13:22:38 +02:00
Martti Malmi d8dfc962c1 lazy load Notifications page 2023-11-22 13:22:38 +02:00
769 changed files with 44507 additions and 21288 deletions

10
.dockerignore Normal file
View File

@ -0,0 +1,10 @@
**/node_modules
**/.pnp.*
**/.yarn/*
!**/.yarn/patches
!**/.yarn/plugins
!**/.yarn/releases
!**/.yarn/sdks
!**/.yarn/versions
**/.idea
**/target

View File

@ -17,17 +17,19 @@ steps:
commands:
- git fetch --tags
- name: Build site
image: node:current-bullseye
image: node:current
volumes:
- name: cache
path: /cache
environment:
YARN_CACHE_FOLDER: /cache/.yarn-docker
NODE_CONFIG_ENV: default
commands:
- apt update && apt install -y git
- yarn install
- yarn build
- name: build docker image
image: r.j3ss.co/img
image: docker
privileged: true
volumes:
- name: cache
@ -36,9 +38,11 @@ steps:
TOKEN:
from_secret: docker_hub
commands:
- img login -u voidic -p $TOKEN
- img build -t voidic/snort:latest --platform linux/amd64,linux/arm64 -f Dockerfile.prebuilt .
- img push voidic/snort:latest
- dockerd &
- docker login -u voidic -p $TOKEN
- docker buildx create --name mybuilder --bootstrap --use
- docker buildx build -t voidic/snort:latest --platform linux/amd64,linux/arm64 --push -f Dockerfile.prebuilt .
- kill $(cat /var/run/docker.pid)
volumes:
- name: cache
claim:
@ -53,12 +57,13 @@ metadata:
namespace: git
steps:
- name: Test/Lint
image: node:current-bullseye
image: node:current
volumes:
- name: cache
path: /cache
environment:
YARN_CACHE_FOLDER: /cache/.yarn-test
NODE_CONFIG_ENV: default
commands:
- yarn install
- yarn build
@ -84,12 +89,13 @@ metadata:
namespace: git
steps:
- name: Push/Pull translations
image: node:current-bullseye
image: node:current
volumes:
- name: cache
path: /cache
environment:
YARN_CACHE_FOLDER: /cache/.yarn-translations
NODE_CONFIG_ENV: default
TOKEN:
from_secret: gitea
CTOKEN:
@ -129,17 +135,19 @@ steps:
commands:
- git fetch --tags
- name: Build site
image: node:current-bullseye
image: node:current
volumes:
- name: cache
path: /cache
environment:
YARN_CACHE_FOLDER: /cache/.yarn-docker-release
YARN_CACHE_FOLDER: /cache/.yarn-docker-
NODE_CONFIG_ENV: default
commands:
- apt update && apt install -y git
- yarn install
- yarn build
- name: build docker image
image: r.j3ss.co/img
image: docker
privileged: true
volumes:
- name: cache
@ -148,9 +156,11 @@ steps:
TOKEN:
from_secret: docker_hub
commands:
- img login -u voidic -p $TOKEN
- img build -t voidic/snort:$DRONE_TAG --platform linux/amd64,linux/arm64 -f Dockerfile.prebuilt .
- img push voidic/snort:$DRONE_TAG
- dockerd &
- docker login -u voidic -p $TOKEN
- docker buildx create --name mybuilder --bootstrap --use
- docker buildx build -t voidic/snort:$DRONE_TAG --platform linux/amd64,linux/arm64 --push -f Dockerfile.prebuilt .
- kill $(cat /var/run/docker.pid)
volumes:
- name: cache
claim:

View File

@ -8,42 +8,6 @@ env:
DOCKER_CLI_EXPERIMENTAL: enabled
TAG_FMT: "^refs/tags/(((.?[0-9]+){3,4}))$"
jobs:
tauri_release:
permissions:
contents: write
strategy:
fail-fast: false
matrix:
platform: [macos-latest, ubuntu-20.04, windows-latest]
runs-on: ${{ matrix.platform }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Install dependencies (ubuntu only)
if: matrix.platform == 'ubuntu-20.04'
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev
- name: Rust setup
uses: dtolnay/rust-toolchain@stable
- name: Rust cache
uses: swatinem/rust-cache@v2
with:
workspaces: "./src-tauri -> target"
- name: Sync node version and setup cache
uses: actions/setup-node@v3
with:
node-version: "16"
cache: "yarn"
- name: Install frontend dependencies
run: yarn install
- name: Build the app
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tagName: ${{ github.ref_name }}
app:
runs-on: ubuntu-latest
permissions:
@ -92,7 +56,8 @@ jobs:
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "33.0.0"
- name: Sign APK
uses: r0adkll/sign-android-release@v1
with:
@ -101,6 +66,8 @@ jobs:
alias: ${{ secrets.KEY_ALIAS }}
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
keyPassword: ${{ secrets.KEY_PASSWORD }}
env:
BUILD_TOOLS_VERSION: "33.0.0"
- name: Rename files
run: |-
mkdir -p snort_android/app/release

4
.gitignore vendored
View File

@ -11,4 +11,6 @@ dist/
*.tgz
*.log
.DS_Store
.pnp*
.pnp*
docs/
.wrangler/

File diff suppressed because one or more lines are too long

893
.yarn/releases/yarn-4.1.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

View File

@ -1 +1,9 @@
yarnPath: .yarn/releases/yarn-3.6.3.cjs
compressionLevel: mixed
enableGlobalCache: false
npmScopes:
here:
npmRegistryServer: "https://repo.platform.here.com/artifactory/api/npm/maps-api-for-javascript/"
yarnPath: .yarn/releases/yarn-4.1.1.cjs

View File

@ -1,12 +1,12 @@
FROM node:19 as build
WORKDIR /app
COPY package.json yarn.lock .yarnrc.yml .
COPY .yarn .yarn
COPY packages packages
RUN yarn --network-timeout 1000000
RUN yarn build
FROM node:current as build
WORKDIR /src
RUN apt update \
&& apt install -y --no-install-recommends git \
&& git clone --single-branch -b main https://git.v0l.io/Kieran/snort \
&& cd snort \
&& yarn --network-timeout 1000000 \
&& yarn build
FROM nginxinc/nginx-unprivileged:mainline-alpine
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
COPY --from=build /app/packages/app/build /usr/share/nginx/html
COPY --from=build /src/snort/packages/app/build /usr/share/nginx/html

View File

@ -65,6 +65,19 @@ To build the application and system packages, use
$ yarn build
```
Tauri desktop application:
```
# install dependencies
yarn
# develop
yarn tauri dev
# build
yarn tauri build
```
### Translations
[![Crowdin](https://badges.crowdin.net/snort/localized.svg)](https://crowdin.com/project/snort)

30
dev-docs/query.md Normal file
View File

@ -0,0 +1,30 @@
# Reactions
## Problem
When presented with a feed of notes, either a timeline (social) or a live chat log (live stream chat)
how do you fetch the reactions to such notes and maintain realtime updates.
## Current solution
When a list of reactions is requested we use the expensive `buildDiff` operation to compute a
list of new (added) filters and send them to relays.
Usually if `leaveOpen` is specified (as it should be for realtime updates) this new trace will be sent
as a separate subscription causing exhasution.
Another side effect of this this approach is that over time (especially in live chat) the number of filters that get passed to `buildDiff` increases and so the computation time takes longer and causes jank (https://git.v0l.io/Kieran/zap.stream/issues/126).
There is also the question of updating the "root" query, since this is not updated, each independant query trace receives its own set of updates which is a problem of its own.
## Proposed solution (Live chat)
The ideal solution is to update only the "root" query as new filters are detected along with appending the current timestamp as the `since` value.
In this way only 1 subscription is maintained, the "root" query trace.
Each time a new set of filters is created from `buildDiff` we push the same `REQ` again with the new filters which **should** result in no new results from the relays as we expect there to be none `since` the current time is the time of the latest message.
## Proposed solution (Timeline)
TBD

View File

@ -3,6 +3,9 @@ server {
server_name _;
root /usr/share/nginx/html;
index index.html;
add_header Content-Security-Policy "default-src 'self'; manifest-src *; child-src 'none'; worker-src 'self'; frame-src youtube.com www.youtube.com https://platform.twitter.com https://embed.tidal.com https://w.soundcloud.com https://www.mixcloud.com https://open.spotify.com https://player.twitch.tv https://embed.music.apple.com https://embed.wavlake.com https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; connect-src *; img-src * data: blob:; font-src 'self'; media-src * blob:; script-src 'self' 'wasm-unsafe-eval' https://platform.twitter.com https://embed.tidal.com https://challenges.cloudflare.com";
add_header Cross-Origin-Opener-Policy same-origin;
add_header Cross-Origin-Embedder-Policy require-corp;
location / {
try_files $uri $uri/ /index.html =404;

50
functions/_middleware.ts Normal file
View File

@ -0,0 +1,50 @@
interface Env {}
const HOST = "snort.social";
export const onRequest: PagesFunction<Env> = async context => {
const u = new URL(context.request.url);
const prefixes = ["npub1", "nprofile1", "naddr1", "nevent1", "note1"];
const isEntityPath = prefixes.some(
a => u.pathname.startsWith(`/${a}`) || u.pathname.startsWith(`/e/${a}`) || u.pathname.startsWith(`/p/${a}`),
);
const nostrAddress = u.pathname.match(/^\/([a-zA-Z0-9_]+)$/i);
const next = await context.next();
if (u.pathname != "/" && (isEntityPath || nostrAddress)) {
//console.log("Handeling path: ", u.pathname, isEntityPath, nostrAddress[1]);
try {
let id = u.pathname.split("/").at(-1);
if (!isEntityPath && nostrAddress) {
id = `${id}@${HOST}`;
}
const fetchApi = `https://nostr.api.v0l.io/api/v1/opengraph/${id}?canonical=${encodeURIComponent(
`https://${HOST}/%s`,
)}`;
console.log("Fetching tags from: ", fetchApi);
const rsp = await fetch(fetchApi, {
method: "POST",
body: await next.arrayBuffer(),
headers: {
"user-agent": `SnortFunctions/1.0 (https://${HOST})`,
"content-type": "text/html",
accept: "text/html",
},
});
if (rsp.ok) {
const body = await rsp.text();
if (body.length > 0) {
return new Response(body, {
headers: {
...Object.fromEntries(rsp.headers.entries()),
"cache-control": "public, max-age=60",
},
});
}
}
} catch (e) {
console.error(e);
}
}
return next;
};

View File

@ -1,30 +0,0 @@
interface Env {}
export const onRequest: PagesFunction<Env> = async context => {
const id = context.params.id as string;
const next = await context.next();
try {
const rsp = await fetch(`https://api.snort.social/api/v1/og/tag/e/${id}`, {
method: "POST",
body: await next.arrayBuffer(),
headers: {
"user-agent": "Snort-Functions/1.0 (https://snort.social)",
"content-type": "text/plain",
},
});
if (rsp.ok) {
const body = await rsp.text();
if (body.length > 0) {
return new Response(body, {
headers: {
"content-type": "text/html",
},
});
}
}
} catch {
// ignore
}
return next;
};

View File

@ -1,30 +0,0 @@
interface Env {}
export const onRequest: PagesFunction<Env> = async context => {
const id = context.params.id as string;
const next = await context.next();
try {
const rsp = await fetch(`https://api.snort.social/api/v1/og/tag/p/${id}`, {
method: "POST",
body: await next.arrayBuffer(),
headers: {
"user-agent": "Snort-Functions/1.0 (https://snort.social)",
"content-type": "text/plain",
},
});
if (rsp.ok) {
const body = await rsp.text();
if (body.length > 0) {
return new Response(body, {
headers: {
"content-type": "text/html",
},
});
}
}
} catch {
// ignore
}
return next;
};

8
maintainers.yaml Normal file
View File

@ -0,0 +1,8 @@
maintainers:
- npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
relays:
- wss://relay.snort.social/
- wss://pyramid.fiatjaf.com/
- wss://nos.lol/
- ws://skzzn6cimfdv5e2phjc4yr5v7ikbxtn5f7dkwn5c7v47tduzlbosqmqd.onion/

View File

@ -4,24 +4,29 @@
"packages/*"
],
"scripts": {
"build": "yarn workspace @snort/shared build && yarn workspace @snort/system build && yarn workspace @snort/system-web build && yarn workspace @snort/system-react build && yarn workspace @snort/app build",
"build": "yarn workspace @snort/shared build && yarn workspace @snort/worker-relay build && yarn workspace @snort/system build && yarn workspace @snort/system-web build && yarn workspace @snort/system-react build && yarn workspace @snort/wallet build && yarn workspace @snort/app build",
"start": "yarn build && yarn workspace @snort/app start",
"test": "yarn build && yarn workspace @snort/app test && yarn workspace @snort/system test",
"pre:commit": "yarn workspace @snort/app intl-extract && yarn workspace @snort/app intl-compile && yarn prettier --write .",
"push-prod": "git checkout snort-prod && git merge --ff-only main && git push && git checkout main"
"push-prod": "git switch snort-prod && git merge --ff-only main && git push && git checkout main",
"docs": "typedoc --entryPointStrategy packages ./packages/* --exclude ./packages/app --exclude ./packages/webrtc-server --name snort.social"
},
"prettier": {
"printWidth": 120,
"bracketSameLine": true,
"arrowParens": "avoid",
"trailingComma": "all"
"trailingComma": "all",
"endOfLine": "lf"
},
"packageManager": "yarn@3.6.3",
"packageManager": "yarn@4.1.1",
"dependencies": {
"@cloudflare/workers-types": "^4.20230307.0",
"@tauri-apps/cli": "^1.2.3",
"eslint": "^8.48.0",
"prettier": "^3.0.3",
"typescript": "^5.2.2"
},
"devDependencies": {
"@tauri-apps/cli": "^1.5.14",
"typedoc": "^0.25.7"
}
}

View File

@ -1,21 +0,0 @@
module.exports = {
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended"],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint", "formatjs"],
rules: {
"formatjs/enforce-id": [
"error",
{
idInterpolationPattern: "[sha512:contenthash:base64:6]",
},
],
},
root: true,
ignorePatterns: ["build/", "*.test.ts", "*.js"],
env: {
browser: true,
worker: true,
commonjs: true,
node: false,
},
};

31
packages/app/.eslintrc.js Normal file
View File

@ -0,0 +1,31 @@
/* eslint-disable import/no-anonymous-default-export */
module.exports = {
extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react/recommended"],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint", "formatjs", "react-refresh", "simple-import-sort"],
rules: {
"react/react-in-jsx-scope": "off",
"react-hooks/exhaustive-deps": "off",
"react-refresh/only-export-components": "error",
"simple-import-sort/imports": "error",
"simple-import-sort/exports": "error",
"@typescript-eslint/no-unused-vars": "error",
"max-lines": ["warn", { max: 300, skipBlankLines: true, skipComments: true }],
},
overrides: [
{
files: ["*.tsx"],
rules: {
"max-lines": ["warn", { max: 200, skipBlankLines: true, skipComments: true }],
},
},
],
root: true,
ignorePatterns: ["build/", "*.test.ts", "*.js"],
env: {
browser: true,
worker: true,
commonjs: true,
node: false,
},
};

View File

@ -25,4 +25,5 @@ yarn-error.log*
.idea
dist/
dev-dist/
dev-dist/
.wrangler/

View File

@ -1,47 +0,0 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEApyUVkYJVwV7XgluUnllgCtrsdq1ctRICm5gQy8nd+aEdDQjA
CKPOWh5miLl/fAQVZGZy/JxavzXulwXo8238E6n6bmNB1Us2nuw7a0aW4iUSQ1Pt
P4ZhPpcrqeqMf+hp7iBW0nAHFy/aa2UR84d7tBmSk5J3NNrfBsZdUex/7FqF1EVv
mEzlc8kepU9lRXWFQDtZCllEZ1kY3SBJPm10h0g9saI8YIVRxUuNII5GHDYAE3hb
EmoY6fuSEoiXA8u0Yt9soBQxgxIhQVKSRPPoIPjGFOxsGHY6h8R9nx1kxhHKFRuV
nwsn0uWl/7yjhwyHanogJu73/WgelPcgP/hMDQIDAQABAoIBAAru+xU0oGVwzcoi
MXuWPxkWrwcoWfsiPXduIBMklleg+WSD4QPvqyzr9isVb0huf/O8W+M4WxtM7NmG
MnHSDP5ATThxV7obHGyS6WQgDvimEibDU66nHK9adim8RQqM6nkANo23dE9I+xGx
X9Y9U5M5ZQQwPYoAkzw/N5WHUerk+cSEYWYV8jDtO7wJhYOMu5qliPeuNOaWZ1W6
1uwr8A4ih69WwzugPuBSgBrPAW1c84zWIFN+njAugqPF5x8xp2uM3tUO9s5UlHJC
FWEuU40KcDT2utSUY+2HXSHbycF4KLKT5jAKSa4sPziLfo+YifrlN0Y3rhofUlZT
jCaeZ8ECgYEA5/xpk8aVhCEvv5iCghv0p/IHcjdXjx5+PCWh3Adx0fF91UvU5oqn
okdyYZDShZMuLDfJ0lG+OMKZd01JapnbTtiVNceVRMnraIdoWEM2/4bTXTSZGtdA
8gh/Kc/PMbPf5ppVWwqTCbUkPOSyGHyGc7+DQquq1w6yZu04A3x9vHECgYEAuHJk
uz8YKY5ZUR7CZ3y7YFuwq5Lcpl43AfiiCasjRch0P8yLrITc/6fORsXyy64XW9fC
h3YmXvEPaM03W2dxw2aQDvXEvXiEITzmILs7SE3UmZR9m7OMy7Jeqr3+JOc0ckZe
Rz5FfuMt1IvNB6lrpfHVtoVrpCOXpzHgC/k/x10CgYA6lU18GfwL/+107uiWPsUL
3FzxBPTBmau7OK2lSOP/ZoKmaJ39Eiq/GlfSN6ZSQRa55+S5jhcBcnMa45OUrgHp
6VvU1u/lDTC7luZM07yBzuR1dyDq3Ez0Uhz6zBXAsXHrZDIF6ae0HeBm2EH5WQkD
Fevp3DwqTvXSdDle+AMwoQKBgQCBSlaH1rNmNc0wCsK07f8ejUcrDZgz2mjurc1P
v7HK8bdjHUtvE/ciEguLGqiV06O2EmjesZg2Bv4JNYivPrTFBrjGc8qEEd10uw6J
NRVaGoyDV04w/UwdYRvwzZs/XP4reF4PzHvEdRSkH5cJ3t2BhiKLfby1YumkHlbx
rbbiVQKBgB02jyZUiB6pPTCP8vXZCJbZELgqNyS04ALhBBpdfGMcU1+0hRLJFBaE
tClJPGARFXl+MPkY032vmJZOuH3LrcTCm8DmMLzM/hT1EWawQ8BJkkwiIokE4lqc
Bi8CrkvuQs2cuCStK6C3Nkyr1lTkDge46trsb7KTcfHdtLsS7EPj
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDWzCCAkOgAwIBAgIJDji8iiceMvQlMA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
BAMTCWxvY2FsaG9zdDAeFw0yMzEwMTYwOTI0MThaFw0yMzExMTUxMDI0MThaMBQx
EjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBAKclFZGCVcFe14JblJ5ZYAra7HatXLUSApuYEMvJ3fmhHQ0IwAijzloeZoi5
f3wEFWRmcvycWr817pcF6PNt/BOp+m5jQdVLNp7sO2tGluIlEkNT7T+GYT6XK6nq
jH/oae4gVtJwBxcv2mtlEfOHe7QZkpOSdzTa3wbGXVHsf+xahdRFb5hM5XPJHqVP
ZUV1hUA7WQpZRGdZGN0gST5tdIdIPbGiPGCFUcVLjSCORhw2ABN4WxJqGOn7khKI
lwPLtGLfbKAUMYMSIUFSkkTz6CD4xhTsbBh2OofEfZ8dZMYRyhUblZ8LJ9Llpf+8
o4cMh2p6ICbu9/1oHpT3ID/4TA0CAwEAAaOBrzCBrDAMBgNVHRMEBTADAQH/MAsG
A1UdDwQEAwIC9DAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUF
BwMDBggrBgEFBQcDCDBcBgNVHREEVTBTgglsb2NhbGhvc3SCFWxvY2FsaG9zdC5s
b2NhbGRvbWFpboIGbHZoLm1lgggqLmx2aC5tZYIFWzo6MV2HBH8AAAGHEP6AAAAA
AAAAAAAAAAAAAAEwDQYJKoZIhvcNAQELBQADggEBABY0rgWuzLYvVtvoVvWKS9cg
8rVhBRIFvpYO814ocN1iaxYQ9t9uLRsJXj0K+z1BHWf0zBiw4mB3dD9VpiKpuliL
4tRT+vATA96OYCd9G5k7DFQascAau40H3jxckh9rimIWa45FUSd7FIcddo1jeciv
gdAdiNUuHBen82O8KHJb+1PCBdA8RYeO5EGKfJM2yrOovu7dAFilf1ZPkXWgXnfG
nN6YfDDo9rAVDbvNXImrkwmGqEcN3Pq909IHiM/VETlU5lP4AbTNgrDa/aaZ+I+b
1MC1p87MvnibyXs+rTlK5+j8E6noNcD7tsHNd4ufkVCqr+pvSpuA3OvnXjbbm54=
-----END CERTIFICATE-----

View File

@ -1,3 +1,95 @@
# v0.2.0
`+16,990,-9,649`
## Added
- Check notification settings page
- New settings page layout - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Community Leaders / Invite system - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Settings->Tools pages (Check follows relay health etc) - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- New wallet pages design - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Alby OAuth wallet connection - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Cashu wallet support (WIP) - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Followed by friends feed page - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Fuzzysearch profiles everywhere - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Worker Relay package `@snort/worker-relay` - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Replaces all previous caching objects, all caches are handled inside `@snort/system` via worker relay
- "View as user" button - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Play live streams directly in feed with embed iframe - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Negentropy v1 support - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
## Changed
- Hidden note styles & preferences - nostr:npub1cz2ve34nk0ukn0ph4yq2qx3ud8rfy5e0ak4epx42dn8gha0sdgpsgra9kv
- Keybinds for grid modal navigation - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Cache trending sections in browser - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Cache images / nostr.json in service worker - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Add dimensions to `imeta` tag for void.cat uploads - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Check event sigs in `@snort/system-wasm` - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Primary color scheme - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Note creator styles (removed hashtags input) - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Cache link preview results in memory - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Show only 1 task at a time in task list - nostr:
- Render media in reply to note creator - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Show top zappers inline with footer icons on notes - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Add more search relays - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Moved link previews and opengraph tagging to https://nostr.api.v0l.io - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
## Fixed
- Iris account error mesage - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Light theme color fixes - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Notifications page overflow - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
# v0.1.24
`+11,573,-3,010`
## Added
- 3 Column layout - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Fuzzy cache search - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Followed by on profile pages - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Show more on long notes - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Better error message page - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Media grid feed - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Mobile fixed footer - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Follow button on profile search results - nostr:npub17q5n2z8naw0xl6vu9lvt560lg33pdpe29k0k09umlfxm3vc4tqrq466f2y
- Invite codes (WIP Community Program) - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- `imeta` tag insertion for images - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Wallet settings page improvements - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Nostr Wallet Connect upgrade (balance + history) - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Schnorr sig check in WASM binary - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Autoplay videos in feed (muted) - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Followed by friends feed (a feed of your 2nd degree follows posts) - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- imgproxy image integrity check (sha256 from `imeta` passed to imgproxy) - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
## Changed
- Removed Twitter embed - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Removed attachment button on DM's - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Note broadcaster dialog changed to toast notification - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Removed npub link from profile (use QR button) - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Render image size from `imeta` tags - nostr:npub1v0lxxxxutpvrelsksy8cdhgfux9l6a42hsj2qzquu2zk7vc9qnkszrqj49
- Style fixes - nostr:npub1cz2ve34nk0ukn0ph4yq2qx3ud8rfy5e0ak4epx42dn8gha0sdgpsgra9kv
- Zap pool slider tweak - nostr:npub1ltx67888tz7lqnxlrg06x234vjnq349tcfyp52r0lstclp548mcqnuz40t
- New Malay translations - nostr:npub1cjtt3nywuflj65ftld4v7zzpg0qh3ergycjcym0956vf9eftv7esekxpmn
- Updated Persian translations - nostr:npub1cpazafytvafazxkjn43zjfwtfzatfz508r54f6z6a3rf2ws8223qc3xxpk
- Updated Finnish translations - nostr:npub1ust7u0v3qffejwhqee45r49zgcyewrcn99vdwkednd356c9resyqtnn3mj
- Updated French translations - nostr:npub1x8dzy9xegwmdk2vy30l8u08caspcqq2yzncxehdsa6kvnte9pr3qnt8pg4 & nostr:npub13w02l37gkjwv90lnklfet5653jj0p5ueu976v3dpda5afvxgw3uslcqdnv
- Updated German translations - nostr:npub19a6x8frkkn2660fw0flz74a7qg8c2jxk5v9p2rsh7tv5e6ftsq3sav63vp
- Updated Hungarian translations - nostr:npub1ww8kjxz2akn82qptdpl7glywnchhkx3x04hez3d3rye397turrhssenvtp
- Updated Swedish translations - nostr:npub19jk45jz45gczwfm22y9z69xhaex3nwg47dz84zw096xl6z62amkqj99rv7
- Updated Japanese translations - nostr:npub1wh69w45awqnlsxw7jt5tkymets87h6t4phplkx6ug2ht2qkssswswntjk0
## Fixed
- Longform note overlfow-x - nostr:npub1g53mukxnjkcmr94fhryzkqutdz2ukq4ks0gvy5af25rgmwsl4ngq43drvk
- Trim zap content - nostr:npub1u8lnhlw5usp3t9vmpz60ejpyt649z33hu82wc2hpv6m5xdqmuxhs46turz
---
# v0.1.23
## Added
@ -535,7 +627,7 @@ https://git.v0l.io/Kieran/snort/compare/v0.1.9...v0.1.10
- Fix event mention bug by @SamSamskies in https://github.com/v0l/snort/pull/421
- fix NaN when parsing empty string by @SamSamskies in https://github.com/v0l/snort/pull/422
- NIP06 support by @w3irdrobot in https://github.com/v0l/snort/pull/425
- Added key attr to Tabs to remove React warning by @w3irdrobot in https://github.com/v0l/snort/pull/424
- Added key attr to TabSelectors to remove React warning by @w3irdrobot in https://github.com/v0l/snort/pull/424
- New Crowdin updates by @v0l in https://github.com/v0l/snort/pull/426
- New Crowdin updates by @v0l in https://github.com/v0l/snort/pull/436
- Update Wavlake embed URL, add support for album & artist links by @blastshielddown in https://github.com/v0l/snort/pull/439

View File

@ -1,2 +0,0 @@
/*
Content-Security-Policy: default-src 'self'; manifest-src *; child-src 'none'; worker-src 'self'; frame-src youtube.com www.youtube.com https://platform.twitter.com https://embed.tidal.com https://w.soundcloud.com https://www.mixcloud.com https://open.spotify.com https://player.twitch.tv https://embed.music.apple.com https://nostrnests.com https://embed.wavlake.com https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; connect-src *; img-src * data: blob:; font-src 'self'; media-src * blob:; script-src 'self' 'wasm-unsafe-eval' https://analytics.v0l.io https://platform.twitter.com https://embed.tidal.com https://challenges.cloudflare.com;

View File

@ -0,0 +1,11 @@
{
"plugins": [
[
"formatjs",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]",
"ast": true
}
]
]
}

View File

@ -4,23 +4,55 @@
"appTitle": "Snort - Nostr",
"hostname": "snort.social",
"nip05Domain": "snort.social",
"favicon": "public/favicon.ico",
"appleTouchIconUrl": "/nostrich_512.png",
"icon": "/nostrich_512.png",
"navLogo": null,
"publicDir": "public/snort",
"httpCache": "",
"animalNamePlaceholders": false,
"defaultZapPoolFee": 0.5,
"defaultZapPoolFee": 1,
"features": {
"analytics": true,
"subscriptions": true,
"deck": true,
"zapPool": true
"zapPool": true,
"notificationGraph": true,
"communityLeaders": true,
"nostrAddress": true,
"pushNotifications": true
},
"signUp": {
"quickStart": false,
"defaultFollows": ["npub1sn0rtcjcf543gj4wsg7fa59s700d5ztys5ctj0g69g2x6802npjqhjjtws"]
},
"defaultPreferences": {
"hideMutedNotes": false,
"defaultRootTab": "following"
},
"media": {
"bypassImgProxyError": false,
"preferLargeMedia": true
},
"communityLeaders": {
"list": "naddr1qq4xc6tnw3ez6vp58y6rywpjxckngdtyxukngwr9vckkze33vcknzcnrxcenje35xqmn2cczyp3lucccm3v9s087z6qslpkap8schltk427zfgqgrn3g2menq5zw6qcyqqq82vqprpmhxue69uhhyetvv9ujuumwdae8gtnnda3kjctv7rajfl"
},
"noteCreatorToast": false,
"hideFromNavbar": ["/graph"],
"deckSubKind": 1,
"showPowIcon": true,
"eventLinkPrefix": "nevent",
"profileLinkPrefix": "nprofile",
"defaultRelays": {
"wss://relay.snort.social/": { "read": true, "write": true },
"wss://nostr.wine/": { "read": true, "write": false },
"wss://eden.nostr.land/": { "read": true, "write": false }
}
"wss://relay.damus.io/": { "read": true, "write": true },
"wss://nos.lol/": { "read": true, "write": true }
},
"alby": {
"clientId": "pohiJjPhQR",
"clientSecret": "GAl1YKLA3FveK1gLBYok"
},
"chatChannels": [
{ "type": "telegram", "value": "https://t.me/irismessenger" },
{ "type": "nip28", "value": "23286a4602ada10cc10200553bff62a110e8dc0eacddf73277395a89ddf26a09" }
]
}

View File

@ -4,22 +4,53 @@
"appTitle": "iris",
"hostname": "iris.to",
"nip05Domain": "iris.to",
"favicon": "public/iris/favicon.ico",
"appleTouchIconUrl": "/img/apple-touch-icon.png",
"icon": "/img/icon128.png",
"navLogo": "/img/icon128.png",
"publicDir": "public/iris",
"httpCache": "https://api.iris.to",
"httpCache": "",
"animalNamePlaceholders": true,
"defaultZapPoolFee": 0.5,
"features": {
"analytics": true,
"subscriptions": false,
"subscriptions": true,
"deck": true,
"zapPool": true
"zapPool": true,
"notificationGraph": false,
"communityLeaders": true
},
"defaultPreferences": {
"hideMutedNotes": true,
"defaultRootTab": "for-you"
},
"signUp": {
"quickStart": true,
"defaultFollows": ["npub1wnwwcv0a8wx0m9stck34ajlwhzuua68ts8mw3kjvspn42dcfyjxs4n95l8"]
},
"media": {
"bypassImgProxyError": true,
"preferLargeMedia": true
},
"communityLeaders": {
"list": "naddr1qq4xc6tnw3ez6vp58y6rywpjxckngdtyxukngwr9vckkze33vcknzcnrxcenje35xqmn2cczyp3lucccm3v9s087z6qslpkap8schltk427zfgqgrn3g2menq5zw6qcyqqq82vqprpmhxue69uhhyetvv9ujuumwdae8gtnnda3kjctv7rajfl"
},
"noteCreatorToast": false,
"hideFromNavbar": [],
"eventLinkPrefix": "note",
"profileLinkPrefix": "npub",
"showPowIcon": false,
"defaultRelays": {
"wss://relay.snort.social/": { "read": true, "write": true },
"wss://nostr.wine/": { "read": true, "write": false },
"wss://eden.nostr.land/": { "read": true, "write": false }
"wss://eden.nostr.land/": { "read": true, "write": false },
"wss://relay.nostr.band/": { "read": true, "write": true },
"wss://relay.damus.io/": { "read": true, "write": true }
},
"chatChannels": [
{ "type": "telegram", "value": "https://t.me/irismessenger" },
{ "type": "nip28", "value": "23286a4602ada10cc10200553bff62a110e8dc0eacddf73277395a89ddf26a09" }
],
"alby": {
"clientId": "5rYcHDrlDb",
"clientSecret": "QAI3QmgiaPH3BfTMzzFd"
}
}

View File

@ -0,0 +1,50 @@
{
"appName": "めく",
"appNameCapitalized": "めく",
"appTitle": "めく",
"hostname": "meku.app",
"nip05Domain": "meku.app",
"icon": "/nostr.jpg",
"navLogo": null,
"publicDir": "public/nostr",
"httpCache": "",
"animalNamePlaceholders": false,
"defaultZapPoolFee": 0,
"features": {
"analytics": true,
"subscriptions": false,
"deck": false,
"zapPool": false,
"notificationGraph": true,
"communityLeaders": false,
"nostrAddress": false,
"pushNotifications": true
},
"signUp": {
"quickStart": false,
"defaultFollows": []
},
"defaultPreferences": {
"hideMutedNotes": false,
"defaultRootTab": "following",
"language": "ja"
},
"media": {
"bypassImgProxyError": false,
"preferLargeMedia": true
},
"communityLeaders": null,
"noteCreatorToast": false,
"hideFromNavbar": ["/graph"],
"deckSubKind": 1,
"showPowIcon": true,
"eventLinkPrefix": "nevent",
"profileLinkPrefix": "nprofile",
"defaultRelays": {
"wss://relay.nostr.wirednet.jp/": { "read": true, "write": true },
"wss://yabu.me/": { "read": true, "write": true },
"wss://nos.lol/": { "read": true, "write": true }
},
"alby": null,
"chatChannels": null
}

View File

@ -0,0 +1,50 @@
{
"appName": "Nostr",
"appNameCapitalized": "Nostr",
"appTitle": "Nostr",
"hostname": "nostr.com",
"nip05Domain": "nostr.com",
"icon": "/nostr.jpg",
"navLogo": null,
"publicDir": "public/nostr",
"httpCache": "",
"animalNamePlaceholders": false,
"defaultZapPoolFee": 0,
"features": {
"analytics": false,
"subscriptions": false,
"deck": false,
"zapPool": false,
"notificationGraph": true,
"communityLeaders": false,
"nostrAddress": false,
"pushNotifications": false
},
"signUp": {
"quickStart": false,
"defaultFollows": []
},
"defaultPreferences": {
"hideMutedNotes": false,
"defaultRootTab": "following"
},
"media": {
"bypassImgProxyError": false,
"preferLargeMedia": true
},
"communityLeaders": null,
"noteCreatorToast": true,
"hideFromNavbar": ["/graph"],
"deckSubKind": 1,
"showPowIcon": true,
"eventLinkPrefix": "nevent",
"profileLinkPrefix": "nprofile",
"defaultRelays": {
"wss://relay.snort.social/": { "read": true, "write": true },
"wss://nostr.wine/": { "read": true, "write": false },
"wss://eden.nostr.land/": { "read": true, "write": false },
"wss://nos.lol/": { "read": true, "write": true }
},
"alby": null,
"chatChannels": null
}

View File

@ -1,4 +1,5 @@
/// <reference types="@webbtc/webln-types" />
/// <reference types="vite/client" />
declare module "*.jpg" {
const value: unknown;
@ -46,26 +47,65 @@ declare const CONFIG: {
appTitle: string;
hostname: string;
nip05Domain: string;
favicon: string;
appleTouchIconUrl: string;
icon: string;
navLogo: string | null;
httpCache: string;
animalNamePlaceholders: boolean;
defaultZapPoolFee?: number;
defaultZapPoolFee: number;
features: {
analytics: boolean;
subscriptions: boolean;
deck: boolean;
zapPool: boolean;
notificationGraph: boolean;
communityLeaders: boolean;
nostrAddress: boolean;
pushNotifications: boolean;
};
defaultPreferences: {
hideMutedNotes: boolean;
defaultRootTab: "following" | "for-you";
};
signUp: {
quickStart: boolean;
defaultFollows: Array<string>;
};
media: {
bypassImgProxyError: boolean;
preferLargeMedia: boolean;
};
communityLeaders?: {
list: string;
};
// Filter urls from nav sidebar
hideFromNavbar: Array<string>;
// Limit deck to certain subscriber tier
deckSubKind?: number;
showDeck?: boolean;
// Create toast notifications when publishing notes
noteCreatorToast: boolean;
eventLinkPrefix: NostrPrefix;
profileLinkPrefix: NostrPrefix;
defaultRelays: Record<string, RelaySettings>;
};
showPowIcon: boolean;
/**
* Single relay (Debug)
*/
declare const SINGLE_RELAY: string | undefined;
// Alby wallet oAuth config
alby?: {
clientId: string;
clientSecret: string;
};
// public chat channels for site
chatChannels?: Array<{
type: "nip28" | "telegram";
value: string;
}>;
};
/**
* Build git hash

View File

@ -2,17 +2,21 @@
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes, viewport-fit=cover" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Feature packed nostr client" />
<meta
name="keywords"
content="nostr snort fast decentralized social media censorship resistant open source software" />
<link rel="preconnect" href="https://imgproxy.snort.social" />
<link rel="apple-touch-icon" href="" />
<link rel="apple-touch-icon" href="/img/apple-touch-icon.png" />
<link rel="manifest" href="/manifest.json" />
<link rel="icon" href="/favicon.png" />
<title></title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>

View File

@ -1,9 +0,0 @@
/** @type {import('ts-jest').JestConfigWithTsJest} */
module.exports = {
bail: true,
preset: "ts-jest",
testEnvironment: "jsdom",
roots: ["src"],
moduleDirectories: ["src", "node_modules"],
setupFiles: ["./src/setupTests.ts"],
};

View File

@ -1,28 +1,35 @@
{
"name": "@snort/app",
"version": "0.1.23",
"version": "0.2.0",
"dependencies": {
"@cashu/cashu-ts": "^0.6.1",
"@lightninglabs/lnc-web": "^0.2.3-alpha",
"@noble/curves": "^1.0.0",
"@noble/hashes": "^1.2.0",
"@scure/base": "^1.1.1",
"@scure/bip32": "^1.3.0",
"@scure/bip39": "^1.1.1",
"@cashu/cashu-ts": "^1.0.0-rc.3",
"@here/maps-api-for-javascript": "^1.50.0",
"@noble/curves": "^1.4.0",
"@noble/hashes": "^1.4.0",
"@scure/base": "^1.1.6",
"@scure/bip32": "^1.4.0",
"@scure/bip39": "^1.3.0",
"@snort/shared": "workspace:*",
"@snort/system": "workspace:*",
"@snort/system-react": "workspace:*",
"@snort/system-wasm": "workspace:*",
"@snort/system-web": "workspace:*",
"@szhsin/react-menu": "^3.3.1",
"@uidotdev/usehooks": "^2.3.1",
"@void-cat/api": "^1.0.10",
"@snort/wallet": "workspace:*",
"@snort/worker-relay": "workspace:*",
"@szhsin/react-menu": "^3.5.3",
"@uidotdev/usehooks": "^2.4.1",
"@void-cat/api": "^1.0.12",
"classnames": "^2.3.2",
"comlink": "^4.4.1",
"debug": "^4.3.4",
"dexie": "^3.2.4",
"emojilib": "^3.0.10",
"eventemitter3": "^5.0.1",
"fuse.js": "^7.0.0",
"highlight.js": "^11.8.0",
"latlon-geohash": "^2.0.0",
"light-bolt11-decoder": "^2.1.0",
"lottie-react": "^2.4.0",
"marked": "^9.1.0",
"marked-footnote": "^1.0.0",
"match-sorter": "^6.3.1",
@ -35,13 +42,15 @@
"react-router-dom": "^6.5.0",
"react-tag-input-component": "^2.0.2",
"react-textarea-autosize": "^8.4.0",
"react-twitter-embed": "^4.0.4",
"recharts": "^2.8.0",
"three": "^0.157.0",
"typescript-lru-cache": "^2.0.0",
"use-long-press": "^3.2.0",
"use-sync-external-store": "^1.2.0",
"uuid": "^9.0.0",
"workbox-cacheable-response": "^7.0.0",
"workbox-core": "^6.4.2",
"workbox-expiration": "^7.0.0",
"workbox-precaching": "^7.0.0",
"workbox-routing": "^6.4.2",
"workbox-strategies": "^6.4.2"
@ -50,10 +59,13 @@
"start": "vite",
"build": "yarn eslint --fix && vite build",
"serve": "vite preview",
"test": "jest --runInBand",
"test": "vitest run",
"test:watch": "vitest watch",
"intl-extract": "formatjs extract 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file src/lang.json --flatten true",
"intl-compile": "formatjs compile src/lang.json --out-file src/translations/en.json",
"eslint": "eslint ."
"eslint": "eslint .",
"deploy:meku": "NODE_CONFIG_ENV=meku yarn build && npx wrangler pages deploy --project-name meku build/",
"deploy:notestr": "NODE_CONFIG_ENV=nostr yarn build && npx wrangler pages deploy --project-name nostr-generic build/"
},
"eslintConfig": {
"extends": [
@ -76,10 +88,9 @@
},
"devDependencies": {
"@formatjs/cli": "^6.1.3",
"@jest/globals": "^29.6.1",
"@types/config": "^3.3.3",
"@types/debug": "^4.1.8",
"@types/jest": "^29.5.1",
"@types/latlon-geohash": "^2.0.3",
"@types/node": "^20.4.1",
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.10",
@ -91,14 +102,19 @@
"@typescript-eslint/eslint-plugin": "^6.1.0",
"@typescript-eslint/parser": "^6.1.0",
"@vitejs/plugin-react": "^4.2.0",
"@webbtc/webln-types": "^1.0.10",
"@webbtc/webln-types": "^3.0.0",
"@webscopeio/react-textarea-autocomplete": "^4.9.2",
"@welldone-software/why-did-you-render": "^8.0.1",
"autoprefixer": "^10.4.16",
"babel-plugin-formatjs": "^10.5.14",
"config": "^3.3.9",
"eslint": "^8.48.0",
"eslint-config-react-app": "^7.0.1",
"eslint-plugin-formatjs": "^4.11.3",
"jest": "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.5",
"eslint-plugin-simple-import-sort": "^10.0.0",
"postcss": "^8.4.31",
"postcss-preset-env": "^9.2.0",
"prettier": "2.8.3",
@ -106,10 +122,11 @@
"rollup-plugin-visualizer": "^5.9.2",
"tailwindcss": "^3.3.3",
"tinybench": "^2.5.1",
"ts-jest": "^29.1.1",
"typescript": "^5.2.2",
"vite": "^5.0.0",
"vite-plugin-pwa": "^0.17.0",
"vite-plugin-version-mark": "^0.0.10"
"vite": "^5.2.8",
"vite-plugin-eslint": "^1.8.1",
"vite-plugin-pwa": "^0.19.2",
"vite-plugin-version-mark": "^0.0.10",
"vitest": "^0.34.6"
}
}

View File

@ -0,0 +1,4 @@
/*
Content-Security-Policy: default-src 'self'; manifest-src *; child-src 'none'; worker-src 'self'; frame-src https://youtube.com https://www.youtube.com https://platform.twitter.com https://embed.tidal.com https://w.soundcloud.com https://www.mixcloud.com https://open.spotify.com https://player.twitch.tv https://embed.music.apple.com https://embed.wavlake.com https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; connect-src *; img-src * data: blob:; font-src 'self'; media-src * blob:; script-src 'self' 'wasm-unsafe-eval' https://platform.twitter.com https://embed.tidal.com https://challenges.cloudflare.com;
/service-worker.js
Cache-Control: max-age=604800, must-revalidate;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -0,0 +1,2 @@
/*
Content-Security-Policy: default-src 'self'; manifest-src *; child-src 'none'; worker-src 'self'; frame-src https://youtube.com https://www.youtube.com https://platform.twitter.com https://embed.tidal.com https://w.soundcloud.com https://www.mixcloud.com https://open.spotify.com https://player.twitch.tv https://embed.music.apple.com https://embed.wavlake.com https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; connect-src *; img-src * data: blob:; font-src 'self'; media-src * blob:; script-src 'self' 'wasm-unsafe-eval' https://platform.twitter.com https://embed.tidal.com https://challenges.cloudflare.com;

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,4 @@
/*
Content-Security-Policy: default-src 'self'; manifest-src *; child-src 'none'; worker-src 'self'; frame-src https://youtube.com https://www.youtube.com https://platform.twitter.com https://embed.tidal.com https://w.soundcloud.com https://www.mixcloud.com https://open.spotify.com https://player.twitch.tv https://embed.music.apple.com https://embed.wavlake.com https://challenges.cloudflare.com; style-src 'self' 'unsafe-inline'; connect-src *; img-src * data: blob:; font-src 'self'; media-src * blob:; script-src 'self' 'wasm-unsafe-eval' https://platform.twitter.com https://embed.tidal.com https://challenges.cloudflare.com;
/service-worker.js
Cache-Control: max-age=604800, must-revalidate;

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@ -1,3 +1,4 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
Sitemap: https://api.snort.social/api/v1/sitemap/index.xml

View File

@ -1,5 +1,6 @@
import { NostrEvent } from "@snort/system";
import { FeedCache } from "@snort/shared";
import { NostrEvent } from "@snort/system";
import { db } from "@/Db";
export class ChatCache extends FeedCache<NostrEvent> {
@ -26,4 +27,8 @@ export class ChatCache extends FeedCache<NostrEvent> {
takeSnapshot(): Array<NostrEvent> {
return [...this.cache.values()];
}
async search() {
return <Array<NostrEvent>>[];
}
}

View File

@ -0,0 +1,16 @@
import { ExternalStore } from "@snort/shared";
class CommunityLeadersStore extends ExternalStore<Array<string>> {
#leaders: Array<string> = [];
setLeaders(arr: Array<string>) {
this.#leaders = arr;
this.notifyChange();
}
takeSnapshot(): string[] {
return [...this.#leaders];
}
}
export const LeadersStore = new CommunityLeadersStore();

View File

@ -0,0 +1,110 @@
import { CachedTable, CacheEvents } from "@snort/shared";
import { CacheRelay, NostrEvent } from "@snort/system";
import { EventEmitter } from "eventemitter3";
export class EventCacheWorker extends EventEmitter<CacheEvents> implements CachedTable<NostrEvent> {
#relay: CacheRelay;
#keys = new Set<string>();
#cache = new Map<string, NostrEvent>();
constructor(relay: CacheRelay) {
super();
this.#relay = relay;
}
async preload() {
const ids = await this.#relay.query([
"REQ",
"preload-event-cache",
{
ids_only: true,
},
]);
this.#keys = new Set<string>(ids as unknown as Array<string>);
}
async search(q: string) {
const results = await this.#relay.query([
"REQ",
"events-search",
{
search: q,
},
]);
return results;
}
keysOnTable(): string[] {
return [...this.#keys];
}
getFromCache(key?: string | undefined): NostrEvent | undefined {
if (key) {
return this.#cache.get(key);
}
}
discover(ev: NostrEvent) {
this.#keys.add(this.key(ev));
}
async get(key?: string | undefined): Promise<NostrEvent | undefined> {
if (key) {
const res = await this.bulkGet([key]);
if (res.length > 0) {
return res[0];
}
}
}
async bulkGet(keys: string[]): Promise<NostrEvent[]> {
const results = await this.#relay.query([
"REQ",
"EventCacheWorker.bulkGet",
{
ids: keys,
},
]);
for (const ev of results) {
this.#cache.set(ev.id, ev);
}
return results;
}
async set(obj: NostrEvent): Promise<void> {
await this.#relay.event(obj);
this.#keys.add(obj.id);
}
async bulkSet(obj: NostrEvent[] | readonly NostrEvent[]): Promise<void> {
await Promise.all(
obj.map(async a => {
await this.#relay.event(a);
this.#keys.add(a.id);
}),
);
}
async update<TWithCreated extends NostrEvent & { created: number; loaded: number }>(
m: TWithCreated,
): Promise<"new" | "refresh" | "updated" | "no_change"> {
if (await this.#relay.event(m)) {
return "updated";
}
return "no_change";
}
async buffer(keys: string[]): Promise<string[]> {
const missing = keys.filter(a => !this.#keys.has(a));
const res = await this.bulkGet(missing);
return missing.filter(a => !res.some(b => this.key(b) === a));
}
key(of: NostrEvent): string {
return of.id;
}
snapshot(): NostrEvent[] {
return [...this.#cache.values()];
}
}

View File

@ -1,42 +0,0 @@
import { FeedCache } from "@snort/shared";
import { db, EventInteraction } from "@/Db";
import { LoginStore } from "@/Login";
import { sha256 } from "@/SnortUtils";
export class EventInteractionCache extends FeedCache<EventInteraction> {
constructor() {
super("EventInteraction", db.eventInteraction);
}
key(of: EventInteraction): string {
return sha256(of.event + of.by);
}
override async preload(): Promise<void> {
await super.preload();
const data = window.localStorage.getItem("zap-cache");
if (data) {
const toImport = [...new Set<string>(JSON.parse(data) as Array<string>)].map(a => {
const ret = {
event: a,
by: LoginStore.takeSnapshot().publicKey,
zapped: true,
reacted: false,
reposted: false,
} as EventInteraction;
ret.id = this.key(ret);
return ret;
});
await this.bulkSet(toImport);
console.debug(`Imported dumb-zap-cache events: `, toImport.length);
window.localStorage.removeItem("zap-cache");
}
await this.buffer([...this.onTable]);
}
takeSnapshot(): EventInteraction[] {
return [...this.cache.values()];
}
}

View File

@ -1,47 +0,0 @@
import { db } from "@/Db";
import { unixNowMs } from "@snort/shared";
import { EventKind, RequestBuilder, socialGraphInstance, TaggedNostrEvent } from "@snort/system";
import { RefreshFeedCache } from "./RefreshFeedCache";
import { LoginSession } from "@/Login";
export class FollowListCache extends RefreshFeedCache<TaggedNostrEvent> {
constructor() {
super("FollowListCache", db.followLists);
}
buildSub(session: LoginSession, rb: RequestBuilder): void {
const since = this.newest();
rb.withFilter()
.kinds([EventKind.ContactList])
.authors(session.follows.item)
.since(since === 0 ? undefined : since);
}
async onEvent(evs: readonly TaggedNostrEvent[]) {
await Promise.all(
evs.map(async e => {
const update = await super.update({
...e,
created: e.created_at,
loaded: unixNowMs(),
});
if (update !== "no_change") {
socialGraphInstance.handleFollowEvent(e);
}
}),
);
}
key(of: TaggedNostrEvent): string {
return of.pubkey;
}
takeSnapshot() {
return [...this.cache.values()];
}
override async preload() {
await super.preload();
this.snapshot().forEach(e => socialGraphInstance.handleFollowEvent(e));
}
}

View File

@ -1,126 +0,0 @@
import debug from "debug";
import { EventKind, RequestBuilder, SystemInterface, TaggedNostrEvent } from "@snort/system";
import { unixNow, unixNowMs } from "@snort/shared";
import { db } from "@/Db";
import { RefreshFeedCache, TWithCreated } from "./RefreshFeedCache";
import { LoginSession } from "@/Login";
import { Day, Hour } from "@/Const";
const WindowSize = Hour * 6;
const MaxCacheWindow = Day * 7;
export class FollowsFeedCache extends RefreshFeedCache<TaggedNostrEvent> {
#kinds = [EventKind.TextNote, EventKind.Repost, EventKind.Polls];
#oldest?: number;
constructor() {
super("FollowsFeedCache", db.followsFeed);
}
key(of: TWithCreated<TaggedNostrEvent>): string {
return of.id;
}
takeSnapshot(): TWithCreated<TaggedNostrEvent>[] {
return [...this.cache.values()];
}
buildSub(session: LoginSession, rb: RequestBuilder): void {
const since = this.newest();
rb.withFilter()
.kinds(this.#kinds)
.authors(session.follows.item)
.since(since === 0 ? unixNow() - WindowSize : since);
}
async onEvent(evs: readonly TaggedNostrEvent[]): Promise<void> {
const filtered = evs.filter(a => this.#kinds.includes(a.kind));
if (filtered.length > 0) {
await this.bulkSet(filtered);
this.notifyChange(filtered.map(a => this.key(a)));
}
}
override async preload() {
const start = unixNowMs();
const keys = (await this.table?.toCollection().primaryKeys()) ?? [];
this.onTable = new Set<string>(keys.map(a => a as string));
// load only latest 50 posts, rest can be loaded on-demand
const latest = await this.table?.orderBy("created_at").reverse().limit(50).toArray();
latest?.forEach(v => this.cache.set(this.key(v), v));
// cleanup older than 7 days
await this.table
?.where("created_at")
.below(unixNow() - MaxCacheWindow)
.delete();
const oldest = await this.table?.orderBy("created_at").first();
this.#oldest = oldest?.created_at;
this.notifyChange(latest?.map(a => this.key(a)) ?? []);
debug(this.name)(`Loaded %d/%d in %d ms`, latest?.length ?? 0, keys.length, (unixNowMs() - start).toLocaleString());
}
async loadMore(system: SystemInterface, session: LoginSession, before: number) {
if (this.#oldest && before <= this.#oldest) {
const rb = new RequestBuilder(`${this.name}-loadmore`);
rb.withFilter()
.kinds(this.#kinds)
.authors(session.follows.item)
.until(before)
.since(before - WindowSize);
await system.Fetch(rb, async evs => {
await this.bulkSet(evs);
});
} else {
const latest = await this.table
?.where("created_at")
.between(before - WindowSize, before)
.reverse()
.sortBy("created_at");
latest?.forEach(v => {
const k = this.key(v);
this.cache.set(k, v);
this.onTable.add(k);
});
this.notifyChange(latest?.map(a => this.key(a)) ?? []);
}
}
/**
* Backfill cache with new follows
*/
async backFill(system: SystemInterface, keys: Array<string>) {
if (keys.length === 0) return;
const rb = new RequestBuilder(`${this.name}-backfill`);
rb.withFilter()
.kinds(this.#kinds)
.authors(keys)
.until(unixNow())
.since(this.#oldest ?? unixNow() - MaxCacheWindow);
await system.Fetch(rb, async evs => {
await this.bulkSet(evs);
});
}
/**
* Backfill cache based on follows list
*/
async backFillIfMissing(system: SystemInterface, keys: Array<string>) {
if (!this.#oldest) return;
const start = unixNowMs();
const everything = await this.table?.toArray();
if ((everything?.length ?? 0) > 0) {
const allKeys = new Set(everything?.map(a => a.pubkey));
const missingKeys = keys.filter(a => !allKeys.has(a));
await this.backFill(system, missingKeys);
debug(this.name)(`Backfilled %d keys in %d ms`, missingKeys.length, (unixNowMs() - start).toLocaleString());
}
}
}

View File

@ -1,8 +1,9 @@
import { EventKind, EventPublisher, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { UnwrappedGift, db } from "@/Db";
import { findTag, unwrap } from "@/SnortUtils";
import { RefreshFeedCache } from "./RefreshFeedCache";
import { LoginSession, LoginSessionType } from "@/Login";
import { EventKind, EventPublisher, TaggedNostrEvent } from "@snort/system";
import { db, UnwrappedGift } from "@/Db";
import { findTag, unwrap } from "@/Utils";
import { RefreshFeedCache, TWithCreated } from "./RefreshFeedCache";
export class GiftWrapCache extends RefreshFeedCache<UnwrappedGift> {
constructor() {
@ -13,11 +14,8 @@ export class GiftWrapCache extends RefreshFeedCache<UnwrappedGift> {
return of.id;
}
buildSub(session: LoginSession, rb: RequestBuilder): void {
const pubkey = session.publicKey;
if (pubkey && session.type === LoginSessionType.PrivateKey) {
rb.withFilter().kinds([EventKind.GiftWrap]).tag("p", [pubkey]).since(this.newest());
}
buildSub(): void {
// not used
}
takeSnapshot(): Array<UnwrappedGift> {
@ -55,4 +53,8 @@ export class GiftWrapCache extends RefreshFeedCache<UnwrappedGift> {
}
await this.bulkSet(unwrapped);
}
search(): Promise<TWithCreated<UnwrappedGift>[]> {
throw new Error("Method not implemented.");
}
}

View File

@ -1,45 +0,0 @@
import { EventKind, NostrEvent, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { RefreshFeedCache, TWithCreated } from "./RefreshFeedCache";
import { LoginSession } from "@/Login";
import { NostrEventForSession, db } from "@/Db";
import { Day } from "@/Const";
import { unixNow } from "@snort/shared";
export class NotificationsCache extends RefreshFeedCache<NostrEventForSession> {
#kinds = [EventKind.TextNote, EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt];
constructor() {
super("notifications", db.notifications);
}
buildSub(session: LoginSession, rb: RequestBuilder) {
if (session.publicKey) {
const newest = this.newest(v => v.tags.some(a => a[0] === "p" && a[1] === session.publicKey));
rb.withFilter()
.kinds(this.#kinds)
.tag("p", [session.publicKey])
.since(newest === 0 ? unixNow() - Day * 30 : newest);
}
}
async onEvent(evs: readonly TaggedNostrEvent[], pubKey: string) {
const filtered = evs.filter(a => this.#kinds.includes(a.kind) && a.tags.some(b => b[0] === "p"));
if (filtered.length > 0) {
await this.bulkSet(
filtered.map(v => ({
...v,
forSession: pubKey,
})),
);
this.notifyChange(filtered.map(v => this.key(v)));
}
}
key(of: TWithCreated<NostrEvent>): string {
return of.id;
}
takeSnapshot() {
return [...this.cache.values()];
}
}

View File

@ -1,16 +0,0 @@
import { Payment, db } from "@/Db";
import { FeedCache } from "@snort/shared";
export class Payments extends FeedCache<Payment> {
constructor() {
super("PaymentsCache", db.payments);
}
key(of: Payment): string {
return of.url;
}
takeSnapshot(): Array<Payment> {
return [...this.cache.values()];
}
}

View File

@ -0,0 +1,123 @@
import { CachedTable, CacheEvents, removeUndefined, unixNowMs, unwrap } from "@snort/shared";
import { CachedMetadata, CacheRelay, mapEventToProfile, NostrEvent } from "@snort/system";
import debug from "debug";
import { EventEmitter } from "eventemitter3";
export class ProfileCacheRelayWorker extends EventEmitter<CacheEvents> implements CachedTable<CachedMetadata> {
#relay: CacheRelay;
#keys = new Set<string>();
#cache = new Map<string, CachedMetadata>();
#log = debug("ProfileCacheRelayWorker");
constructor(relay: CacheRelay) {
super();
this.#relay = relay;
}
async preload() {
const start = unixNowMs();
const profiles = await this.#relay.query([
"REQ",
"profiles-preload",
{
kinds: [0],
},
]);
this.#cache = new Map<string, CachedMetadata>(profiles.map(a => [a.pubkey, unwrap(mapEventToProfile(a))]));
this.#keys = new Set<string>(this.#cache.keys());
this.#log(`Loaded %d/%d in %d ms`, this.#cache.size, this.#keys.size, (unixNowMs() - start).toLocaleString());
}
async search(q: string) {
const profiles = await this.#relay.query([
"REQ",
"profiles-search",
{
kinds: [0],
search: q,
},
]);
return removeUndefined(profiles.map(mapEventToProfile));
}
keysOnTable(): string[] {
return [...this.#keys];
}
getFromCache(key?: string | undefined) {
if (key) {
return this.#cache.get(key);
}
}
discover(ev: NostrEvent) {
if (ev.kind === 0) {
this.#keys.add(ev.pubkey);
}
}
async get(key?: string | undefined) {
if (key) {
const cached = this.getFromCache(key);
if (cached) {
return cached;
}
const res = await this.bulkGet([key]);
if (res.length > 0) {
return res[0];
}
}
}
async bulkGet(keys: string[]) {
if (keys.length === 0) return [];
const results = await this.#relay.query([
"REQ",
"ProfileCacheRelayWorker.bulkGet",
{
authors: keys,
kinds: [0],
},
]);
const mapped = removeUndefined(results.map(a => mapEventToProfile(a)));
for (const pf of mapped) {
this.#cache.set(this.key(pf), pf);
}
this.emit(
"change",
mapped.map(a => this.key(a)),
);
return mapped;
}
async set(obj: CachedMetadata) {
this.#keys.add(this.key(obj));
}
async bulkSet(obj: CachedMetadata[] | readonly CachedMetadata[]) {
const mapped = obj.map(a => this.key(a));
mapped.forEach(a => this.#keys.add(a));
// todo: store in cache
this.emit("change", mapped);
}
async update(): Promise<"new" | "refresh" | "updated" | "no_change"> {
// do nothing
return "refresh";
}
async buffer(keys: string[]) {
const missing = keys.filter(a => !this.#cache.has(a));
const res = await this.bulkGet(missing);
return missing.filter(a => !res.some(b => this.key(b) === a));
}
key(of: CachedMetadata) {
return of.pubkey;
}
snapshot() {
return [...this.#cache.values()];
}
}

View File

@ -1,6 +1,7 @@
import { FeedCache } from "@snort/shared";
import { EventPublisher, RequestBuilder, TaggedNostrEvent } from "@snort/system";
import { LoginSession } from "@/Login";
import { LoginSession } from "@/Utils/Login";
export type TWithCreated<T> = (T | Readonly<T>) & { created_at: number };
@ -23,7 +24,6 @@ export abstract class RefreshFeedCache<T> extends FeedCache<TWithCreated<T>> {
override async preload(): Promise<void> {
await super.preload();
// load all dms to memory
await this.buffer([...this.onTable]);
}
}

View File

@ -0,0 +1,6 @@
import { ParsedFragment } from "@snort/system";
import { LRUCache } from "typescript-lru-cache";
export const TextCache = new LRUCache<string, Array<ParsedFragment>>({
maxSize: 1000,
});

View File

@ -0,0 +1,128 @@
import { CachedTable, CacheEvents, removeUndefined, unixNowMs, unwrap } from "@snort/shared";
import { CacheRelay, EventKind, NostrEvent, UsersFollows } from "@snort/system";
import debug from "debug";
import { EventEmitter } from "eventemitter3";
export class UserFollowsWorker extends EventEmitter<CacheEvents> implements CachedTable<UsersFollows> {
#relay: CacheRelay;
#keys = new Set<string>();
#cache = new Map<string, UsersFollows>();
#log = debug("UserFollowsWorker");
constructor(relay: CacheRelay) {
super();
this.#relay = relay;
}
async preload() {
const start = unixNowMs();
const profiles = await this.#relay.query([
"REQ",
"profiles-preload",
{
kinds: [3],
},
]);
this.#cache = new Map<string, UsersFollows>(profiles.map(a => [a.pubkey, unwrap(mapEventToUserFollows(a))]));
this.#keys = new Set<string>(this.#cache.keys());
this.#log(`Loaded %d/%d in %d ms`, this.#cache.size, this.#keys.size, (unixNowMs() - start).toLocaleString());
}
async search(q: string) {
const results = await this.#relay.query([
"REQ",
"contacts-search",
{
kinds: [3],
search: q,
},
]);
return removeUndefined(results.map(mapEventToUserFollows));
}
keysOnTable(): string[] {
return [...this.#keys];
}
getFromCache(key?: string | undefined): UsersFollows | undefined {
if (key) {
return this.#cache.get(key);
}
}
discover(ev: NostrEvent) {
this.#keys.add(ev.pubkey);
}
async get(key?: string | undefined): Promise<UsersFollows | undefined> {
if (key) {
const res = await this.bulkGet([key]);
if (res.length > 0) {
return res[0];
}
}
}
async bulkGet(keys: string[]) {
if (keys.length === 0) return [];
const results = await this.#relay.query([
"REQ",
"UserFollowsWorker.bulkGet",
{
authors: keys,
kinds: [3],
},
]);
const mapped = removeUndefined(results.map(a => mapEventToUserFollows(a)));
for (const pf of mapped) {
this.#cache.set(this.key(pf), pf);
}
this.emit(
"change",
mapped.map(a => this.key(a)),
);
return mapped;
}
async set(obj: UsersFollows) {
this.#keys.add(this.key(obj));
}
async bulkSet(obj: UsersFollows[] | readonly UsersFollows[]) {
const mapped = obj.map(a => this.key(a));
mapped.forEach(a => this.#keys.add(a));
// todo: store in cache
this.emit("change", mapped);
}
async update(): Promise<"new" | "refresh" | "updated" | "no_change"> {
// do nothing
return "refresh";
}
async buffer(keys: string[]): Promise<string[]> {
const missing = keys.filter(a => !this.#keys.has(a));
const res = await this.bulkGet(missing);
return missing.filter(a => !res.some(b => this.key(b) === a));
}
key(of: UsersFollows): string {
return of.pubkey;
}
snapshot(): UsersFollows[] {
return [...this.#cache.values()];
}
}
export function mapEventToUserFollows(ev: NostrEvent): UsersFollows | undefined {
if (ev.kind !== EventKind.ContactList) return;
return {
pubkey: ev.pubkey,
loaded: unixNowMs(),
created: ev.created_at,
follows: ev.tags,
};
}

View File

@ -1,38 +1,86 @@
import { UserProfileCache, UserRelaysCache, RelayMetricCache } from "@snort/system";
import { CacheRelay, Connection, ConnectionCacheRelay, RelayMetricCache, UserRelaysCache } from "@snort/system";
import { SnortSystemDb } from "@snort/system-web";
import { WorkerRelayInterface } from "@snort/worker-relay";
import WorkerVite from "@snort/worker-relay/src/worker?worker";
import { EventInteractionCache } from "./EventInteractionCache";
import { ChatCache } from "./ChatCache";
import { Payments } from "./PaymentsCache";
import { EventCacheWorker } from "./EventCacheWorker";
import { GiftWrapCache } from "./GiftWrapCache";
import { NotificationsCache } from "./Notifications";
import { FollowsFeedCache } from "./FollowsFeed";
import { FollowListCache } from "./FollowListCache";
import { ProfileCacheRelayWorker } from "./ProfileWorkerCache";
import { UserFollowsWorker } from "./UserFollowsWorker";
const cacheRelay = localStorage.getItem("cache-relay");
const workerRelay = new WorkerRelayInterface(
import.meta.env.DEV ? new URL("@snort/worker-relay/dist/esm/worker.mjs", import.meta.url) : new WorkerVite(),
);
export const Relay: CacheRelay = cacheRelay
? new ConnectionCacheRelay(new Connection(cacheRelay, { read: true, write: true }))
: workerRelay;
async function tryUseCacheRelay(url: string) {
try {
const conn = new Connection(url, { read: true, write: true });
await conn.connect(true);
localStorage.setItem("cache-relay", url);
return conn;
} catch (e) {
console.error(e);
}
}
export async function initRelayWorker() {
try {
if (!cacheRelay) {
let conn = await tryUseCacheRelay("ws://localhost:4869");
if (!conn) {
conn = await tryUseCacheRelay("ws://umbrel:4848");
}
if (conn) {
window.location.reload();
return;
}
} else if (Relay instanceof ConnectionCacheRelay) {
await Relay.connection.connect(true);
return;
}
} catch (e) {
localStorage.removeItem("cache-relay");
console.error(e);
if (cacheRelay) {
window.location.reload();
}
}
try {
await workerRelay.debug("");
await workerRelay.init({
databasePath: "relay.db",
insertBatchSize: 100,
});
} catch (e) {
console.error(e);
}
}
export const SystemDb = new SnortSystemDb();
export const UserCache = new UserProfileCache(SystemDb.users);
export const UserRelays = new UserRelaysCache(SystemDb.userRelays);
export const RelayMetrics = new RelayMetricCache(SystemDb.relayMetrics);
export const Chats = new ChatCache();
export const PaymentsCache = new Payments();
export const InteractionCache = new EventInteractionCache();
export const UserFollows = new UserFollowsWorker(Relay);
export const UserCache = new ProfileCacheRelayWorker(Relay);
export const EventsCache = new EventCacheWorker(Relay);
export const GiftsCache = new GiftWrapCache();
export const Notifications = new NotificationsCache();
export const FollowsFeed = new FollowsFeedCache();
export const FollowLists = new FollowListCache();
export async function preload(follows?: Array<string>) {
const preloads = [
UserCache.preload(follows),
Chats.preload(),
InteractionCache.preload(),
UserRelays.preload(follows),
UserCache.preload(),
RelayMetrics.preload(),
GiftsCache.preload(),
Notifications.preload(),
FollowsFeed.preload(),
FollowLists.preload(),
UserRelays.preload(follows),
EventsCache.preload(),
UserFollows.preload(),
];
await Promise.all(preloads);
}

View File

@ -19,10 +19,10 @@
box-shadow: rgba(0, 0, 0, 0.08) 0 1px 1px;
}
.light .spinner-button:hover {
.light .spinner-button:not(.primary):hover {
box-shadow: rgba(0, 0, 0, 0.2) 0 1px 3px;
}
.light .spinner-button > span {
.light .spinner-button:not(.primary) > span {
color: black;
}

View File

@ -1,8 +1,10 @@
import "./AsyncButton.css";
import React, { ForwardedRef } from "react";
import Spinner from "../Icons/Spinner";
import useLoading from "@/Hooks/useLoading";
import classNames from "classnames";
import React, { ForwardedRef } from "react";
import Spinner from "@/Components/Icons/Spinner";
import useLoading from "@/Hooks/useLoading";
export interface AsyncButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
onClick?: (e: React.MouseEvent) => Promise<void> | void;
@ -29,4 +31,6 @@ const AsyncButton = React.forwardRef<HTMLButtonElement, AsyncButtonProps>((props
);
});
AsyncButton.displayName = "AsyncButton";
export default AsyncButton;

View File

@ -1,6 +1,6 @@
import Icon from "@/Icons/Icon";
import Icon from "@/Components/Icons/Icon";
import Spinner from "@/Components/Icons/Spinner";
import useLoading from "@/Hooks/useLoading";
import Spinner from "@/Icons/Spinner";
export type AsyncIconProps = React.HTMLProps<HTMLDivElement> & {
iconName: string;

View File

@ -1,9 +1,10 @@
import "./BackButton.css";
import { useIntl } from "react-intl";
import Icon from "@/Icons/Icon";
import Icon from "@/Components/Icons/Icon";
import messages from "./messages";
import messages from "../messages";
interface BackButtonProps {
text?: string;

View File

@ -0,0 +1,16 @@
import classNames from "classnames";
import Icon from "@/Components/Icons/Icon";
export default function CloseButton({ onClick, className }: { onClick?: () => void; className?: string }) {
return (
<div
onClick={onClick}
className={classNames(
"self-center circle flex flex-shrink-0 flex-grow-0 items-center justify-center hover:opacity-80 bg-dark p-2 cursor-pointer",
className,
)}>
<Icon name="close" size={12} />
</div>
);
}

View File

@ -1,7 +1,8 @@
import classNames from "classnames";
import Icon, { IconProps } from "@/Icons/Icon";
import type { ReactNode } from "react";
import Icon, { IconProps } from "@/Components/Icons/Icon";
interface IconButtonProps {
onClick?: () => void;
icon: IconProps;

View File

@ -1,9 +1,10 @@
import { FormattedMessage } from "react-intl";
import { useNavigate } from "react-router-dom";
import { logout } from "@/Login";
import useLogin from "@/Hooks/useLogin";
import messages from "./messages";
import { logout } from "@/Utils/Login";
import messages from "../messages";
export default function LogoutButton() {
const navigate = useNavigate();

View File

@ -0,0 +1,20 @@
import { NavLink as RouterNavLink, NavLinkProps, useLocation } from "react-router-dom";
export default function NavLink(props: NavLinkProps) {
const { to, onClick, ...rest } = props;
const location = useLocation();
const isActive = location.pathname === to.toString();
const handleClick = event => {
if (onClick) {
onClick(event);
}
if (isActive) {
window.scrollTo({ top: 0, behavior: "instant" });
}
};
return <RouterNavLink to={to} onClick={handleClick} {...rest} />;
}

View File

@ -1,8 +1,7 @@
import { useState, ReactNode } from "react";
import classNames from "classnames";
import { ReactNode, useState } from "react";
import Icon from "@/Icons/Icon";
import ShowMore from "@/Element/Event/ShowMore";
import Icon from "@/Components/Icons/Icon";
interface CollapsedProps {
text?: string;
@ -13,8 +12,8 @@ interface CollapsedProps {
const Collapsed = ({ text, children, collapsed, setCollapsed }: CollapsedProps) => {
return collapsed ? (
<div className="collapsed">
<ShowMore text={text} onClick={() => setCollapsed(false)} />
<div className="text-nostr-purple px-4 pb-3 cursor-pointer hover:underline" onClick={() => setCollapsed(false)}>
{text}
</div>
) : (
<div className="uncollapsed">{children}</div>

View File

@ -0,0 +1,54 @@
export default function AwardIcon({ size }: { size?: number }) {
return (
<svg width={size} height={size} viewBox="0 0 62 62" fill="none" className="award">
<defs>
<linearGradient
id="paint0_linear_2660_40043"
x1="31"
y1="3.57143"
x2="31"
y2="58.4286"
gradientUnits="userSpaceOnUse">
<stop stopColor="#5B2CB3" />
<stop offset="1" stopColor="#811EFF" />
</linearGradient>
<linearGradient
id="paint1_linear_2660_40043"
x1="15.5594"
y1="24.305"
x2="46.433"
y2="24.305"
gradientUnits="userSpaceOnUse">
<stop stopColor="#AC88FF" />
<stop offset="1" stopColor="#7234FF" />
</linearGradient>
</defs>
<g id="award-02">
<rect x="1.85713" y="1.85714" width="58.2857" height="58.2857" rx="29.1429" fill="#AC88FF" fillOpacity="0.2" />
<rect
x="1.85713"
y="1.85714"
width="58.2857"
height="58.2857"
rx="29.1429"
stroke="url(#paint0_linear_2660_40043)"
strokeWidth="3.42857"
/>
<path
id="Solid"
d="M23.2006 52.4983L22.5639 50.9066L23.2006 52.4983L30.9963 49.38L38.7919 52.4983C39.8813 52.934 41.116 52.801 42.0876 52.1432C43.0592 51.4854 43.6412 50.3885 43.6412 49.2151V38.1015C46.467 35.038 48.1957 30.9408 48.1957 26.4427C48.1957 16.9437 40.4952 9.24329 30.9963 9.24329C21.4973 9.24329 13.7968 16.9437 13.7968 26.4427C13.7968 30.9408 15.5255 35.038 18.3513 38.1015V49.2151C18.3513 50.3885 18.9333 51.4854 19.9049 52.1432C20.8765 52.801 22.1112 52.934 23.2006 52.4983ZM27.2967 43.2429L25.4234 43.9922V42.7187C26.0332 42.9275 26.6584 43.1029 27.2967 43.2429ZM34.6958 43.2429C35.3341 43.1029 35.9593 42.9275 36.5691 42.7187V43.9922L34.6958 43.2429Z"
fill="url(#paint1_linear_2660_40043)"
stroke="#251250"
strokeWidth="3.42857"
strokeLinecap="round"
/>
<path
id="Ellipse 1595"
d="M24.2557 14.6002C17.7766 18.3409 15.5567 26.6257 19.2974 33.1049L42.7604 19.5585C39.0196 13.0794 30.7348 10.8595 24.2557 14.6002Z"
fill="white"
fillOpacity="0.1"
/>
</g>
</svg>
);
}

View File

@ -0,0 +1,49 @@
import { useState } from "react";
import { FormattedMessage } from "react-intl";
import { Link } from "react-router-dom";
import CloseButton from "../Button/CloseButton";
import Modal from "../Modal/Modal";
import AwardIcon from "./Award";
export function LeaderBadge() {
const [showModal, setShowModal] = useState(false);
return (
<>
<div
className="flex gap-1 p-1 pr-2 items-center border border-[#5B2CB3] rounded-full"
onClick={e => {
e.preventDefault();
e.stopPropagation();
setShowModal(true);
}}>
<AwardIcon size={16} />
<div className="text-xs font-medium text-[#AC88FF]">
<FormattedMessage defaultMessage="Community Leader" />
</div>
</div>
{showModal && (
<Modal onClose={() => setShowModal(false)} id="leaders">
<div className="flex flex-col gap-4 items-center relative">
<CloseButton className="absolute right-2 top-2" onClick={() => setShowModal(false)} />
<AwardIcon size={80} />
<div className="text-3xl font-semibold">
<FormattedMessage defaultMessage="Community Leader" />
</div>
<p className="text-secondary">
<FormattedMessage
defaultMessage="Community leaders are individuals who grow the nostr ecosystem by being active in their local communities and helping onboard new users. Anyone can become a community leader, but few hold the current honorary title."
id="f1OxTe"
/>
</p>
<Link to="/settings/invite">
<button className="primary">
<FormattedMessage defaultMessage="Become a leader" />
</button>
</Link>
</div>
</Modal>
)}
</>
);
}

View File

@ -1,21 +1,29 @@
import "./Copy.css";
import classNames from "classnames";
import Icon from "@/Icons/Icon";
import { useCopy } from "@/useCopy";
import Icon from "@/Components/Icons/Icon";
import { useCopy } from "@/Hooks/useCopy";
export interface CopyProps {
text: string;
maxSize?: number;
className?: string;
showText?: boolean;
mask?: string;
}
export default function Copy({ text, maxSize = 32, className }: CopyProps) {
export default function Copy({ text, maxSize = 32, className, showText, mask }: CopyProps) {
const { copy, copied } = useCopy();
const sliceLength = maxSize / 2;
const trimmed = text.length > maxSize ? `${text.slice(0, sliceLength)}...${text.slice(-sliceLength)}` : text;
const displayText = mask ? mask.repeat(text.length) : text;
const trimmed =
displayText.length > maxSize
? `${displayText.slice(0, sliceLength)}...${displayText.slice(-sliceLength)}`
: displayText;
return (
<div className={classNames("copy flex pointer g8 items-center", className)} onClick={() => copy(text)}>
<span className="copy-body">{trimmed}</span>
{(showText ?? true) && <span className="copy-body">{trimmed}</span>}
<span className="icon" style={{ color: copied ? "var(--success)" : "var(--highlight)" }}>
{copied ? <Icon name="check" size={14} /> : <Icon name="copy-solid" size={14} />}
</span>

View File

@ -0,0 +1,24 @@
const AppleMusicEmbed = ({ link }: { link: string }) => {
const convertedUrl = link.replace("music.apple.com", "embed.music.apple.com");
const isSongLink = /\?i=\d+$/.test(convertedUrl);
return (
<>
<iframe
allow="autoplay *; encrypted-media *; fullscreen *; clipboard-write"
frameBorder="0"
// eslint-disable-next-line react/no-unknown-property
credentialless=""
height={isSongLink ? 175 : 450}
style={{ width: "100%", maxWidth: 660, overflow: "hidden", background: "transparent" }}
sandbox="allow-forms allow-popups allow-same-origin allow-scripts allow-storage-access-by-user-activation allow-top-navigation-by-user-activation"
src={convertedUrl}
/>
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
</>
);
};
export default AppleMusicEmbed;

View File

@ -0,0 +1,3 @@
.cashu {
background: var(--cashu-gradient);
}

View File

@ -0,0 +1,82 @@
import "./CashuNuts.css";
import { useUserProfile } from "@snort/system-react";
import { useEffect, useState } from "react";
import { FormattedMessage, FormattedNumber } from "react-intl";
import AsyncButton from "@/Components/Button/AsyncButton";
import ECashIcon from "@/Components/Icons/ECash";
import Icon from "@/Components/Icons/Icon";
import { useCopy } from "@/Hooks/useCopy";
import useLogin from "@/Hooks/useLogin";
interface Token {
token: Array<{
mint: string;
proofs: Array<{
amount: number;
}>;
}>;
memo?: string;
}
export default function CashuNuts({ token }: { token: string }) {
const { publicKey } = useLogin(s => ({ publicKey: s.publicKey }));
const profile = useUserProfile(publicKey);
const { copy } = useCopy();
async function redeemToken(token: string) {
const lnurl = profile?.lud16 ?? "";
const url = `https://redeem.cashu.me?token=${encodeURIComponent(token)}&lightning=${encodeURIComponent(
lnurl,
)}&autopay=yes`;
window.open(url, "_blank");
}
const [cashu, setCashu] = useState<Token>();
useEffect(() => {
try {
if (!token.startsWith("cashuA") || token.length < 10) {
return;
}
import("@cashu/cashu-ts").then(({ getDecodedToken }) => {
const tkn = getDecodedToken(token);
setCashu(tkn);
});
} catch {
// ignored
}
}, [token]);
if (!cashu) return <>{token}</>;
const amount = cashu.token[0].proofs.reduce((acc, v) => acc + v.amount, 0);
return (
<div className="cashu flex justify-between p24 br items-center">
<div className="flex flex-col gap-2 f-ellipsis">
<div className="flex items-center gap-4">
<ECashIcon width={30} />
<FormattedMessage
defaultMessage="{n} eSats"
id="yAztTU"
values={{
n: (
<span className="text-3xl">
<FormattedNumber value={amount} />
</span>
),
}}
/>
</div>
</div>
<div className="flex gap-2 items-center">
<AsyncButton onClick={() => copy(token)}>
<Icon name="copy" />
</AsyncButton>
<AsyncButton onClick={() => redeemToken(token)}>
<FormattedMessage defaultMessage="Redeem" />
</AsyncButton>
</div>
</div>
);
}

View File

@ -0,0 +1,34 @@
import { useState } from "react";
import Icon from "../Icons/Icon";
import { ProxyImg } from "../ProxyImg";
export default function GenericPlayer({ url, poster }: { url: string; poster: string }) {
const [play, setPlay] = useState(false);
if (!play) {
return (
<div
className="relative aspect-video"
onClick={e => {
e.preventDefault();
e.stopPropagation();
setPlay(true);
}}>
<ProxyImg className="absolute" src={poster} />
<div className="absolute w-full h-full opacity-0 hover:opacity-100 hover:bg-black/30 flex items-center justify-center transition">
<Icon name="play-square-outline" size={50} />
</div>
</div>
);
}
return (
<iframe
className="aspect-video w-full"
src={url}
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen={true}
/>
);
}

View File

@ -1,6 +1,7 @@
import { Link } from "react-router-dom";
import "./Hashtag.css";
import { Link } from "react-router-dom";
const Hashtag = ({ tag }: { tag: string }) => {
return (
<span className="hashtag">

View File

@ -1,30 +1,28 @@
import { TwitterTweetEmbed } from "react-twitter-embed";
import {
YoutubeUrlRegex,
TweetUrlRegex,
TidalRegex,
SoundCloudRegex,
MixCloudRegex,
SpotifyRegex,
TwitchRegex,
AppleMusicRegex,
NostrNestsRegex,
WavlakeRegex,
} from "@/Const";
import { magnetURIDecode } from "@/SnortUtils";
import SoundCloudEmbed from "@/Element/Embed/SoundCloudEmded";
import MixCloudEmbed from "@/Element/Embed/MixCloudEmbed";
import SpotifyEmbed from "@/Element/Embed/SpotifyEmbed";
import TidalEmbed from "@/Element/Embed/TidalEmbed";
import TwitchEmbed from "@/Element/Embed/TwitchEmbed";
import AppleMusicEmbed from "@/Element/Embed/AppleMusicEmbed";
import WavlakeEmbed from "@/Element/Embed/WavlakeEmbed";
import LinkPreview from "@/Element/Embed/LinkPreview";
import NostrLink from "@/Element/Embed/NostrLink";
import MagnetLink from "@/Element/Embed/MagnetLink";
import { ReactNode } from "react";
import AppleMusicEmbed from "@/Components/Embed/AppleMusicEmbed";
import LinkPreview from "@/Components/Embed/LinkPreview";
import MagnetLink from "@/Components/Embed/MagnetLink";
import MixCloudEmbed from "@/Components/Embed/MixCloudEmbed";
import NostrLink from "@/Components/Embed/NostrLink";
import SoundCloudEmbed from "@/Components/Embed/SoundCloudEmded";
import SpotifyEmbed from "@/Components/Embed/SpotifyEmbed";
import TidalEmbed from "@/Components/Embed/TidalEmbed";
import TwitchEmbed from "@/Components/Embed/TwitchEmbed";
import WavlakeEmbed from "@/Components/Embed/WavlakeEmbed";
import { magnetURIDecode } from "@/Utils";
import {
AppleMusicRegex,
MixCloudRegex,
NostrNestsRegex,
SoundCloudRegex,
SpotifyRegex,
TidalRegex,
TwitchRegex,
WavlakeRegex,
YoutubeUrlRegex,
} from "@/Utils/Const";
interface HypeTextProps {
link: string;
children?: ReactNode | Array<ReactNode> | null;
@ -37,7 +35,6 @@ export default function HyperText({ link, depth, showLinkPreview, children }: Hy
try {
const url = new URL(a);
const youtubeId = YoutubeUrlRegex.test(a) && RegExp.$1;
const tweetId = TweetUrlRegex.test(a) && RegExp.$2;
const tidalId = TidalRegex.test(a) && RegExp.$1;
const soundcloundId = SoundCloudRegex.test(a) && RegExp.$1;
const mixcloudId = MixCloudRegex.test(a) && RegExp.$1;
@ -46,23 +43,25 @@ export default function HyperText({ link, depth, showLinkPreview, children }: Hy
const isAppleMusicLink = AppleMusicRegex.test(a);
const isNostrNestsLink = NostrNestsRegex.test(a);
const isWavlakeLink = WavlakeRegex.test(a);
if (tweetId) {
if (youtubeId) {
return (
<div className="tweet" key={tweetId}>
<TwitterTweetEmbed tweetId={tweetId} />
</div>
);
} else if (youtubeId) {
return (
<iframe
className="w-max"
src={`https://www.youtube.com/embed/${youtubeId}`}
title="YouTube video player"
key={youtubeId}
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen={true}
/>
<>
<iframe
// eslint-disable-next-line react/no-unknown-property
credentialless=""
className="-mx-4 md:mx-0 w-max my-2"
src={`https://www.youtube.com/embed/${youtubeId}`}
title="YouTube video player"
key={youtubeId}
frameBorder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
allowFullScreen={true}
/>
<a href={a} onClick={e => e.stopPropagation()} target="_blank" rel="noreferrer" className="ext">
{a}
</a>
</>
);
} else if (tidalId) {
return <TidalEmbed link={a} />;

View File

@ -1,12 +1,13 @@
import "./Invoice.css";
import { useState } from "react";
import { useIntl, FormattedMessage } from "react-intl";
import { useMemo } from "react";
import { decodeInvoice } from "@snort/shared";
import classNames from "classnames";
import { useState } from "react";
import { useMemo } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import SendSats from "@/Element/SendSats";
import Icon from "@/Icons/Icon";
import Icon from "@/Components/Icons/Icon";
import ZapModal from "@/Components/ZapModal/ZapModal";
import { useWallet } from "@/Wallet";
import messages from "../messages";
@ -35,7 +36,7 @@ export default function Invoice(props: InvoiceProps) {
<FormattedMessage {...messages.Invoice} />
</h4>
<Icon name="zapCircle" className="zap-circle" />
<SendSats
<ZapModal
title={formatMessage(messages.PayInvoice)}
invoice={invoice}
show={showInvoice}
@ -76,7 +77,7 @@ export default function Invoice(props: InvoiceProps) {
{description && <p>{description}</p>}
{isPaid ? (
<div className="paid">
<FormattedMessage defaultMessage="Paid" id="u/vOPu" />
<FormattedMessage defaultMessage="Paid" />
</div>
) : (
<button disabled={isExpired} type="button" onClick={payInvoice}>

View File

@ -38,7 +38,9 @@
font-size: 12px;
}
.link-preview-image {
.link-preview-container img,
.link-preview-container video,
.link-preview-container iframe {
margin: 0 0 15px 0 !important;
border-radius: 0 !important;
background-image: var(--img-url);

View File

@ -1,13 +1,17 @@
import "./LinkPreview.css";
import { CSSProperties, useEffect, useState } from "react";
import Spinner from "@/Icons/Spinner";
import SnortApi, { LinkPreviewData } from "@/External/SnortApi";
import useImgProxy from "@/Hooks/useImgProxy";
import { MediaElement } from "@/Element/Embed/MediaElement";
import { useEffect, useState } from "react";
import { LRUCache } from "typescript-lru-cache";
import { MediaElement } from "@/Components/Embed/MediaElement";
import Spinner from "@/Components/Icons/Spinner";
import { LinkPreviewData, NostrServices } from "@/External/NostrServices";
import { ProxyImg } from "../ProxyImg";
import GenericPlayer from "./GenericPlayer";
async function fetchUrlPreviewInfo(url: string) {
const api = new SnortApi();
const api = new NostrServices("https://nostr.api.v0l.io");
try {
return await api.linkPreview(url.endsWith(")") ? url.slice(0, -1) : url);
} catch (e) {
@ -15,18 +19,23 @@ async function fetchUrlPreviewInfo(url: string) {
}
}
const cache = new LRUCache<string, LinkPreviewData>({
maxSize: 100,
});
const LinkPreview = ({ url }: { url: string }) => {
const [preview, setPreview] = useState<LinkPreviewData | null>();
const { proxy } = useImgProxy();
const [preview, setPreview] = useState<LinkPreviewData | null>(cache.get(url));
useEffect(() => {
(async () => {
if (preview) return;
const data = await fetchUrlPreviewInfo(url);
if (data) {
const type = data.og_tags?.find(a => a[0].toLowerCase() === "og:type");
const canPreviewType = type?.[1].startsWith("image") || type?.[1].startsWith("video") || false;
if (canPreviewType || data.image) {
setPreview(data);
cache.set(url, data);
return;
}
}
@ -48,9 +57,12 @@ const LinkPreview = ({ url }: { url: string }) => {
const urlTags = ["og:video:secure_url", "og:video:url", "og:video"];
const link = preview?.og_tags?.find(a => urlTags.includes(a[0].toLowerCase()))?.[1];
const videoType = preview?.og_tags?.find(a => a[0].toLowerCase() === "og:video:type")?.[1] ?? "video/mp4";
if (link) {
if (link && videoType.startsWith("video/")) {
return <MediaElement url={link} mime={videoType} />;
}
if (link && videoType.startsWith("text/html") && preview?.image) {
return <GenericPlayer url={link} poster={preview?.image} />;
}
}
if (type?.startsWith("image")) {
const urlTags = ["og:image:secure_url", "og:image:url", "og:image"];
@ -61,9 +73,7 @@ const LinkPreview = ({ url }: { url: string }) => {
}
}
if (preview?.image) {
const backgroundImage = preview?.image ? `url(${proxy(preview?.image)})` : "";
const style = { "--img-url": backgroundImage } as CSSProperties;
return <div className="link-preview-image" style={style}></div>;
return <ProxyImg src={preview?.image} className="w-full object-cover aspect-video" />;
}
return null;
}

View File

@ -1,6 +1,6 @@
import { FormattedMessage } from "react-intl";
import { Magnet } from "@/SnortUtils";
import { Magnet } from "@/Utils";
interface MagnetLinkProps {
magnet: Magnet;
@ -10,7 +10,7 @@ const MagnetLink = ({ magnet }: MagnetLinkProps) => {
return (
<div className="note-invoice">
<h4>
<FormattedMessage defaultMessage="Magnet Link" id="Gcn9NQ" />
<FormattedMessage defaultMessage="Magnet Link" />
</h4>
<a href={magnet.raw} rel="noreferrer">
{magnet.dn ?? magnet.infoHash}

View File

@ -0,0 +1,128 @@
import { IMeta } from "@snort/system";
import classNames from "classnames";
import React, { CSSProperties, useEffect, useMemo, useRef } from "react";
import { useInView } from "react-intersection-observer";
import { ProxyImg } from "@/Components/ProxyImg";
import useImgProxy from "@/Hooks/useImgProxy";
interface MediaElementProps {
mime: string;
url: string;
meta?: IMeta;
onMediaClick?: (e: React.MouseEvent<HTMLImageElement>) => void;
size?: number;
}
interface AudioElementProps {
url: string;
}
interface VideoElementProps {
url: string;
meta?: IMeta;
}
interface ImageElementProps {
url: string;
meta?: IMeta;
size?: number;
onMediaClick?: (e: React.MouseEvent<HTMLImageElement>) => void;
}
const AudioElement = ({ url }: AudioElementProps) => {
return <audio key={url} src={url} controls />;
};
const ImageElement = ({ url, meta, onMediaClick, size }: ImageElementProps) => {
const imageRef = useRef<HTMLImageElement | null>(null);
const style = useMemo(() => {
const style = {} as CSSProperties;
if (meta?.height && meta.width && imageRef.current) {
const scale = imageRef.current.offsetWidth / meta.width;
style.height = `${Math.min(document.body.clientHeight * 0.8, meta.height * scale)}px`;
}
return style;
}, [imageRef?.current, meta]);
return (
<div
className={classNames("flex items-center -mx-4 md:mx-0 my-2", {
"md:h-[510px]": !meta && !CONFIG.media.preferLargeMedia,
"cursor-pointer": onMediaClick,
})}>
<ProxyImg
key={url}
src={url}
size={size}
sha256={meta?.sha256}
onClick={onMediaClick}
className={classNames("max-h-[80vh] w-full h-full object-contain object-center", {
"md:max-h-[510px]": !meta && !CONFIG.media.preferLargeMedia,
})}
style={style}
ref={imageRef}
/>
</div>
);
};
const VideoElement = ({ url }: VideoElementProps) => {
const { proxy } = useImgProxy();
const videoRef = useRef<HTMLVideoElement | null>(null);
const { ref: videoContainerRef, inView } = useInView({ threshold: 0.33 });
const isMobile = window.innerWidth < 768;
useEffect(() => {
if (isMobile || !videoRef.current) {
return;
}
if (inView) {
videoRef.current.play();
} else {
videoRef.current.pause();
}
}, [inView]);
return (
<div
ref={videoContainerRef}
className={classNames("flex justify-center items-center -mx-4 md:mx-0 my-2", {
"md:h-[510px]": !CONFIG.media.preferLargeMedia,
})}>
<video
crossOrigin="anonymous"
ref={videoRef}
loop={true}
muted={!isMobile}
src={url}
controls
poster={proxy(url)}
className={classNames("max-h-[80vh]", { "md:max-h-[510px]": !CONFIG.media.preferLargeMedia })}
onClick={e => e.stopPropagation()}
/>
</div>
);
};
export function MediaElement(props: MediaElementProps) {
if (props.mime.startsWith("image/")) {
return <ImageElement url={props.url} meta={props.meta} onMediaClick={props.onMediaClick} size={props.size} />;
} else if (props.mime.startsWith("audio/")) {
return <AudioElement url={props.url} />;
} else if (props.mime.startsWith("video/")) {
return <VideoElement url={props.url} />;
} else {
return (
<a
key={props.url}
href={props.url}
onClick={e => e.stopPropagation()}
target="_blank"
rel="noreferrer"
className="ext">
{props.url}
</a>
);
}
}

View File

@ -0,0 +1,35 @@
import { NostrLink, NostrPrefix } from "@snort/system";
import { useUserProfile } from "@snort/system-react";
import { useCallback, useRef, useState } from "react";
import DisplayName from "@/Components/User/DisplayName";
import { ProfileCard } from "@/Components/User/ProfileCard";
import { ProfileLink } from "@/Components/User/ProfileLink";
export default function Mention({ link }: { link: NostrLink }) {
const profile = useUserProfile(link.id);
const [isHovering, setIsHovering] = useState(false);
const hoverTimeoutRef = useRef<NodeJS.Timeout | null>(null);
const handleMouseEnter = useCallback(() => {
hoverTimeoutRef.current && clearTimeout(hoverTimeoutRef.current);
hoverTimeoutRef.current = setTimeout(() => setIsHovering(true), 100); // Adjust timeout as needed
}, []);
const handleMouseLeave = useCallback(() => {
hoverTimeoutRef.current && clearTimeout(hoverTimeoutRef.current);
hoverTimeoutRef.current = setTimeout(() => setIsHovering(false), 300); // Adjust timeout as needed
}, []);
if (link.type !== NostrPrefix.Profile && link.type !== NostrPrefix.PublicKey) return;
return (
<span className="highlight" onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>
<ProfileLink pubkey={link.id} link={link} user={profile} onClick={e => e.stopPropagation()}>
@<DisplayName user={profile} pubkey={link.id} />
</ProfileLink>
{isHovering && <ProfileCard pubkey={link.id} user={profile} show={true} />}
</span>
);
}

View File

@ -1,10 +1,10 @@
import { MixCloudRegex } from "@/Const";
import useLogin from "@/Hooks/useLogin";
import usePreferences from "@/Hooks/usePreferences";
import { MixCloudRegex } from "@/Utils/Const";
const MixCloudEmbed = ({ link }: { link: string }) => {
const feedPath = (MixCloudRegex.test(link) && RegExp.$1) + "%2F" + (MixCloudRegex.test(link) && RegExp.$2);
const theme = useLogin(s => s.appData.item.preferences.theme);
const theme = usePreferences(s => s.theme);
const lightParams = theme === "light" ? "light=1" : "light=0";
return (
<>
@ -16,6 +16,9 @@ const MixCloudEmbed = ({ link }: { link: string }) => {
frameBorder="0"
src={`https://www.mixcloud.com/widget/iframe/?hide_cover=1&${lightParams}&feed=%2F${feedPath}%2F`}
/>
<a href={link} target="_blank" rel="noreferrer">
{link}
</a>
</>
);
};

View File

@ -1,17 +1,13 @@
import { Link } from "react-router-dom";
import { NostrPrefix, tryParseNostrLink } from "@snort/system";
import { Link } from "react-router-dom";
import Mention from "@/Element/Embed/Mention";
import NoteQuote from "@/Element/Event/NoteQuote";
import Mention from "@/Components/Embed/Mention";
import NoteQuote from "@/Components/Event/Note/NoteQuote";
export default function NostrLink({ link, depth }: { link: string; depth?: number }) {
const nav = tryParseNostrLink(link);
if (nav?.type === NostrPrefix.PublicKey || nav?.type === NostrPrefix.Profile) {
if (nav.id.startsWith("npub")) {
// eslint-disable-next-line no-debugger
debugger;
}
return <Mention link={nav} />;
} else if (nav?.type === NostrPrefix.Note || nav?.type === NostrPrefix.Event || nav?.type === NostrPrefix.Address) {
if ((depth ?? 0) > 0) {

View File

@ -1,37 +1,38 @@
import { NostrEvent } from "@snort/system";
import { FormattedMessage, FormattedNumber } from "react-intl";
import { LNURL } from "@snort/shared";
import { NostrEvent } from "@snort/system";
import { WalletInvoiceState } from "@snort/wallet";
import { FormattedMessage, FormattedNumber } from "react-intl";
import { dedupe, findTag, hexToBech32, getDisplayName } from "@/SnortUtils";
import FollowListBase from "@/Element/User/FollowListBase";
import AsyncButton from "@/Element/AsyncButton";
import { useWallet } from "@/Wallet";
import { Toastore } from "@/Toaster";
import { UserCache } from "@/Cache";
import useLogin from "@/Hooks/useLogin";
import AsyncButton from "@/Components/Button/AsyncButton";
import { Toastore } from "@/Components/Toaster/Toaster";
import FollowListBase from "@/Components/User/FollowListBase";
import useEventPublisher from "@/Hooks/useEventPublisher";
import { WalletInvoiceState } from "@/Wallet";
import usePreferences from "@/Hooks/usePreferences";
import { dedupe, findTag, getDisplayName, hexToBech32 } from "@/Utils";
import { useWallet } from "@/Wallet";
export default function PubkeyList({ ev, className }: { ev: NostrEvent; className?: string }) {
const wallet = useWallet();
const login = useLogin();
const { publisher } = useEventPublisher();
const defaultZapAmount = usePreferences(s => s.defaultZapAmount);
const { publisher, system } = useEventPublisher();
const ids = dedupe(ev.tags.filter(a => a[0] === "p").map(a => a[1]));
async function zapAll() {
for (const pk of ids) {
try {
const profile = await UserCache.get(pk);
const amtSend = login.appData.item.preferences.defaultZapAmount;
const amtSend = defaultZapAmount;
const lnurl = profile?.lud16 || profile?.lud06;
if (lnurl) {
const svc = new LNURL(lnurl);
await svc.load();
const relays = await system.requestRouter?.forReplyTo(pk);
const zap = await publisher?.zap(
amtSend * 1000,
pk,
Object.keys(login.relays.item),
relays ?? [],
undefined,
`Zap from ${hexToBech32("note", ev.id)}`,
);
@ -74,7 +75,7 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam
defaultMessage="Zap all {n} sats"
id="IVbtTS"
values={{
n: <FormattedNumber value={login.appData.item.preferences.defaultZapAmount * ids.length} />,
n: <FormattedNumber value={defaultZapAmount * ids.length} />,
}}
/>
</AsyncButton>

View File

@ -0,0 +1,20 @@
const SoundCloudEmbed = ({ link }: { link: string }) => {
return (
<>
<iframe
// eslint-disable-next-line react/no-unknown-property
credentialless=""
width="100%"
height="166"
scrolling="no"
allow="autoplay"
src={`https://w.soundcloud.com/player/?url=${link}`}
/>
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
</>
);
};
export default SoundCloudEmbed;

View File

@ -0,0 +1,24 @@
const SpotifyEmbed = ({ link }: { link: string }) => {
const convertedUrl = link.replace(/\/(track|album|playlist|episode)\/([a-zA-Z0-9]+)/, "/embed/$1/$2");
return (
<>
<iframe
// eslint-disable-next-line react/no-unknown-property
credentialless=""
style={{ borderRadius: 12 }}
src={convertedUrl}
width="100%"
height="352"
frameBorder="0"
allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture"
loading="lazy"
/>
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
</>
);
};
export default SpotifyEmbed;

View File

@ -1,5 +1,6 @@
import { useEffect, useState } from "react";
import { TidalRegex } from "@/Const";
import { TidalRegex } from "@/Utils/Const";
// Re-use dom parser across instances of TidalEmbed
const domParser = new DOMParser();
@ -45,13 +46,32 @@ const TidalEmbed = ({ link }: { link: string }) => {
.catch(console.error);
}, [link]);
if (!source)
if (!source) {
return (
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
);
return <iframe src={source} style={extraStyles} width="100%" title="TIDAL Embed" frameBorder={0} />;
}
const iframe = (
<iframe
src={source}
style={extraStyles}
width="100%"
allow="encrypted-media *; clipboard-write *; clipboard-read *"
sandbox="allow-scripts allow-popups allow-forms allow-same-origin"
title="TIDAL Embed"
frameBorder={0}
/>
);
return (
<>
{iframe}
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
</>
);
};
export default TidalEmbed;

View File

@ -0,0 +1,15 @@
const TwitchEmbed = ({ link }: { link: string }) => {
const channel = link.split("/").slice(-1);
const args = `?channel=${channel}&parent=${window.location.hostname}&muted=true`;
return (
<>
<iframe src={`https://player.twitch.tv/${args}`} className="w-max" allowFullScreen={true} />
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
</>
);
};
export default TwitchEmbed;

View File

@ -0,0 +1,23 @@
const WavlakeEmbed = ({ link }: { link: string }) => {
const convertedUrl = link.replace(/(?:player\.|www\.)?wavlake\.com/, "embed.wavlake.com");
return (
<>
<iframe
// eslint-disable-next-line react/no-unknown-property
credentialless=""
style={{ borderRadius: 12 }}
src={convertedUrl}
width="100%"
height="380"
frameBorder="0"
loading="lazy"
/>
<a href={link} target="_blank" rel="noreferrer" onClick={e => e.stopPropagation()} className="ext">
{link}
</a>
</>
);
};
export default WavlakeEmbed;

View File

@ -1,10 +1,11 @@
import "./ZapstrEmbed.css";
import { Link } from "react-router-dom";
import { NostrEvent, NostrLink } from "@snort/system";
import { ProxyImg } from "@/Element/ProxyImg";
import ProfileImage from "@/Element/User/ProfileImage";
import { NostrEvent, NostrLink } from "@snort/system";
import { FormattedMessage } from "react-intl";
import { Link } from "react-router-dom";
import { ProxyImg } from "@/Components/ProxyImg";
import ProfileImage from "@/Components/User/ProfileImage";
export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) {
const media = ev.tags.find(a => a[0] === "media");
@ -24,14 +25,14 @@ export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) {
<audio src={media?.[1] ?? ""} controls={true} />
<div>
{refPersons.map(a => (
<ProfileImage pubkey={a[1]} subHeader={<>{a[2] ?? ""}</>} className="" defaultNip=" " />
<ProfileImage key={a[1]} pubkey={a[1]} subHeader={<>{a[2] ?? ""}</>} className="" defaultNip=" " />
))}
</div>
</div>
</div>
<Link to={`https://zapstr.live/?track=${link}`} target="_blank">
<button>
<FormattedMessage defaultMessage="Open on Zapstr" id="Lu5/Bj" />
<FormattedMessage defaultMessage="Open on Zapstr" />
</button>
</Link>
</>

View File

@ -0,0 +1,44 @@
import React from "react";
import { trackEvent } from "@/Utils";
interface ErrorBoundaryState {
hasError: boolean;
errorMessage?: string;
stack?: string;
}
interface ErrorBoundaryProps {
children: React.ReactNode;
}
export default class ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {
constructor(props: ErrorBoundaryProps) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error: Error): ErrorBoundaryState {
return { hasError: true, errorMessage: error.message, stack: error.stack };
}
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
console.error("Caught an error:", error, errorInfo);
trackEvent("error", { error: error.message, errorInfo: JSON.stringify(errorInfo) });
}
render() {
if (this.state.hasError) {
// Render any custom fallback UI with the error message
return (
<div className="p-2">
<h1>Something went wrong.</h1>
<p>Error: {this.state.errorMessage}</p>
<pre className="text-xs overflow-auto mt-8">{this.state.stack}</pre>
</div>
);
}
return this.props.children;
}
}

View File

@ -1,7 +1,10 @@
import { OfflineError } from "@snort/shared";
import { Offline } from "./Offline";
import classNames from "classnames";
import Icon from "@/Components/Icons/Icon";
import { Offline } from "./Offline";
export function ErrorOrOffline({
error,
onRetry,
@ -14,6 +17,11 @@ export function ErrorOrOffline({
if (error instanceof OfflineError) {
return <Offline onRetry={onRetry} className={className} />;
} else {
return <b className={classNames("error", className)}>{error.message}</b>;
return (
<div className={classNames("flex flex-row items-center px-4 py-3 gap-2", className)}>
<Icon name="alert-circle" size={24} />
<b>{error.message}</b>
</div>
);
}
}

View File

@ -1,12 +1,3 @@
.note-creator {
border: 1px solid transparent;
border-radius: 12px;
box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3);
background:
linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box,
linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box;
}
.note-creator-modal .modal-body > div {
display: flex;
flex-direction: column;
@ -45,7 +36,6 @@
padding: 0;
border-radius: 0;
margin: 8px 12px;
background-color: var(--gray-superdark);
min-height: 100px;
width: stretch;
width: -webkit-fill-available;
@ -78,6 +68,7 @@
justify-content: center;
width: 32px;
height: 32px;
cursor: pointer;
}
.note-creator-icon.pfp .avatar {
@ -85,17 +76,6 @@
height: 32px;
}
.light .note-creator textarea {
background-color: var(--gray-superdark);
}
.light .note-creator {
box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3);
background:
linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box,
linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box;
}
.note-creator-modal .rti--container {
background-color: unset !important;
box-shadow: unset !important;

View File

@ -1,40 +1,76 @@
/* eslint-disable max-lines */
import "./NoteCreator.css";
import { FormattedMessage, useIntl } from "react-intl";
import { EventKind, NostrPrefix, TaggedNostrEvent, EventBuilder, tryParseNostrLink, NostrLink } from "@snort/system";
import { fetchNip05Pubkey, unixNow } from "@snort/shared";
import { EventBuilder, EventKind, NostrLink, NostrPrefix, TaggedNostrEvent, tryParseNostrLink } from "@snort/system";
import classNames from "classnames";
import { TagsInput } from "react-tag-input-component";
import { ClipboardEventHandler, DragEvent, useEffect } from "react";
import { FormattedMessage, useIntl } from "react-intl";
import Icon from "@/Icons/Icon";
import AsyncButton from "@/Components/Button/AsyncButton";
import { AsyncIcon } from "@/Components/Button/AsyncIcon";
import CloseButton from "@/Components/Button/CloseButton";
import { sendEventToRelays } from "@/Components/Event/Create/util";
import Note from "@/Components/Event/EventComponent";
import Icon from "@/Components/Icons/Icon";
import { ToggleSwitch } from "@/Components/Icons/Toggle";
import Modal from "@/Components/Modal/Modal";
import Textarea from "@/Components/Textarea/Textarea";
import { Toastore } from "@/Components/Toaster/Toaster";
import ProfileImage from "@/Components/User/ProfileImage";
import useEventPublisher from "@/Hooks/useEventPublisher";
import { appendDedupe, openFile } from "@/SnortUtils";
import Textarea from "@/Element/Textarea";
import Modal from "@/Element/Modal";
import ProfileImage from "@/Element/User/ProfileImage";
import useFileUpload from "@/Upload";
import Note from "@/Element/Event/Note";
import { ClipboardEventHandler, DragEvent, useEffect, useState } from "react";
import useLogin from "@/Hooks/useLogin";
import { GetPowWorker } from "@/index";
import AsyncButton from "@/Element/AsyncButton";
import { AsyncIcon } from "@/Element/AsyncIcon";
import { fetchNip05Pubkey } from "@snort/shared";
import { ZapTarget } from "@/Zapper";
import usePreferences from "@/Hooks/usePreferences";
import useRelays from "@/Hooks/useRelays";
import { useNoteCreator } from "@/State/NoteCreator";
import { NoteBroadcaster } from "./NoteBroadcaster";
import FileUploadProgress from "./FileUpload";
import { ToggleSwitch } from "@/Icons/Toggle";
import NostrBandApi from "@/External/NostrBand";
import { useLocale } from "@/IntlProvider";
import { openFile, trackEvent } from "@/Utils";
import useFileUpload from "@/Utils/Upload";
import { GetPowWorker } from "@/Utils/wasm";
import { ZapTarget } from "@/Utils/Zapper";
import FileUploadProgress from "../FileUpload";
import { OkResponseRow } from "./OkResponseRow";
const previewNoteOptions = {
showContextMenu: false,
showFooter: false,
canClick: false,
showTime: false,
};
const replyToNoteOptions = {
showFooter: false,
showContextMenu: false,
showProfileCard: false,
showTime: false,
canClick: false,
longFormPreview: true,
};
const quoteNoteOptions = {
showFooter: false,
showContextMenu: false,
showTime: false,
canClick: false,
longFormPreview: true,
};
export function NoteCreator() {
const { formatMessage } = useIntl();
const uploader = useFileUpload();
const login = useLogin(s => ({ relays: s.relays, publicKey: s.publicKey, pow: s.appData.item.preferences.pow }));
const { publisher: pub } = useEventPublisher();
const publisher = login.pow ? pub?.pow(login.pow, GetPowWorker()) : pub;
const publicKey = useLogin(s => s.publicKey);
const pow = usePreferences(s => s.pow);
const relays = useRelays();
const { system, publisher: pub } = useEventPublisher();
const publisher = pow ? pub?.pow(pow, GetPowWorker()) : pub;
const note = useNoteCreator();
const relays = login.relays;
useEffect(() => {
const draft = localStorage.getItem("msgDraft");
if (draft) {
note.update(n => (n.note = draft));
}
}, []);
async function buildNote() {
try {
@ -150,9 +186,46 @@ export function NoteCreator() {
async function sendNote() {
const ev = await buildNote();
if (ev) {
note.update(n => {
n.sending = (note.otherEvents ?? []).concat(ev);
});
let props: Record<string, boolean> | undefined = undefined;
if (ev.tags.find(a => a[0] === "content-warning")) {
props ??= {};
props["content-warning"] = true;
}
if (ev.tags.find(a => a[0] === "poll_option")) {
props ??= {};
props["poll"] = true;
}
if (ev.tags.find(a => a[0] === "zap")) {
props ??= {};
props["zap-split"] = true;
}
if (note.hashTags.length > 0) {
props ??= {};
props["hashtags"] = true;
}
if (props) {
props["content-warning"] ??= false;
props["poll"] ??= false;
props["zap-split"] ??= false;
props["hashtags"] ??= false;
}
trackEvent("PostNote", props);
const events = (note.otherEvents ?? []).concat(ev);
events.map(a =>
sendEventToRelays(system, a, note.selectedCustomRelays, r => {
if (CONFIG.noteCreatorToast) {
r.forEach(rr => {
Toastore.push({
element: c => <OkResponseRow rsp={rr} close={c} />,
expire: unixNow() + (rr.ok ? 5 : 55555),
});
});
}
}),
);
note.update(n => n.reset());
localStorage.removeItem("msgDraft");
}
}
@ -173,7 +246,7 @@ export function NoteCreator() {
}
}
async function uploadFile(file: File | Blob) {
async function uploadFile(file: File) {
try {
if (file) {
const rx = await uploader.upload(file, file.name);
@ -195,6 +268,9 @@ export function NoteCreator() {
if (rx.metadata.width && rx.metadata.height) {
imeta.push(`dim ${rx.metadata.width}x${rx.metadata.height}`);
}
if (rx.metadata.hash) {
imeta.push(`x ${rx.metadata.hash}`);
}
v.extraTags.push(imeta);
}
} else if (rx?.error) {
@ -216,6 +292,7 @@ export function NoteCreator() {
function onChange(ev: React.ChangeEvent<HTMLTextAreaElement>) {
const { value } = ev.target;
note.update(n => (n.note = value));
localStorage.setItem("msgDraft", value);
}
function cancel() {
@ -235,6 +312,7 @@ export function NoteCreator() {
note.update(v => (v.preview = undefined));
} else if (publisher) {
const tmpNote = await buildNote();
trackEvent("PostNotePreview");
note.update(v => (v.preview = tmpNote));
}
}
@ -242,16 +320,7 @@ export function NoteCreator() {
function getPreviewNote() {
if (note.preview) {
return (
<Note
data={note.preview as TaggedNostrEvent}
related={[]}
options={{
showContextMenu: false,
showFooter: false,
canClick: false,
showTime: false,
}}
/>
<Note className="hover:bg-transparent" data={note.preview as TaggedNostrEvent} options={previewNoteOptions} />
);
}
}
@ -261,20 +330,16 @@ export function NoteCreator() {
return (
<>
<h4>
<FormattedMessage defaultMessage="Poll Options" id="vhlWFg" />
<FormattedMessage defaultMessage="Poll Options" />
</h4>
{note.pollOptions?.map((a, i) => (
<div className="form-group w-max" key={`po-${i}`}>
<div>
<FormattedMessage defaultMessage="Option: {n}" id="mfe8RW" values={{ n: i + 1 }} />
<FormattedMessage defaultMessage="Option: {n}" values={{ n: i + 1 }} />
</div>
<div>
<input type="text" value={a} onChange={e => changePollOption(i, e.target.value)} />
{i > 1 && (
<button onClick={() => removePollOption(i)} className="ml5">
<Icon name="close" size={14} />
</button>
)}
{i > 1 && <CloseButton className="ml5" onClick={() => removePollOption(i)} />}
</div>
</div>
))}
@ -305,10 +370,11 @@ export function NoteCreator() {
function renderRelayCustomisation() {
return (
<div className="flex flex-col g8">
{Object.keys(relays.item || {})
.filter(el => relays.item[el].write)
{Object.entries(relays)
.filter(el => el[1].write)
.map(a => a[0])
.map((r, i, a) => (
<div className="p flex justify-between note-creator-relay">
<div className="p flex justify-between note-creator-relay" key={r}>
<div>{r}</div>
<div>
<input
@ -356,24 +422,24 @@ export function NoteCreator() {
<>
<div>
<h4>
<FormattedMessage defaultMessage="Custom Relays" id="EcZF24" />
<FormattedMessage defaultMessage="Custom Relays" />
</h4>
<p>
<FormattedMessage defaultMessage="Send note to a subset of your write relays" id="th5lxp" />
<FormattedMessage defaultMessage="Send note to a subset of your write relays" />
</p>
{renderRelayCustomisation()}
</div>
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Zap Splits" id="5CB6zB" />
<FormattedMessage defaultMessage="Zap Splits" />
</h4>
<FormattedMessage defaultMessage="Zaps on this note will be split to the following users." id="LwYmVi" />
<FormattedMessage defaultMessage="Zaps on this note will be split to the following users." />
<div className="flex flex-col g8">
{[...(note.zapSplits ?? [])].map((v, i, arr) => (
<div className="flex items-center g8">
<div className="flex flex-col f-4 g4">
{[...(note.zapSplits ?? [])].map((v: ZapTarget, i, arr) => (
<div className="flex items-center g8" key={`${v.name}-${v.value}`}>
<div className="flex flex-col flex-4 g4">
<h4>
<FormattedMessage defaultMessage="Recipient" id="8Rkoyb" />
<FormattedMessage defaultMessage="Recipient" />
</h4>
<input
type="text"
@ -386,9 +452,9 @@ export function NoteCreator() {
placeholder={formatMessage({ defaultMessage: "npub / nprofile / nostr address", id: "WvGmZT" })}
/>
</div>
<div className="flex flex-col f-1 g4">
<div className="flex flex-col flex-1 g4">
<h4>
<FormattedMessage defaultMessage="Weight" id="zCb8fX" />
<FormattedMessage defaultMessage="Weight" />
</h4>
<input
type="number"
@ -418,7 +484,7 @@ export function NoteCreator() {
onClick={() =>
note.update(v => (v.zapSplits = [...(v.zapSplits ?? []), { type: "pubkey", value: "", weight: 1 }]))
}>
<FormattedMessage defaultMessage="Add" id="2/2yg+" />
<FormattedMessage defaultMessage="Add" />
</button>
</div>
<span className="warning">
@ -430,7 +496,7 @@ export function NoteCreator() {
</div>
<div className="flex flex-col g8">
<h4>
<FormattedMessage defaultMessage="Sensitive Content" id="bQdA2k" />
<FormattedMessage defaultMessage="Sensitive Content" />
</h4>
<FormattedMessage
defaultMessage="Users must accept the content warning to show the content of your note."
@ -449,7 +515,7 @@ export function NoteCreator() {
})}
/>
<span className="warning">
<FormattedMessage defaultMessage="Not all clients support this yet" id="gXgY3+" />
<FormattedMessage defaultMessage="Not all clients support this yet" />
</span>
</div>
</>
@ -458,14 +524,15 @@ export function NoteCreator() {
function noteCreatorFooter() {
return (
<div className="flex items-center justify-between">
<div className="flex justify-between">
<div className="flex items-center g8">
<ProfileImage
pubkey={login.publicKey ?? ""}
pubkey={publicKey ?? ""}
className="note-creator-icon"
link=""
showUsername={false}
showFollowDistance={false}
showProfileCard={false}
/>
{note.pollOptions === undefined && !note.replyTo && (
<AsyncIcon
@ -483,7 +550,7 @@ export function NoteCreator() {
className={classNames("note-creator-icon", { active: note.advanced })}
/>
<span className="sm:inline hidden">
<FormattedMessage defaultMessage="Preview" id="TJo5E6" />
<FormattedMessage defaultMessage="Preview" />
</span>
<ToggleSwitch
onClick={() => loadPreview()}
@ -493,14 +560,10 @@ export function NoteCreator() {
</div>
<div className="flex g8">
<button className="secondary" onClick={cancel}>
<FormattedMessage defaultMessage="Cancel" id="47FYwb" />
<FormattedMessage defaultMessage="Cancel" />
</button>
<AsyncButton onClick={onSubmit} className="primary">
{note.replyTo ? (
<FormattedMessage defaultMessage="Reply" id="9HU8vw" />
) : (
<FormattedMessage defaultMessage="Send" id="9WRlF4" />
)}
{note.replyTo ? <FormattedMessage defaultMessage="Reply" /> : <FormattedMessage defaultMessage="Send" />}
</AsyncButton>
</div>
</div>
@ -550,39 +613,23 @@ export function NoteCreator() {
{note.replyTo && (
<>
<h4>
<FormattedMessage defaultMessage="Reply To" id="8ED/4u" />
<FormattedMessage defaultMessage="Reply To" />
</h4>
<Note
data={note.replyTo}
related={[]}
options={{
showFooter: false,
showContextMenu: false,
showTime: false,
canClick: false,
showMedia: false,
longFormPreview: true,
}}
/>
<div className="max-h-64 overflow-y-auto">
<Note className="hover:bg-transparent" data={note.replyTo} options={replyToNoteOptions} />
</div>
<hr className="border-border-color border-1 -mx-6" />
</>
)}
{note.quote && (
<>
<h4>
<FormattedMessage defaultMessage="Quote Repost" id="C7642/" />
<FormattedMessage defaultMessage="Quote Repost" />
</h4>
<Note
data={note.quote}
related={[]}
options={{
showFooter: false,
showContextMenu: false,
showTime: false,
canClick: false,
showMedia: false,
longFormPreview: true,
}}
/>
<div className="max-h-64 overflow-y-auto">
<Note className="hover:bg-transparent" data={note.quote} options={quoteNoteOptions} />
</div>
<hr className="border-border-color border-1 -mx-6" />
</>
)}
{note.preview && getPreviewNote()}
@ -594,7 +641,6 @@ export function NoteCreator() {
onDragLeave={handleDragLeave}
onDrop={handleDrop}
autoFocus
className={classNames("textarea", { "textarea--focused": note.active })}
onChange={c => onChange(c)}
value={note.note}
onFocus={() => note.update(v => (v.active = true))}
@ -606,23 +652,6 @@ export function NoteCreator() {
/>
{renderPollOptions()}
</div>
<div className="flex flex-col g4">
<TagsInput
value={note.hashTags}
onChange={e => note.update(s => (s.hashTags = e))}
placeHolder={formatMessage({
defaultMessage: "Add up to 4 hashtags",
id: "AIgmDy",
})}
separators={["Enter", ","]}
/>
{note.hashTags.length > 4 && (
<small className="warning">
<FormattedMessage defaultMessage="Try to use less than 5 hashtags to stay on topic 🙏" id="d8gpCh" />
</small>
)}
<TrendingHashTagsLine onClick={t => note.update(s => (s.hashTags = appendDedupe(s.hashTags, [t])))} />
</div>
</>
)}
{uploader.progress.length > 0 && <FileUploadProgress progress={uploader.progress} />}
@ -635,47 +664,18 @@ export function NoteCreator() {
function reset() {
note.update(v => {
v.reset();
v.show = false;
});
}
if (!note.show) return null;
return (
<Modal id="note-creator" className="note-creator-modal" onClose={reset}>
{note.sending && <NoteBroadcaster evs={note.sending} onClose={reset} customRelays={note.selectedCustomRelays} />}
{!note.sending && noteCreatorForm()}
<Modal
id="note-creator"
bodyClassName="modal-body flex flex-col gap-4"
className="note-creator-modal"
onClose={reset}>
{noteCreatorForm()}
</Modal>
);
}
function TrendingHashTagsLine(props: { onClick: (tag: string) => void }) {
const [hashtags, setHashtags] = useState<Array<{ hashtag: string; posts: number }>>();
const { lang } = useLocale();
async function loadTrendingHashtags() {
const api = new NostrBandApi();
const rsp = await api.trendingHashtags(lang);
setHashtags(rsp.hashtags);
}
useEffect(() => {
loadTrendingHashtags().catch(console.error);
}, []);
if (!hashtags || hashtags.length === 0) return;
return (
<div className="flex flex-col g4">
<small>
<FormattedMessage defaultMessage="Popular Hashtags" id="ddd3JX" />
</small>
<div className="flex g4 flex-wrap">
{hashtags.slice(0, 5).map(a => (
<span className="px-2 py-1 bg-dark rounded-full pointer nowrap" onClick={() => props.onClick(a.hashtag)}>
#{a.hashtag}
</span>
))}
</div>
</div>
);
}

Some files were not shown because too many files have changed in this diff Show More