Commit Graph

8940 Commits

Author SHA1 Message Date
Vitor Pamplona 1bff239183 Fixes need for suspending function on uploading 2026-02-28 11:43:31 -05:00
Vitor Pamplona 30ffeaed34 Merge pull request #1720 from vitorpamplona/claude/add-profile-upload-button-RzGz4
feat: add profile picture upload button when user has no picture
2026-02-28 10:53:48 -05:00
Vitor Pamplona f08297c36c Merge pull request #1718 from vitorpamplona/claude/review-amethyst-issues-VFf0H
fix: render audio MIME types in imeta tags as playable media
2026-02-28 10:52:05 -05:00
Claude 11e86b5805 feat: add profile picture upload button when user has no picture
When a user visits their own profile and has no profile picture set,
show a semi-transparent upload button overlay directly on the profile
picture area. Tapping it opens the gallery picker, uploads the image
to the configured server (NIP-96 or Blossom), and immediately saves
the metadata — without requiring the user to navigate to the edit screen.

- Add uploadPictureAndSave() to NewUserMetadataViewModel: loads current
  metadata, uploads the image, then saves all metadata with the new picture
- Add ProfilePictureWithUploadOverlay composable that wraps ZoomableUserPicture
  and conditionally shows the upload overlay when isMe && no picture
- Add ProfilePictureUploadButton composable for the overlay UI with
  loading state support
- Use ProfilePictureWithUploadOverlay in ProfileHeader instead of
  ZoomableUserPicture directly

https://claude.ai/code/session_01XemJ8Hx9q4mMd1StZNY9CE
2026-02-28 02:06:43 +00:00
Claude 1efcaefe94 fix: render audio MIME types in imeta tags as playable media
Audio URLs with `audio/*` MIME types in NIP-92 imeta tags were silently
dropped (createMediaContent returned null) because only `image/` and
`video/` prefixes were checked. They now map to MediaUrlVideo, which
Media3/ExoPlayer already handles correctly for audio playback.

Also adds common audio extensions (ogg, wav, flac, aac, opus, m4a) to
the extension-based fallback so audio files without imeta tags are also
detected.

Fixes https://github.com/vitorpamplona/amethyst/issues/1701

https://claude.ai/code/session_01YSi64eXRokSy2GzYHoNFES
2026-02-28 00:34:32 +00:00
Vitor Pamplona 3762c8d6c3 Fixes the activity cast 2026-02-27 08:54:30 -05:00
Vitor Pamplona 9675f59040 Fixes lack of import and new kotlin rules 2026-02-27 08:53:49 -05:00
Vitor Pamplona 972c1ac71d Merge pull request #1717 from vitorpamplona/claude/ios-gzip-compression-iHfKC
Implement GZip compression/decompression for iOS using zlib
2026-02-27 07:55:37 -05:00
Claude b8cda402cb test(quartz/utils): add GZipTest to commonTest
Covers the full expect/actual contract across all platforms (Android,
JVM, iOS):

- round-trip for empty, single-char, simple, unicode, and JSON strings
- repetitive input compresses to a smaller size
- gzip magic number (0x1F 0x8B) present in compressed output
- compressed bytes differ from raw input bytes
- decompress of invalid data throws an exception
- special/control characters survive a round-trip

https://claude.ai/code/session_0125CGfu6aMAnSv6ZzAxFHvV
2026-02-27 01:57:10 +00:00
Claude 5cd05ab008 feat(quartz/ios): implement GZip compress/decompress for iOS
Uses platform.zlib (built-in on all Apple targets) via Kotlin/Native
cinterop to provide the actual GZip implementation:

- compress: deflateInit2 with windowBits=31 (MAX_WBITS+16) for gzip
  format; deflateBound gives a tight upper-bound so a single Z_FINISH
  call is always enough – no output loop required.
- decompress: inflateInit2 with windowBits=47 (MAX_WBITS+32) for
  automatic gzip/zlib format detection; output is collected in
  fixed-size chunks to handle arbitrary decompressed sizes.

https://claude.ai/code/session_0125CGfu6aMAnSv6ZzAxFHvV
2026-02-27 01:18:47 +00:00
Vitor Pamplona c2868d4100 Merge branch 'main' of https://github.com/vitorpamplona/amethyst
* 'main' of https://github.com/vitorpamplona/amethyst:
  feat: consolidate drawer settings into a single Settings hub screen
  New Crowdin translations by GitHub Action
2026-02-26 20:11:11 -05:00
Vitor Pamplona 027d932b63 Merge pull request #1716 from vitorpamplona/claude/consolidate-drawer-settings-CBYo3
Consolidate settings screens into unified AllSettingsScreen
2026-02-26 20:08:25 -05:00
Claude e5eb21168b feat: consolidate drawer settings into a single Settings hub screen
Replace six individual drawer items (Relays, Media Servers, Security
Filters, Privacy Options, App Preferences, User Preferences) with a
single "Settings" entry that navigates to a new AllSettingsScreen hub.
The hub lists all six options as clickable rows, each navigating to
their existing screens unchanged.

https://claude.ai/code/session_017Z9x4PNJuMtMQgfYSxTVSU
2026-02-27 01:06:02 +00:00
Vitor Pamplona fe8dd3fb51 Fixing incorrect cast 2026-02-26 20:05:30 -05:00
Vitor Pamplona 18270f8020 Adds a reqUntilEoseAsFlow extension to the Nostr Client 2026-02-26 19:56:39 -05:00
Vitor Pamplona 1b4044814f Merge pull request #1715 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-02-26 19:49:09 -05:00
Vitor Pamplona 0e659b5b07 Fixes instruction to use event database 2026-02-26 19:42:45 -05:00
Vitor Pamplona abf977b791 Removes common tags 2026-02-26 19:39:53 -05:00
Crowdin Bot 6197cc6a7a New Crowdin translations by GitHub Action 2026-02-27 00:39:49 +00:00
Vitor Pamplona 23c3edbec8 docs: add quartz-integration skill for using Quartz in external KMP projects
Adds a comprehensive Claude skill covering Gradle setup, key management,
event creation/signing, relay client, subscriptions, NIP builders, and
platform-specific notes. Also updates the legacy quartz-kmp.md to redirect
to the new skill.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-26 19:37:44 -05:00
Vitor Pamplona 5b156c4530 Basic (ugly) rendering of Zap events when quoted inside of posts. 2026-02-26 19:26:33 -05:00
Vitor Pamplona 591c32ceb3 Solving some more stability issues 2026-02-25 16:53:50 -05:00
Vitor Pamplona 105dfa21fb Resolving some stability issues 2026-02-25 16:45:03 -05:00
Vitor Pamplona b523505c05 fixes spotless check 2026-02-24 18:00:04 -05:00
Vitor Pamplona 89cf71d555 Merge pull request #1710 from nrobi144/feat/desktop-private-dms
feat(desktop): encrypted private DMs (NIP-04/NIP-17)
2026-02-24 17:50:55 -05:00
Vitor Pamplona b1fd450c91 Merge branch 'main' into feat/desktop-private-dms 2026-02-24 17:50:48 -05:00
Vitor Pamplona f0d62a8ea2 Merge pull request #1713 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-02-24 17:40:36 -05:00
Crowdin Bot 80ca7d05ea New Crowdin translations by GitHub Action 2026-02-24 22:31:46 +00:00
Vitor Pamplona f2410a6921 - Turn video controller creation into a flow, removing most of the little hacks to get the controller to work in the lifecycle
- Uses new Media3 content view frames
- Redesigns video playback interface to remove unused buttons and modernize it.
- Adds our own buttons and indicators for the video playback
- Checks if PiP is supported and active before showing the button.
- Improves click interactions with the image dialog
- Fixes Surface release bugs
- Creates new interface for the Picture in Picture view
- Fixes muting and play buttons on the Picture in Picture
2026-02-24 17:28:41 -05:00
Vitor Pamplona 3942a38f0e Fixes missing Video Decoder for the Gallery 2026-02-24 17:22:18 -05:00
Vitor Pamplona 6c63ef60f3 Adds a filter for multiple addressable kinds but one key 2026-02-24 17:21:57 -05:00
Vitor Pamplona 4e39df2707 Initializes the disk cache on an io thread after 3 seconds. 2026-02-24 17:21:37 -05:00
Vitor Pamplona 4c81ef19df Fixes build.gradle to add dependencies for the Gallery 2026-02-24 17:02:03 -05:00
Vitor Pamplona bdc708e658 Fixes stability of the feedstate 2026-02-24 17:01:25 -05:00
Vitor Pamplona 5e2a4b2cef - Migrates Gallery to not play videos and simply display a tumbnail when it is a video
- Fixes incorrect aspect ratios of the AutoNonLazyGrid when multiple images exist for a single entry
- Adds Play buttons when the image fails to load so that people click and the post appears.
2026-02-23 19:28:53 -05:00
Vitor Pamplona 6c12476902 Fixes bug when showing multiple versions of replaceable videos in the gallery. 2026-02-23 19:21:58 -05:00
nrobi144 78aa7962e9 feat(desktop): add DM broadcast status banner and audit fixes
- Show relay confirmation URLs in broadcast banner
- Add relayUrls field to DmBroadcastStatus.Sent
- Wire send progress tracking with per-relay confirmations
- Fix empty chatroom Loading state transition
- Improve NewDmDialog npub metadata resolution
- Harden sendAndWaitForResponse timeout handling

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 06:53:53 +02:00
nrobi144 35a15f0462 feat(desktop): add DM broadcast banner and fix empty room loading
- Fix ListChangeFeedViewModel stuck on Loading for empty chatrooms by
  adding invalidateData() call in init block
- Add DmBroadcastStatus sealed class and DmBroadcastBanner composable
  in commons for relay send progress display
- Add DmSendTracker using sendAndWaitForResponse for confirmed delivery
- Wire send tracking through DesktopIAccount into ChatPane banner
- Fix audit risks: unsubscribe DMs on account change, wait for relay
  connect before subscribing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 12:20:04 +02:00
nrobi144 5d983c5d27 fix(desktop): wire gift wrap broadcast for DM reactions
The sendWrappedReaction function was creating NIP-17 gift wraps via
NIP17Factory but never broadcasting them. Added sendGiftWraps() to
IAccount interface with implementations in both Desktop and Android.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 09:34:33 +02:00
nrobi144 3f5ad8f7be feat(desktop): wire NIP-17 emoji reactions in DM chat
Replace TODO stub with sendWrappedReaction using NIP17Factory.
createReactionWithinGroup creates gift-wrapped reactions for group privacy.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 07:34:53 +02:00
nrobi144 9a30b935d2 feat(desktop): wire DM sending, subscriptions, and new DM dialog
- DesktopIAccount: sign + broadcast NIP-04/NIP-17 messages via relay layer
- Main.kt: activate DM subscriptions on login, consume events into cache
- NewDmDialog: user search dialog with SearchBarState + UserSearchCard
- DesktopMessagesScreen: wire Cmd+Shift+N and "+" button to NewDmDialog

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 07:33:04 +02:00
Vitor Pamplona 2f1eeea77b Merge pull request #1708 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-02-18 15:00:31 -05:00
Crowdin Bot bae16f0b52 New Crowdin translations by GitHub Action 2026-02-18 19:58:57 +00:00
Vitor Pamplona fc502d81d4 Merge branch 'main' of https://github.com/vitorpamplona/amethyst
* 'main' of https://github.com/vitorpamplona/amethyst:
  New Crowdin translations by GitHub Action
  update cz, pt, de, sv
2026-02-18 14:56:21 -05:00
Vitor Pamplona bcd2bc066b - Removes nip96 and updates Blossom recommendations 2026-02-18 14:56:07 -05:00
Vitor Pamplona 9000a11377 Merge pull request #1707 from vitorpamplona/l10n_crowdin_translations
New Crowdin Translations
2026-02-18 13:08:20 -05:00
Crowdin Bot b1dad24393 New Crowdin translations by GitHub Action 2026-02-18 18:05:59 +00:00
David Kaspar 69a7ceef6c Merge pull request #1706 from davotoula/update-translations
update cz, pt, de, sv
2026-02-18 18:03:38 +00:00
Vitor Pamplona 086e2046db Fixes test file loader for iOS 2026-02-18 12:34:55 -05:00
Vitor Pamplona ee7d20e939 Minor adjustment in class names 2026-02-18 12:25:48 -05:00