damus

nostr ios client
git clone git://jb55.com/damus
Log | Files | Refs | README | LICENSE

commit eeb6547d3e626819def8f303b63c1fc42db1a322
parent 50ef6600a8be26b158bde2f1ca6988e0e76c0f18
Author: Swift <120697811+scoder1747@users.noreply.github.com>
Date:   Fri, 15 Nov 2024 20:08:44 -0500

Add Damus Share Feature

This PR change adds Damus Share feature to the app that allows the users to share Photos and URLs from foreign apps.

Changelog-Added: Add Damus Share Feature

Signed-off-by: Swift Coder  <scoder1747@gmail.com>
Diffstat:
Mdamus.xcodeproj/project.pbxproj | 1139++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mdamus/Models/HighlightEvent.swift | 24++++++++++++++++++++++++
Mdamus/Views/PostView.swift | 39+++++++++++++++++++++++++++++++++++++++
Ashare extension/Info.plist | 22++++++++++++++++++++++
Ashare extension/ShareViewController.swift | 356+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ashare extension/share extension.entitlements | 18++++++++++++++++++
6 files changed, 1597 insertions(+), 1 deletion(-)

diff --git a/damus.xcodeproj/project.pbxproj b/damus.xcodeproj/project.pbxproj @@ -429,6 +429,483 @@ 7C902AE32981D55B002AB16E /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C902AE22981D55B002AB16E /* ZoomableScrollView.swift */; }; 7C95CAEE299DCEF1009DCB67 /* KFOptionSetter+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */; }; 7CFF6317299FEFE5005D382A /* SelectableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CFF6316299FEFE5005D382A /* SelectableText.swift */; }; + 82D6FA9A2CD9820500C925F4 /* ShareViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82D6FA992CD9820500C925F4 /* ShareViewController.swift */; }; + 82D6FAA12CD9820500C925F4 /* ShareExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 82D6FA972CD9820500C925F4 /* ShareExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 82D6FAA92CD99F7900C925F4 /* FbConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9372A9AD44700DC3548 /* FbConstants.swift */; }; + 82D6FAAA2CD99F7900C925F4 /* Offset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9382A9AD44700DC3548 /* Offset.swift */; }; + 82D6FAAB2CD99F7900C925F4 /* Int+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B93A2A9AD44700DC3548 /* Int+extension.swift */; }; + 82D6FAAC2CD99F7900C925F4 /* FlatBufferBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B93B2A9AD44700DC3548 /* FlatBufferBuilder.swift */; }; + 82D6FAAD2CD99F7900C925F4 /* FlatbuffersErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B93C2A9AD44700DC3548 /* FlatbuffersErrors.swift */; }; + 82D6FAAE2CD99F7900C925F4 /* Verifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B93E2A9AD44700DC3548 /* Verifier.swift */; }; + 82D6FAAF2CD99F7900C925F4 /* ByteBuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9402A9AD44700DC3548 /* ByteBuffer.swift */; }; + 82D6FAB02CD99F7900C925F4 /* TableVerifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9412A9AD44700DC3548 /* TableVerifier.swift */; }; + 82D6FAB12CD99F7900C925F4 /* Root.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9422A9AD44700DC3548 /* Root.swift */; }; + 82D6FAB22CD99F7900C925F4 /* VeriferOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9432A9AD44700DC3548 /* VeriferOptions.swift */; }; + 82D6FAB32CD99F7900C925F4 /* Table.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9442A9AD44700DC3548 /* Table.swift */; }; + 82D6FAB42CD99F7900C925F4 /* Verifiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9452A9AD44700DC3548 /* Verifiable.swift */; }; + 82D6FAB52CD99F7900C925F4 /* NativeObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9462A9AD44700DC3548 /* NativeObject.swift */; }; + 82D6FAB62CD99F7900C925F4 /* String+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9472A9AD44700DC3548 /* String+extension.swift */; }; + 82D6FAB72CD99F7900C925F4 /* FlatBufferObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B9492A9AD44700DC3548 /* FlatBufferObject.swift */; }; + 82D6FAB82CD99F7900C925F4 /* Enum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C32B94A2A9AD44700DC3548 /* Enum.swift */; }; + 82D6FAB92CD99F7900C925F4 /* builder.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4792942A9939BD00489948 /* builder.c */; }; + 82D6FABA2CD99F7900C925F4 /* json_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4792C82A9939BD00489948 /* json_parser.c */; }; + 82D6FABB2CD99F7900C925F4 /* emitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4792CF2A9939BD00489948 /* emitter.c */; }; + 82D6FABC2CD99F7900C925F4 /* refmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4792D12A9939BD00489948 /* refmap.c */; }; + 82D6FABD2CD99F7900C925F4 /* verifier.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4792D42A9939BD00489948 /* verifier.c */; }; + 82D6FABE2CD99F7900C925F4 /* NdbProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C478E2C2A9935D300489948 /* NdbProfile.swift */; }; + 82D6FABF2CD99F7900C925F4 /* NdbTagIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9054882A6AED4700811EEC /* NdbTagIterator.swift */; }; + 82D6FAC02CD99F7900C925F4 /* NdbNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C90548A2A6AEDEE00811EEC /* NdbNote.swift */; }; + 82D6FAC12CD99F7900C925F4 /* AsciiCharacter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5D5C9C2A6B2CB40024563C /* AsciiCharacter.swift */; }; + 82D6FAC22CD99F7900C925F4 /* NdbTagElem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDD1ADF2A6B305F001CD4DF /* NdbTagElem.swift */; }; + 82D6FAC32CD99F7900C925F4 /* Ndb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C478E242A9932C100489948 /* Ndb.swift */; }; + 82D6FAC42CD99F7900C925F4 /* NdbTagsIterator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDD1AE12A6B3074001CD4DF /* NdbTagsIterator.swift */; }; + 82D6FAC52CD99F7900C925F4 /* NdbTxn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3DCC752A9FC2030091E592 /* NdbTxn.swift */; }; + 82D6FAC62CD99F7900C925F4 /* nostrdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CE9FBB82A6B3B26007E485C /* nostrdb.c */; }; + 82D6FAC72CD99F7900C925F4 /* midl.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4793032A993DB900489948 /* midl.c */; }; + 82D6FAC82CD99F7900C925F4 /* mdb.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4793002A993B9A00489948 /* mdb.c */; }; + 82D6FAC92CD99F7900C925F4 /* NdbNote+.swift in Sources */ = {isa = PBXBuildFile; fileRef = D798D2272B085CDA00234419 /* NdbNote+.swift */; }; + 82D6FACA2CD99F7900C925F4 /* NostrScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C19AE4C2A5CEF7C00C90DB7 /* NostrScript.swift */; }; + 82D6FACB2CD99F7900C925F4 /* nostrscript.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C4F14A92A2A71AB0045A0B9 /* nostrscript.c */; }; + 82D6FACC2CD99F7900C925F4 /* error.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C9146FF2A2A891E00DDEA40 /* error.c */; }; + 82D6FACD2CD99F7900C925F4 /* wasm.c in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9276E2A2A5D110098A105 /* wasm.c */; }; + 82D6FACE2CD99F7900C925F4 /* damus.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C06670A28FDE64700038D2A /* damus.c */; }; + 82D6FACF2CD99F7900C925F4 /* utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C06670D28FDEAA000038D2A /* utf8.c */; }; + 82D6FAD02CD99F7900C925F4 /* bolt11.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA63C28FF52D600C48A62 /* bolt11.c */; }; + 82D6FAD12CD99F7900C925F4 /* hash_u5.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64028FF553900C48A62 /* hash_u5.c */; }; + 82D6FAD22CD99F7900C925F4 /* sha256.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64328FF558100C48A62 /* sha256.c */; }; + 82D6FAD32CD99F7900C925F4 /* bech32.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64828FF597700C48A62 /* bech32.c */; }; + 82D6FAD42CD99F7900C925F4 /* bech32_util.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64B28FF59AC00C48A62 /* bech32_util.c */; }; + 82D6FAD52CD99F7900C925F4 /* tal.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA64E28FF59F200C48A62 /* tal.c */; }; + 82D6FAD62CD99F7900C925F4 /* node_id.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA65F28FF5E7700C48A62 /* node_id.c */; }; + 82D6FAD72CD99F7900C925F4 /* mem.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA66428FF5F6800C48A62 /* mem.c */; }; + 82D6FAD82CD99F7900C925F4 /* hex.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA66728FF5F9900C48A62 /* hex.c */; }; + 82D6FAD92CD99F7900C925F4 /* amount.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA66C28FF782800C48A62 /* amount.c */; }; + 82D6FADA2CD99F7900C925F4 /* take.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA67428FF7A5A00C48A62 /* take.c */; }; + 82D6FADB2CD99F7900C925F4 /* talstr.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA67628FF7A9800C48A62 /* talstr.c */; }; + 82D6FADC2CD99F7900C925F4 /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA67828FF7ABF00C48A62 /* list.c */; }; + 82D6FADD2CD99F7900C925F4 /* nostr_bech32.c in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D00CE29E38B950036AF10 /* nostr_bech32.c */; }; + 82D6FADE2CD99F7900C925F4 /* ThreadReply.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C45E5012BED4D000025A428 /* ThreadReply.swift */; }; + 82D6FADF2CD99F7900C925F4 /* AttachedWalletNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C86F7C52A76C51100EC0817 /* AttachedWalletNotify.swift */; }; + 82D6FAE02CD99F7900C925F4 /* DisplayTabBarNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9D6D152B1AA9C6004E5CD9 /* DisplayTabBarNotify.swift */; }; + 82D6FAE12CD99F7900C925F4 /* BroadcastNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253552A76C8C60004F4B8 /* BroadcastNotify.swift */; }; + 82D6FAE22CD99F7900C925F4 /* ComposeNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253512A76C6130004F4B8 /* ComposeNotify.swift */; }; + 82D6FAE32CD99F7900C925F4 /* FollowedNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA352AD2A76C1AC003BB08B /* FollowedNotify.swift */; }; + 82D6FAE42CD99F7900C925F4 /* FollowNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA3529D2A76AE67003BB08B /* FollowNotify.swift */; }; + 82D6FAE52CD99F7900C925F4 /* LikedNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA352A12A76AEC5003BB08B /* LikedNotify.swift */; }; + 82D6FAE62CD99F7900C925F4 /* LocalNotificationNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA352A92A76BF3A003BB08B /* LocalNotificationNotify.swift */; }; + 82D6FAE72CD99F7900C925F4 /* LoginNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C12535B2A76CA540004F4B8 /* LoginNotify.swift */; }; + 82D6FAE82CD99F7900C925F4 /* LogoutNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253532A76C7D60004F4B8 /* LogoutNotify.swift */; }; + 82D6FAE92CD99F7900C925F4 /* NewMutesNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA352A72A76B37E003BB08B /* NewMutesNotify.swift */; }; + 82D6FAEA2CD99F7900C925F4 /* NewUnmutesNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA352AB2A76C07F003BB08B /* NewUnmutesNotify.swift */; }; + 82D6FAEB2CD99F7900C925F4 /* Notify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA3529F2A76AE80003BB08B /* Notify.swift */; }; + 82D6FAEC2CD99F7900C925F4 /* OnlyZapsNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253652A76D0FF0004F4B8 /* OnlyZapsNotify.swift */; }; + 82D6FAED2CD99F7900C925F4 /* PostNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253612A76D00B0004F4B8 /* PostNotify.swift */; }; + 82D6FAEE2CD99F7900C925F4 /* PresentSheetNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253572A76C9060004F4B8 /* PresentSheetNotify.swift */; }; + 82D6FAEF2CD99F7900C925F4 /* ProfileUpdatedNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C59B98B2A76C2550032FFEB /* ProfileUpdatedNotify.swift */; }; + 82D6FAF02CD99F7900C925F4 /* ReportNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253632A76D08F0004F4B8 /* ReportNotify.swift */; }; + 82D6FAF12CD99F7900C925F4 /* ScrollToTopNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C12535F2A76CF890004F4B8 /* ScrollToTopNotify.swift */; }; + 82D6FAF22CD99F7900C925F4 /* SwitchedTimelineNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C12535D2A76CA870004F4B8 /* SwitchedTimelineNotify.swift */; }; + 82D6FAF32CD99F7900C925F4 /* UnfollowedNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C12534F2A76C5B20004F4B8 /* UnfollowedNotify.swift */; }; + 82D6FAF42CD99F7900C925F4 /* UnfollowNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253592A76C9960004F4B8 /* UnfollowNotify.swift */; }; + 82D6FAF52CD99F7900C925F4 /* UpdateStatsNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA352A32A76AFF3003BB08B /* UpdateStatsNotify.swift */; }; + 82D6FAF62CD99F7900C925F4 /* ZappingNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C86F7C32A76C44C00EC0817 /* ZappingNotify.swift */; }; + 82D6FAF72CD99F7900C925F4 /* MuteNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253672A76D2470004F4B8 /* MuteNotify.swift */; }; + 82D6FAF82CD99F7900C925F4 /* RelaysChangedNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1253692A76D3850004F4B8 /* RelaysChangedNotify.swift */; }; + 82D6FAF92CD99F7900C925F4 /* MuteThreadNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4E137A2A76D5FB00BDD832 /* MuteThreadNotify.swift */; }; + 82D6FAFA2CD99F7900C925F4 /* UnmuteThreadNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4E137C2A76D63600BDD832 /* UnmuteThreadNotify.swift */; }; + 82D6FAFB2CD99F7900C925F4 /* ReconnectRelaysNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57B4C612B312BD700A232C0 /* ReconnectRelaysNotify.swift */; }; + 82D6FAFC2CD99F7900C925F4 /* PurpleAccountUpdateNotify.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7373BA92B68A65A00F7783D /* PurpleAccountUpdateNotify.swift */; }; + 82D6FAFD2CD99F7900C925F4 /* IdType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC14FEE2A73FCCB007AEB17 /* IdType.swift */; }; + 82D6FAFE2CD99F7900C925F4 /* Pubkey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC14FF02A73FCDB007AEB17 /* Pubkey.swift */; }; + 82D6FAFF2CD99F7900C925F4 /* NoteId.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC14FF42A740BB7007AEB17 /* NoteId.swift */; }; + 82D6FB002CD99F7900C925F4 /* Referenced.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC14FF82A741939007AEB17 /* Referenced.swift */; }; + 82D6FB012CD99F7900C925F4 /* Block.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7527271D2A93FF0100214108 /* Block.swift */; }; + 82D6FB022CD99F7900C925F4 /* MigratedTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = D798D21D2B0858BB00234419 /* MigratedTypes.swift */; }; + 82D6FB032CD99F7900C925F4 /* DamusDuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C60C222B532A8700C5ECA7 /* DamusDuration.swift */; }; + 82D6FB042CD99F7900C925F4 /* SwipeToDismiss.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F0BA24297892BD009531F3 /* SwipeToDismiss.swift */; }; + 82D6FB052CD99F7900C925F4 /* MusicController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C64305B2A945AFF00B0C0E9 /* MusicController.swift */; }; + 82D6FB062CD99F7900C925F4 /* UserStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF38C872A9442DC00BE01B6 /* UserStatusView.swift */; }; + 82D6FB072CD99F7900C925F4 /* UserStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5E54022A9522F600FF6E60 /* UserStatus.swift */; }; + 82D6FB082CD99F7900C925F4 /* UserStatusSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5E54052A9671F800FF6E60 /* UserStatusSheet.swift */; }; + 82D6FB092CD99F7900C925F4 /* SearchHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C687C232A5FA86D0092C550 /* SearchHeaderView.swift */; }; + 82D6FB0A2CD99F7900C925F4 /* DamusGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09712A0AEF5E00943473 /* DamusGradient.swift */; }; + 82D6FB0B2CD99F7900C925F4 /* AlbyGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09732A0AEF9000943473 /* AlbyGradient.swift */; }; + 82D6FB0C2CD99F7900C925F4 /* GoldSupportGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2859612A12A7F0004746F7 /* GoldSupportGradient.swift */; }; + 82D6FB0D2CD99F7900C925F4 /* PinkGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E1DAE2A194075008FC15A /* PinkGradient.swift */; }; + 82D6FB0E2CD99F7900C925F4 /* GrayGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71694F72A6983AF001F4053 /* GrayGradient.swift */; }; + 82D6FB0F2CD99F7900C925F4 /* DamusLogoGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0707D02A1ECB38004E7B51 /* DamusLogoGradient.swift */; }; + 82D6FB102CD99F7900C925F4 /* DamusBackground.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C687C202A5F7ED00092C550 /* DamusBackground.swift */; }; + 82D6FB112CD99F7900C925F4 /* DamusLightGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF2DCCD2AABE1A500984B8D /* DamusLightGradient.swift */; }; + 82D6FB122CD99F7900C925F4 /* MutinyGradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7389B82B9E69ED00781E0A /* MutinyGradient.swift */; }; + 82D6FB132CD99F7900C925F4 /* Shimmer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31D2E846295218AF006D67F8 /* Shimmer.swift */; }; + 82D6FB142CD99F7900C925F4 /* EndBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7641A28A1641400B6928F /* EndBlock.swift */; }; + 82D6FB152CD99F7900C925F4 /* ImageCarousel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C06670528FCB08600038D2A /* ImageCarousel.swift */; }; + 82D6FB162CD99F7900C925F4 /* InvoicesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA67C28FFBBA200C48A62 /* InvoicesView.swift */; }; + 82D6FB172CD99F7900C925F4 /* InvoiceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3EA67E28FFC01D00C48A62 /* InvoiceView.swift */; }; + 82D6FB182CD99F7900C925F4 /* NIP05Badge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB8838A296F6E1E00DC99E7 /* NIP05Badge.swift */; }; + 82D6FB192CD99F7900C925F4 /* Reposted.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB8838C296F710400DC99E7 /* Reposted.swift */; }; + 82D6FB1A2CD99F7900C925F4 /* WebsiteLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CBCA92F297DB57F00EC6B2F /* WebsiteLink.swift */; }; + 82D6FB1B2CD99F7900C925F4 /* Highlight.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAEC297F0B9E00430951 /* Highlight.swift */; }; + 82D6FB1C2CD99F7900C925F4 /* CustomPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FB9297F72980072348F /* CustomPicker.swift */; }; + 82D6FB1D2CD99F7900C925F4 /* UserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABE22981BC7D00D66079 /* UserView.swift */; }; + 82D6FB1E2CD99F7900C925F4 /* ZoomableScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C902AE22981D55B002AB16E /* ZoomableScrollView.swift */; }; + 82D6FB1F2CD99F7900C925F4 /* NoteZapButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883AF297705DD00DC99E7 /* NoteZapButton.swift */; }; + 82D6FB202CD99F7900C925F4 /* TranslateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C42812B298C848200DBF26F /* TranslateView.swift */; }; + 82D6FB212CD99F7900C925F4 /* SelectableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CFF6316299FEFE5005D382A /* SelectableText.swift */; }; + 82D6FB222CD99F7900C925F4 /* DamusColors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8EC52429D1FA6C0085D9A8 /* DamusColors.swift */; }; + 82D6FB232CD99F7900C925F4 /* ThiccDivider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F729DB7399005914DB /* ThiccDivider.swift */; }; + 82D6FB242CD99F7900C925F4 /* IconLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A2229DDDB8100516EAC /* IconLabel.swift */; }; + 82D6FB252CD99F7900C925F4 /* TruncatedText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D00C929DF80350036AF10 /* TruncatedText.swift */; }; + 82D6FB262CD99F7900C925F4 /* SupporterBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C28595F2A12A2BE004746F7 /* SupporterBadge.swift */; }; + 82D6FB272CD99F7900C925F4 /* GradientButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E1DAC2A193EC2008FC15A /* GradientButtonStyle.swift */; }; + 82D6FB282CD99F7900C925F4 /* NeutralButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC868DC2AA29B3200FB22BA /* NeutralButtonStyle.swift */; }; + 82D6FB292CD99F7900C925F4 /* URIParsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = E04A37C52B544F090029650D /* URIParsing.swift */; }; + 82D6FB2A2CD99F7900C925F4 /* VersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1D4FB02A7958E60024F453 /* VersionInfo.swift */; }; + 82D6FB2B2CD99F7900C925F4 /* WalletConnect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09612A098D0E00943473 /* WalletConnect.swift */; }; + 82D6FB2C2CD99F7900C925F4 /* ImageMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C198DF429F88D2E004C165C /* ImageMetadata.swift */; }; + 82D6FB2D2CD99F7900C925F4 /* ImageProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0EE9DD32B8E5FEA00F3002D /* ImageProcessing.swift */; }; + 82D6FB2E2CD99F7900C925F4 /* BlurHashEncode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C198DEB29F88C6B004C165C /* BlurHashEncode.swift */; }; + 82D6FB2F2CD99F7900C925F4 /* BlurHashDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C198DEE29F88C6B004C165C /* BlurHashDecode.swift */; }; + 82D6FB302CD99F7900C925F4 /* PostBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F329D779B5005914DB /* PostBox.swift */; }; + 82D6FB312CD99F7900C925F4 /* KFOptionSetter+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */; }; + 82D6FB322CD99F7900C925F4 /* FillAndStroke.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09752A0AF19E00943473 /* FillAndStroke.swift */; }; + 82D6FB332CD99F7900C925F4 /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72E12772BEED22400F4F781 /* Array.swift */; }; + 82D6FB342CD99F7900C925F4 /* VectorMath.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78DB85A2C20FE4F00F0AB12 /* VectorMath.swift */; }; + 82D6FB352CD99F7900C925F4 /* OffsetExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0567542C8B60C20073F23A /* OffsetExtension.swift */; }; + 82D6FB362CD99F7900C925F4 /* RelayFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794729941DA700F758CC /* RelayFilters.swift */; }; + 82D6FB372CD99F7900C925F4 /* RelayModelCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504323A82A3495B6006AE6DC /* RelayModelCache.swift */; }; + 82D6FB382CD99F7900C925F4 /* RelayBootstrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6193929DC777C006A86D1 /* RelayBootstrap.swift */; }; + 82D6FB392CD99F7900C925F4 /* RelayModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504323A62A34915F006AE6DC /* RelayModel.swift */; }; + 82D6FB3A2CD99F7900C925F4 /* AnyCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABE829844AF100D66079 /* AnyCodable.swift */; }; + 82D6FB3B2CD99F7900C925F4 /* AnyDecodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABEB29844B4700D66079 /* AnyDecodable.swift */; }; + 82D6FB3C2CD99F7900C925F4 /* AnyEncodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABED29844B5500D66079 /* AnyEncodable.swift */; }; + 82D6FB3D2CD99F7900C925F4 /* Zap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAE6297EFA7B00430951 /* Zap.swift */; }; + 82D6FB3E2CD99F7900C925F4 /* NIPURLBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7908E96298B1FDF00AB113A /* NIPURLBuilder.swift */; }; + 82D6FB3F2CD99F7900C925F4 /* TimeAgo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF4280B29E600AB5EEF /* TimeAgo.swift */; }; + 82D6FB402CD99F7900C925F4 /* Parser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8328233689006E126D /* Parser.swift */; }; + 82D6FB412CD99F7900C925F4 /* InsertSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363AA728297703006E126D /* InsertSort.swift */; }; + 82D6FB422CD99F7900C925F4 /* Keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C8B28398BC6008A31F1 /* Keys.swift */; }; + 82D6FB432CD99F7900C925F4 /* KeychainStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 501F8C7F2A0220E1001AFC1D /* KeychainStorage.swift */; }; + 82D6FB442CD99F7900C925F4 /* Bech32.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C90BD19283AA67F008EE7EF /* Bech32.swift */; }; + 82D6FB452CD99F7900C925F4 /* InputDismissKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F352870A9A700040376 /* InputDismissKeyboard.swift */; }; + 82D6FB462CD99F7900C925F4 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3169CAEC294FCCFC00EE4006 /* Constants.swift */; }; + 82D6FB472CD99F7900C925F4 /* LinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3165648A295B70D500C64604 /* LinkView.swift */; }; + 82D6FB482CD99F7900C925F4 /* PreviewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3A1D3629637E0500558C0F /* PreviewCache.swift */; }; + 82D6FB492CD99F7900C925F4 /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64FBD06E296255C400D9D3B2 /* Theme.swift */; }; + 82D6FB4A2CD99F7900C925F4 /* NIP05.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB8838529656C8B00DC99E7 /* NIP05.swift */; }; + 82D6FB4B2CD99F7900C925F4 /* Lists.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABD72981980C00D66079 /* Lists.swift */; }; + 82D6FB4C2CD99F7900C925F4 /* Bech32Object.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABEF29857E9200D66079 /* Bech32Object.swift */; }; + 82D6FB4D2CD99F7900C925F4 /* CoreSVG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C60CAEE298471A1009C80D6 /* CoreSVG.swift */; }; + 82D6FB4E2CD99F7900C925F4 /* AccountDeletion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAAD8AC298851D000060CEA /* AccountDeletion.swift */; }; + 82D6FB4F2CD99F7900C925F4 /* LNUrlPayRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883A52975F83C00DC99E7 /* LNUrlPayRequest.swift */; }; + 82D6FB502CD99F7900C925F4 /* Zaps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883A72975FC1800DC99E7 /* Zaps.swift */; }; + 82D6FB512CD99F7900C925F4 /* LNUrls.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB883B5297730E400DC99E7 /* LNUrls.swift */; }; + 82D6FB522CD99F7900C925F4 /* Translator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AB72AB8298ECF30004BB58C /* Translator.swift */; }; + 82D6FB532CD99F7900C925F4 /* Debouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2CDDF6299D4A5E00879FD5 /* Debouncer.swift */; }; + 82D6FB542CD99F7900C925F4 /* EventHolder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE0E2AE29A2E82100DB4CA2 /* EventHolder.swift */; }; + 82D6FB552CD99F7900C925F4 /* LocalizationUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A3040F029A8FF97008A0F29 /* LocalizationUtil.swift */; }; + 82D6FB562CD99F7900C925F4 /* EventCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7729A577AB00E2BD5A /* EventCache.swift */; }; + 82D6FB572CD99F7900C925F4 /* DisplayName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9BB83029C0ED4F00FC4E37 /* DisplayName.swift */; }; + 82D6FB582CD99F7900C925F4 /* DebouncedOnChange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F0F129D4FCFA005914DB /* DebouncedOnChange.swift */; }; + 82D6FB592CD99F7900C925F4 /* ReplyCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A1929DCA17E00516EAC /* ReplyCounter.swift */; }; + 82D6FB5A2CD99F7900C925F4 /* CompatibleAttribute.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D00C729DF791C0036AF10 /* CompatibleAttribute.swift */; }; + 82D6FB5B2CD99F7900C925F4 /* Hashtags.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D00CB29DF92DF0036AF10 /* Hashtags.swift */; }; + 82D6FB5C2CD99F7900C925F4 /* LocalNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDA128B29EB19C40006FA5A /* LocalNotification.swift */; }; + 82D6FB5D2CD99F7900C925F4 /* StringCodable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA5588229F33F5B00DC6A45 /* StringCodable.swift */; }; + 82D6FB5E2CD99F7900C925F4 /* CredentialHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B5685229F97CB400A23243 /* CredentialHandler.swift */; }; + 82D6FB5F2CD99F7900C925F4 /* KeyboardVisible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09582A05BEAD00943473 /* KeyboardVisible.swift */; }; + 82D6FB602CD99F7900C925F4 /* StringUtil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8CC6CB2A2CFEF900940F5F /* StringUtil.swift */; }; + 82D6FB612CD99F7900C925F4 /* Router.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2277EE92A089BD5006C3807 /* Router.swift */; }; + 82D6FB622CD99F7900C925F4 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2B10272A7B0F5C008AA43E /* Log.swift */; }; + 82D6FB632CD99F7900C925F4 /* AVPlayer+Additions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50C3E0892AA8E3F7006A4BC0 /* AVPlayer+Additions.swift */; }; + 82D6FB642CD99F7900C925F4 /* SequenceUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EDED202B117DCA0018B19C /* SequenceUtils.swift */; }; + 82D6FB652CD99F7900C925F4 /* CollectionExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EDED2D2B128E8A0018B19C /* CollectionExtension.swift */; }; + 82D6FB662CD99F7900C925F4 /* ZapDataModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AAFCE2B155D8C006CF0F4 /* ZapDataModel.swift */; }; + 82D6FB672CD99F7900C925F4 /* Zaps+.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AAFD32B155ECB006CF0F4 /* Zaps+.swift */; }; + 82D6FB682CD99F7900C925F4 /* WalletConnect+.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AAFD52B155F0C006CF0F4 /* WalletConnect+.swift */; }; + 82D6FB692CD99F7900C925F4 /* DamusPurpleNotificationManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CBD1D32B8D21DC00BFD889 /* DamusPurpleNotificationManagement.swift */; }; + 82D6FB6A2CD99F7900C925F4 /* DamusPurple.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74F43092B23F0BE00425B75 /* DamusPurple.swift */; }; + 82D6FB6B2CD99F7900C925F4 /* StoreObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74F430B2B23FB9B00425B75 /* StoreObserver.swift */; }; + 82D6FB6C2CD99F7900C925F4 /* DamusPurpleURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7ADD3DD2B53854300F104C4 /* DamusPurpleURL.swift */; }; + 82D6FB6D2CD99F7900C925F4 /* DamusPurpleEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72341182B6864F200E1E135 /* DamusPurpleEnvironment.swift */; }; + 82D6FB6E2CD99F7900C925F4 /* PurpleStoreKitManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7100C5D2B7709ED00C59298 /* PurpleStoreKitManager.swift */; }; + 82D6FB6F2CD99F7900C925F4 /* CameraService+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA37598F2ABCCEBA0018D73B /* CameraService+Extensions.swift */; }; + 82D6FB702CD99F7900C925F4 /* ImageResizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3759892ABCCDE30018D73B /* ImageResizer.swift */; }; + 82D6FB712CD99F7900C925F4 /* PhotoCaptureProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA37598B2ABCCE500018D73B /* PhotoCaptureProcessor.swift */; }; + 82D6FB722CD99F7900C925F4 /* VideoCaptureProcessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA37598C2ABCCE500018D73B /* VideoCaptureProcessor.swift */; }; + 82D6FB732CD99F7900C925F4 /* CustomizeZapModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C190F1F2A535FC200027FD5 /* CustomizeZapModel.swift */; }; + 82D6FB742CD99F7900C925F4 /* EventGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C54AA0929A55429003E4487 /* EventGroup.swift */; }; + 82D6FB752CD99F7900C925F4 /* ZapGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C54AA0B29A5543C003E4487 /* ZapGroup.swift */; }; + 82D6FB762CD99F7900C925F4 /* NotificationStatusModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9AA1492A4587A6003F49FD /* NotificationStatusModel.swift */; }; + 82D6FB772CD99F7900C925F4 /* ThreadModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0A3F8E280F640A000448DE /* ThreadModel.swift */; }; + 82D6FB782CD99F7900C925F4 /* ReplyMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0A3F92280F66F5000448DE /* ReplyMap.swift */; }; + 82D6FB792CD99F7900C925F4 /* ProfileModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFD12819DB9B00B3DE84 /* ProfileModel.swift */; }; + 82D6FB7A2CD99F7900C925F4 /* ActionBarModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFD5281D995700B3DE84 /* ActionBarModel.swift */; }; + 82D6FB7B2CD99F7900C925F4 /* LikeCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFD9281DCA1400B3DE84 /* LikeCounter.swift */; }; + 82D6FB7C2CD99F7900C925F4 /* Liked.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFDB281DCE6100B3DE84 /* Liked.swift */; }; + 82D6FB7D2CD99F7900C925F4 /* DamusState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFDF281DE1ED00B3DE84 /* DamusState.swift */; }; + 82D6FB7E2CD99F7900C925F4 /* Mentions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7FF7D42823313F009601DB /* Mentions.swift */; }; + 82D6FB7F2CD99F7900C925F4 /* ProfileUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A912825FCF2006E126D /* ProfileUpdate.swift */; }; + 82D6FB802CD99F7900C925F4 /* Post.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A93282704FA006E126D /* Post.swift */; }; + 82D6FB812CD99F7900C925F4 /* PostBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A952827096D006E126D /* PostBlock.swift */; }; + 82D6FB822CD99F7900C925F4 /* Reply.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A9928283854006E126D /* Reply.swift */; }; + 82D6FB832CD99F7900C925F4 /* SearchModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363AA328296DEE006E126D /* SearchModel.swift */; }; + 82D6FB842CD99F7900C925F4 /* NostrFilter+Hashable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E8A4BB62AE4359200065E81 /* NostrFilter+Hashable.swift */; }; + 82D6FB852CD99F7900C925F4 /* Contacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3AC79A28306D7B00E1F516 /* Contacts.swift */; }; + 82D6FB862CD99F7900C925F4 /* CreateAccountModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C85283892E7008A31F1 /* CreateAccountModel.swift */; }; + 82D6FB872CD99F7900C925F4 /* HomeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C63334F283D40E500B1C9C3 /* HomeModel.swift */; }; + 82D6FB882CD99F7900C925F4 /* SignalModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C633351283D419F00B1C9C3 /* SignalModel.swift */; }; + 82D6FB892CD99F7900C925F4 /* FollowTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5F9113283D694D0052CD1C /* FollowTarget.swift */; }; + 82D6FB8A2CD99F7900C925F4 /* BookmarksManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75BA12C29A1855400E10810 /* BookmarksManager.swift */; }; + 82D6FB8B2CD99F7900C925F4 /* EventsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5F9115283D855D0052CD1C /* EventsModel.swift */; }; + 82D6FB8C2CD99F7900C925F4 /* FollowingModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5F9117283D88E40052CD1C /* FollowingModel.swift */; }; + 82D6FB8D2CD99F7900C925F4 /* FollowersModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C987B56283FD07F0042CE38 /* FollowersModel.swift */; }; + 82D6FB8E2CD99F7900C925F4 /* SearchHomeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5C7E67284ED36500A22DF5 /* SearchHomeModel.swift */; }; + 82D6FB8F2CD99F7900C925F4 /* DirectMessagesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C64987D286D082C00EAE2B3 /* DirectMessagesModel.swift */; }; + 82D6FB902CD99F7900C925F4 /* DirectMessageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F372871EDE300040376 /* DirectMessageModel.swift */; }; + 82D6FB912CD99F7900C925F4 /* UserSettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA693073295D649800ADDB87 /* UserSettingsStore.swift */; }; + 82D6FB922CD99F7900C925F4 /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE60CDC295E1C5E00105A1F /* Wallet.swift */; }; + 82D6FB932CD99F7900C925F4 /* Report.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABD32980996B00D66079 /* Report.swift */; }; + 82D6FB942CD99F7900C925F4 /* LibreTranslateServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AE45AF5297BB2E700C1D842 /* LibreTranslateServer.swift */; }; + 82D6FB952CD99F7900C925F4 /* TranslationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAA95C9298DF87B00F3D526 /* TranslationService.swift */; }; + 82D6FB962CD99F7900C925F4 /* DeepLPlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AAA95CB298E07E900F3D526 /* DeepLPlan.swift */; }; + 82D6FB972CD99F7900C925F4 /* ZapsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8795A2996C47A00F758CC /* ZapsModel.swift */; }; + 82D6FB982CD99F7900C925F4 /* DraftsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA59D1C2999B0400061C48E /* DraftsModel.swift */; }; + 82D6FB992CD99F7900C925F4 /* NotificationsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C54AA0629A540BA003E4487 /* NotificationsModel.swift */; }; + 82D6FB9A2CD99F7900C925F4 /* ImageUploadModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CD348EE29C3659D00497EB2 /* ImageUploadModel.swift */; }; + 82D6FB9B2CD99F7900C925F4 /* MutedThreadsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A48E7AF29DFBE9D006E787E /* MutedThreadsManager.swift */; }; + 82D6FB9C2CD99F7900C925F4 /* WalletModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09772A0B0CC900943473 /* WalletModel.swift */; }; + 82D6FB9D2CD99F7900C925F4 /* ZapButtonModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A23838D2A297DD200E5AA2E /* ZapButtonModel.swift */; }; + 82D6FB9E2CD99F7900C925F4 /* ContentFilters.swift in Sources */ = {isa = PBXBuildFile; fileRef = D723C38D2AB8D83400065664 /* ContentFilters.swift */; }; + 82D6FB9F2CD99F7900C925F4 /* DamusCacheManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7315A292ACDF3B70036E30A /* DamusCacheManager.swift */; }; + 82D6FBA02CD99F7900C925F4 /* NotificationsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D3D2B116DAD00AD4105 /* NotificationsManager.swift */; }; + 82D6FBA12CD99F7900C925F4 /* Contacts+.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D442B116FE800AD4105 /* Contacts+.swift */; }; + 82D6FBA22CD99F7900C925F4 /* ZapType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D4A2B11721600AD4105 /* ZapType.swift */; }; + 82D6FBA32CD99F7900C925F4 /* NewEventsBits.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D4D2B11728000AD4105 /* NewEventsBits.swift */; }; + 82D6FBA42CD99F7900C925F4 /* FriendFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D502B1174D100AD4105 /* FriendFilter.swift */; }; + 82D6FBA52CD99F7900C925F4 /* MediaUploader.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D5B2B1176B200AD4105 /* MediaUploader.swift */; }; + 82D6FBA62CD99F7900C925F4 /* FollowState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7CB5D5E2B11770C00AD4105 /* FollowState.swift */; }; + 82D6FBA72CD99F7900C925F4 /* NoteContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EDED1B2B1178FE0018B19C /* NoteContent.swift */; }; + 82D6FBA82CD99F7900C925F4 /* LongformEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EDED1D2B11797D0018B19C /* LongformEvent.swift */; }; + 82D6FBA92CD99F7900C925F4 /* DamusUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7EDED322B12ACAE0018B19C /* DamusUserDefaults.swift */; }; + 82D6FBAA2CD99F7900C925F4 /* HeadlessDamusState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AAFC12B153395006CF0F4 /* HeadlessDamusState.swift */; }; + 82D6FBAB2CD99F7900C925F4 /* MuteItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5C60C1F2B530D5100C5ECA7 /* MuteItem.swift */; }; + 82D6FBAC2CD99F7900C925F4 /* MutelistManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = B533694D2B66D791008A805E /* MutelistManager.swift */; }; + 82D6FBAD2CD99F7900C925F4 /* PushNotificationClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7D2A3802BF815D000E4B42B /* PushNotificationClient.swift */; }; + 82D6FBAE2CD99F7900C925F4 /* HighlightEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC8529C2BD741CD0039FFC5 /* HighlightEvent.swift */; }; + 82D6FBAF2CD99F7900C925F4 /* CommentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D773BC5E2C6D538500349F0A /* CommentItem.swift */; }; + 82D6FBB02CD99F7900C925F4 /* RelayConnection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DF1527F8DEBF00C66700 /* RelayConnection.swift */; }; + 82D6FBB12CD99F7900C925F4 /* RelayLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A60D132A28BEEE00186190 /* RelayLog.swift */; }; + 82D6FBB22CD99F7900C925F4 /* Nostr.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFA527FF87A20006080F /* Nostr.swift */; }; + 82D6FBB32CD99F7900C925F4 /* NostrFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFAE28049D340006080F /* NostrFilter.swift */; }; + 82D6FBB42CD99F7900C925F4 /* NostrResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB028049D510006080F /* NostrResponse.swift */; }; + 82D6FBB52CD99F7900C925F4 /* NostrEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB228049D640006080F /* NostrEvent.swift */; }; + 82D6FBB62CD99F7900C925F4 /* Nip98HTTPAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CCD1E692A874C4E0099A953 /* Nip98HTTPAuth.swift */; }; + 82D6FBB72CD99F7900C925F4 /* Relay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB428049D790006080F /* Relay.swift */; }; + 82D6FBB82CD99F7900C925F4 /* RelayPool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB628049D990006080F /* RelayPool.swift */; }; + 82D6FBB92CD99F7900C925F4 /* ProofOfWork.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFBA2804A34C0006080F /* ProofOfWork.swift */; }; + 82D6FBBA2CD99F7900C925F4 /* NostrRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AEC2805B22500AB5EEF /* NostrRequest.swift */; }; + 82D6FBBB2CD99F7900C925F4 /* Profiles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9DB280C38C000D9BBE8 /* Profiles.swift */; }; + 82D6FBBC2CD99F7900C925F4 /* NostrKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3BEFD32819DE8F00B3DE84 /* NostrKind.swift */; }; + 82D6FBBD2CD99F7900C925F4 /* NostrLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8F28247A1D006E126D /* NostrLink.swift */; }; + 82D6FBBE2CD99F7900C925F4 /* WebSocket.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50088DA029E8271A008A1FDF /* WebSocket.swift */; }; + 82D6FBBF2CD99F7900C925F4 /* ReferencedId.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C28A4112A6D03D200C1A7A5 /* ReferencedId.swift */; }; + 82D6FBC02CD99F7900C925F4 /* Id.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C2B7BF12A71B6540049DEE7 /* Id.swift */; }; + 82D6FBC12CD99F7900C925F4 /* RelayURL.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7FF93FF2AC7AC5200FD969D /* RelayURL.swift */; }; + 82D6FBC22CD99F7900C925F4 /* NostrEvent+.swift in Sources */ = {isa = PBXBuildFile; fileRef = D798D22B2B086C7400234419 /* NostrEvent+.swift */; }; + 82D6FBC32CD99F7900C925F4 /* NIP98AuthenticatedRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7C6787D2B2D34CC00BCEAFB /* NIP98AuthenticatedRequest.swift */; }; + 82D6FBC42CD99F7900C925F4 /* NostrAuth.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57B4C652B312C3700A232C0 /* NostrAuth.swift */; }; + 82D6FBC52CD99F7900C925F4 /* MakeZapRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74AAFCB2B155D07006CF0F4 /* MakeZapRequest.swift */; }; + 82D6FBC62CD99F7900C925F4 /* KFClickable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7D68FF82C9E01B60015A515 /* KFClickable.swift */; }; + 82D6FBC72CD99F7900C925F4 /* ChatEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C011B5C2BD0A56A002F2F9B /* ChatEventView.swift */; }; + 82D6FBC82CD99F7900C925F4 /* ReplyQuoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C011B602BD0B25C002F2F9B /* ReplyQuoteView.swift */; }; + 82D6FBC92CD99F7900C925F4 /* ChatroomThreadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C011B5D2BD0A56A002F2F9B /* ChatroomThreadView.swift */; }; + 82D6FBCA2CD99F7900C925F4 /* ChatBubbleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78DB85E2C20FED300F0AB12 /* ChatBubbleView.swift */; }; + 82D6FBCB2CD99F7900C925F4 /* VisibilityTracker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D71AC4CB2BA8E3480076268E /* VisibilityTracker.swift */; }; + 82D6FBCC2CD99F7900C925F4 /* CameraPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA3759962ABCCF360018D73B /* CameraPreview.swift */; }; + 82D6FBCD2CD99F7900C925F4 /* CameraController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E02429942B7E97740088B16C /* CameraController.swift */; }; + 82D6FBCE2CD99F7900C925F4 /* OnboardingSuggestionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71694E92A662232001F4053 /* OnboardingSuggestionsView.swift */; }; + 82D6FBCF2CD99F7900C925F4 /* SuggestedUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71694F12A67314D001F4053 /* SuggestedUserView.swift */; }; + 82D6FBD02CD99F7900C925F4 /* SuggestedUsersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71694EB2A662292001F4053 /* SuggestedUsersViewModel.swift */; }; + 82D6FBD12CD99F7900C925F4 /* LoadScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C190F242A547D2000027FD5 /* LoadScript.swift */; }; + 82D6FBD22CD99F7900C925F4 /* CodeScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096A2A0AEA0400943473 /* CodeScanner.swift */; }; + 82D6FBD32CD99F7900C925F4 /* ScannerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096B2A0AEA0400943473 /* ScannerCoordinator.swift */; }; + 82D6FBD42CD99F7900C925F4 /* ScannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D096C2A0AEA0400943473 /* ScannerViewController.swift */; }; + 82D6FBD52CD99F7900C925F4 /* ConnectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D095C2A098C5D00943473 /* ConnectWalletView.swift */; }; + 82D6FBD62CD99F7900C925F4 /* WalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D095D2A098C5D00943473 /* WalletView.swift */; }; + 82D6FBD72CD99F7900C925F4 /* NWCScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09672A0AE9B200943473 /* NWCScannerView.swift */; }; + 82D6FBD82CD99F7900C925F4 /* FriendsButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D1A6E29F31E5000ACDF75 /* FriendsButton.swift */; }; + 82D6FBD92CD99F7900C925F4 /* GradientFollowButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F71694F32A6732B7001F4053 /* GradientFollowButton.swift */; }; + 82D6FBDA2CD99F7900C925F4 /* AlbyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C7D09652A0AE62100943473 /* AlbyButton.swift */; }; + 82D6FBDB2CD99F7900C925F4 /* MutinyButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7389B62B9E692E00781E0A /* MutinyButton.swift */; }; + 82D6FBDC2CD99F7900C925F4 /* DamusVideoPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A2929DDF54400516EAC /* DamusVideoPlayer.swift */; }; + 82D6FBDD2CD99F7900C925F4 /* DamusVideoPlayerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A16FFC2AA7525700DFEC1F /* DamusVideoPlayerViewModel.swift */; }; + 82D6FBDE2CD99F7900C925F4 /* VideoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A16FFE2AA76A0900DFEC1F /* VideoController.swift */; }; + 82D6FBDF2CD99F7900C925F4 /* DamusAVPlayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A16FFA2AA6C06600DFEC1F /* DamusAVPlayerView.swift */; }; + 82D6FBE02CD99F7900C925F4 /* ReactionsSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C15C7142A55DE7A00D0A0DB /* ReactionsSettingsView.swift */; }; + 82D6FBE12CD99F7900C925F4 /* NotificationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A1C29DDCF9B00516EAC /* NotificationSettingsView.swift */; }; + 82D6FBE22CD99F7900C925F4 /* AppearanceSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A1E29DDD24B00516EAC /* AppearanceSettingsView.swift */; }; + 82D6FBE32CD99F7900C925F4 /* KeySettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A2029DDD3E100516EAC /* KeySettingsView.swift */; }; + 82D6FBE42CD99F7900C925F4 /* ZapSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A2429DDDF2600516EAC /* ZapSettingsView.swift */; }; + 82D6FBE52CD99F7900C925F4 /* TranslationSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A9A2629DDE31900516EAC /* TranslationSettingsView.swift */; }; + 82D6FBE62CD99F7900C925F4 /* SearchSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E4FA1C022A24BB7F00482697 /* SearchSettingsView.swift */; }; + 82D6FBE72CD99F7900C925F4 /* DeveloperSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5053ACA62A56DF3B00851AE3 /* DeveloperSettingsView.swift */; }; + 82D6FBE82CD99F7900C925F4 /* FirstAidSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7FD12252BD345A700CF195B /* FirstAidSettingsView.swift */; }; + 82D6FBE92CD99F7900C925F4 /* ImageContextMenuModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6229CC9AD7008DB934 /* ImageContextMenuModifier.swift */; }; + 82D6FBEA2CD99F7900C925F4 /* FullScreenCarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6629CC9E3A008DB934 /* FullScreenCarouselView.swift */; }; + 82D6FBEB2CD99F7900C925F4 /* ProfilePicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6439E013296790CF0020672B /* ProfilePicImageView.swift */; }; + 82D6FBEC2CD99F7900C925F4 /* ImageContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6829CC9ED1008DB934 /* ImageContainerView.swift */; }; + 82D6FBED2CD99F7900C925F4 /* MediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFD502E2A2DA45800A229DB /* MediaView.swift */; }; + 82D6FBEE2CD99F7900C925F4 /* PurpleViewPrimitives.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7100C552B76F8E600C59298 /* PurpleViewPrimitives.swift */; }; + 82D6FBEF2CD99F7900C925F4 /* MarketingContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7100C572B76FC8400C59298 /* MarketingContentView.swift */; }; + 82D6FBF02CD99F7900C925F4 /* LogoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7100C592B76FD5100C59298 /* LogoView.swift */; }; + 82D6FBF12CD99F7900C925F4 /* IAPProductStateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7100C5B2B77016700C59298 /* IAPProductStateView.swift */; }; + 82D6FBF22CD99F7900C925F4 /* PurpleBackdrop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C463CBE2B960B96008A8C36 /* PurpleBackdrop.swift */; }; + 82D6FBF32CD99F7900C925F4 /* DamusPurpleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F5829C9FD1E008DB934 /* DamusPurpleView.swift */; }; + 82D6FBF42CD99F7900C925F4 /* DamusPurpleWelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76556D52B1E6C08001B0CCC /* DamusPurpleWelcomeView.swift */; }; + 82D6FBF52CD99F7900C925F4 /* DamusPurpleTranslationSetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7373BA52B688EA200F7783D /* DamusPurpleTranslationSetupView.swift */; }; + 82D6FBF62CD99F7900C925F4 /* DamusPurpleURLSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7ADD3DF2B538D4200F104C4 /* DamusPurpleURLSheetView.swift */; }; + 82D6FBF72CD99F7900C925F4 /* DamusPurpleVerifyNpubView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7ADD3E12B538E3500F104C4 /* DamusPurpleVerifyNpubView.swift */; }; + 82D6FBF82CD99F7900C925F4 /* DamusPurpleAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D724D8262B64B40B00ABE789 /* DamusPurpleAccountView.swift */; }; + 82D6FBF92CD99F7900C925F4 /* DamusPurpleNewUserOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7373BA72B68974500F7783D /* DamusPurpleNewUserOnboardingView.swift */; }; + 82D6FBFA2CD99F7900C925F4 /* SearchingEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEB7AD29B53D260078AA28 /* SearchingEventView.swift */; }; + 82D6FBFB2CD99F7900C925F4 /* PullDownSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9D6D1A2B1D35D7004E5CD9 /* PullDownSearch.swift */; }; + 82D6FBFC2CD99F7900C925F4 /* NDBSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0567572C8FBC560073F23A /* NDBSearchView.swift */; }; + 82D6FBFD2CD99F7900C925F4 /* NotificationsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7129A5677A00E2BD5A /* NotificationsView.swift */; }; + 82D6FBFE2CD99F7900C925F4 /* EventGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7329A5680900E2BD5A /* EventGroupView.swift */; }; + 82D6FBFF2CD99F7900C925F4 /* NotificationItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7529A5770900E2BD5A /* NotificationItemView.swift */; }; + 82D6FC002CD99F7900C925F4 /* ProfilePicturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C30AC7F29A6A53F00E2BD5A /* ProfilePicturesView.swift */; }; + 82D6FC012CD99F7900C925F4 /* DamusAppNotificationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78CD5972B8990300014D539 /* DamusAppNotificationView.swift */; }; + 82D6FC022CD99F7900C925F4 /* InnerTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE0E2B529A3ED5500DB4CA2 /* InnerTimelineView.swift */; }; + 82D6FC032CD99F7900C925F4 /* PostingTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C8711DD2C460C06007879C2 /* PostingTimelineView.swift */; }; + 82D6FC042CD99F7900C925F4 /* ZapsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879572996C45300F758CC /* ZapsView.swift */; }; + 82D6FC052CD99F7900C925F4 /* CustomizeZapView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F18E129AA9B6C008C55EC /* CustomizeZapView.swift */; }; + 82D6FC062CD99F7900C925F4 /* ZapTypePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA3FA0F29F593D000FDB3C3 /* ZapTypePicker.swift */; }; + 82D6FC072CD99F7900C925F4 /* ZapUserView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C73C5132A4437C10062CAC0 /* ZapUserView.swift */; }; + 82D6FC082CD99F7900C925F4 /* ProfileZapLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D76874F22AE3632B00FB0F68 /* ProfileZapLinkView.swift */; }; + 82D6FC092CD99F7900C925F4 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB8FC222A41ABA500763C51 /* AboutView.swift */; }; + 82D6FC0A2CD99F7900C925F4 /* ProfileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF6280B2DEA00AB5EEF /* ProfileName.swift */; }; + 82D6FC0B2CD99F7900C925F4 /* ProfilePictureSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C892838B985008A31F1 /* ProfilePictureSelector.swift */; }; + 82D6FC0C2CD99F7900C925F4 /* EditMetadataView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E990020E2955F837003BBC5A /* EditMetadataView.swift */; }; + 82D6FC0D2CD99F7900C925F4 /* EditPictureControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79C7FAC29D5E9620000F946 /* EditPictureControl.swift */; }; + 82D6FC0E2CD99F7900C925F4 /* ProfilePicView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF2280B25C500AB5EEF /* ProfilePicView.swift */; }; + 82D6FC0F2CD99F7900C925F4 /* ProfileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8682862814DE470026224F /* ProfileView.swift */; }; + 82D6FC102CD99F7900C925F4 /* ProfileNameView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB9D4A62992D02B00A9A7E4 /* ProfileNameView.swift */; }; + 82D6FC112CD99F7900C925F4 /* MaybeAnonPfpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9F18E329ABDE6D008C55EC /* MaybeAnonPfpView.swift */; }; + 82D6FC122CD99F7900C925F4 /* EventProfileName.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9BB83329C12D9900FC4E37 /* EventProfileName.swift */; }; + 82D6FC132CD99F7900C925F4 /* FriendIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C8D1A6B29F1DFC200ACDF75 /* FriendIcon.swift */; }; + 82D6FC142CD99F7900C925F4 /* CondensedProfilePicturesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A4647CE2A413ADC00386AD8 /* CondensedProfilePicturesView.swift */; }; + 82D6FC152CD99F7900C925F4 /* ProfileEditButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C9B0DF22A65C46800CBDA21 /* ProfileEditButton.swift */; }; + 82D6FC162CD99F7900C925F4 /* RelayPaidDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879542996BAB900F758CC /* RelayPaidDetail.swift */; }; + 82D6FC172CD99F7900C925F4 /* RelayAuthenticationDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = B57B4C632B312BFA00A232C0 /* RelayAuthenticationDetail.swift */; }; + 82D6FC182CD99F7900C925F4 /* RelaySoftwareDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C14C29A2BBBA29C00079FD2 /* RelaySoftwareDetail.swift */; }; + 82D6FC192CD99F7900C925F4 /* RelayAdminDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C14C29C2BBBA40B00079FD2 /* RelayAdminDetail.swift */; }; + 82D6FC1A2CD99F7900C925F4 /* RelayNipList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C14C29E2BBBA5C600079FD2 /* RelayNipList.swift */; }; + 82D6FC1B2CD99F7900C925F4 /* RelayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C06670028FC7C5900038D2A /* RelayView.swift */; }; + 82D6FC1C2CD99F7900C925F4 /* RelayConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAAD8AF29888AD200060CEA /* RelayConfigView.swift */; }; + 82D6FC1D2CD99F7900C925F4 /* RelayDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7908E91298B0F0700AB113A /* RelayDetailView.swift */; }; + 82D6FC1E2CD99F7900C925F4 /* RelayToggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794D2996B16A00F758CC /* RelayToggle.swift */; }; + 82D6FC1F2CD99F7900C925F4 /* RelayStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8794F2996B2BD00F758CC /* RelayStatusView.swift */; }; + 82D6FC202CD99F7900C925F4 /* RelayType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE879512996B68900F758CC /* RelayType.swift */; }; + 82D6FC212CD99F7900C925F4 /* SignalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CDA128929E9D10C0006FA5A /* SignalView.swift */; }; + 82D6FC222CD99F7900C925F4 /* RelayPicView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF2DCCB2AA3AF0B00984B8D /* RelayPicView.swift */; }; + 82D6FC232CD99F7900C925F4 /* UserSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABF52985CD5500D66079 /* UserSearch.swift */; }; + 82D6FC242CD99F7900C925F4 /* AddMuteItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51C1CE82B55A60A00E312A9 /* AddMuteItemView.swift */; }; + 82D6FC252CD99F7900C925F4 /* MuteDurationMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = B51C1CE92B55A60A00E312A9 /* MuteDurationMenu.swift */; }; + 82D6FC262CD99F7900C925F4 /* MutelistView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABE02981A83900D66079 /* MutelistView.swift */; }; + 82D6FC272CD99F7900C925F4 /* HighlightView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC8529E2BD744F60039FFC5 /* HighlightView.swift */; }; + 82D6FC282CD99F7900C925F4 /* HighlightDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC852A12BDED9B90039FFC5 /* HighlightDescription.swift */; }; + 82D6FC292CD99F7900C925F4 /* HighlightLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC852A32BDF3CA10039FFC5 /* HighlightLink.swift */; }; + 82D6FC2A2CD99F7900C925F4 /* HighlightEventRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CC852A52BE00F180039FFC5 /* HighlightEventRef.swift */; }; + 82D6FC2B2CD99F7900C925F4 /* HighlightDraftContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4D9EA62C042FA5005EA0F7 /* HighlightDraftContentView.swift */; }; + 82D6FC2C2CD99F7900C925F4 /* TimeDot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927642A290F1A0098A105 /* TimeDot.swift */; }; + 82D6FC2D2CD99F7900C925F4 /* EventTop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927622A290EB10098A105 /* EventTop.swift */; }; + 82D6FC2E2CD99F7900C925F4 /* ReplyDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAF3297F18B400430951 /* ReplyDescription.swift */; }; + 82D6FC2F2CD99F7900C925F4 /* RelativeTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927662A290F8B0098A105 /* RelativeTime.swift */; }; + 82D6FC302CD99F7900C925F4 /* ReplyPart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9276B2A2910D10098A105 /* ReplyPart.swift */; }; + 82D6FC312CD99F7900C925F4 /* ProxyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7389B02B6EFA7100781E0A /* ProxyView.swift */; }; + 82D6FC322CD99F7900C925F4 /* SelectedEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAEF297F11C700430951 /* SelectedEventView.swift */; }; + 82D6FC332CD99F7900C925F4 /* EventBody.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAF5297F1A6A00430951 /* EventBody.swift */; }; + 82D6FC342CD99F7900C925F4 /* BuilderEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAEA297F0AEC00430951 /* BuilderEventView.swift */; }; + 82D6FC352CD99F7900C925F4 /* EventProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAF7297F1CEE00430951 /* EventProfile.swift */; }; + 82D6FC362CD99F7900C925F4 /* EventMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC7AAF9297F64AC00430951 /* EventMenu.swift */; }; + 82D6FC372CD99F7900C925F4 /* EventMutingContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABE6298444FC00D66079 /* EventMutingContainerView.swift */; }; + 82D6FC382CD99F7900C925F4 /* ZapEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D52B5298DB4E6001C5831 /* ZapEvent.swift */; }; + 82D6FC392CD99F7900C925F4 /* TextEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3D52B7298DB5C6001C5831 /* TextEvent.swift */; }; + 82D6FC3A2CD99F7900C925F4 /* WideEventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6C29CD022E008DB934 /* WideEventView.swift */; }; + 82D6FC3B2CD99F7900C925F4 /* LongformView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9275C2A28FF630098A105 /* LongformView.swift */; }; + 82D6FC3C2CD99F7900C925F4 /* LongformPreview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA9275E2A2902B20098A105 /* LongformPreview.swift */; }; + 82D6FC3D2CD99F7900C925F4 /* EventShell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA927602A290E340098A105 /* EventShell.swift */; }; + 82D6FC3E2CD99F7900C925F4 /* MentionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7870BC02AC4750B0080BA88 /* MentionView.swift */; }; + 82D6FC3F2CD99F7900C925F4 /* EventLoaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7870BC22AC47EBC0080BA88 /* EventLoaderView.swift */; }; + 82D6FC402CD99F7900C925F4 /* RepostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA24801297E3DC20090C62D /* RepostView.swift */; }; + 82D6FC412CD99F7900C925F4 /* RepostedEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF8F6A29CD0079008DB934 /* RepostedEvent.swift */; }; + 82D6FC422CD99F7900C925F4 /* QuoteRepostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C94D6422BA5AEFE00C26EFF /* QuoteRepostsView.swift */; }; + 82D6FC432CD99F7900C925F4 /* ReactionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB88395296F7F8B00DC99E7 /* ReactionView.swift */; }; + 82D6FC442CD99F7900C925F4 /* EventActionBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2B01280B39E800AB5EEF /* EventActionBar.swift */; }; + 82D6FC452CD99F7900C925F4 /* EventDetailBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB88388296AF99A00DC99E7 /* EventDetailBar.swift */; }; + 82D6FC462CD99F7900C925F4 /* ShareAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CF72FC129B9142F00124A13 /* ShareAction.swift */; }; + 82D6FC472CD99F7900C925F4 /* RepostAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE1398F29F0661A00AC6A0B /* RepostAction.swift */; }; + 82D6FC482CD99F7900C925F4 /* ShareActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE1399129F0666100AC6A0B /* ShareActionButton.swift */; }; + 82D6FC492CD99F7900C925F4 /* BigButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE1399329F0669900AC6A0B /* BigButton.swift */; }; + 82D6FC4A2CD99F7900C925F4 /* AddRelayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9E228528C5200C00DD9 /* AddRelayView.swift */; }; + 82D6FC4B2CD99F7900C925F4 /* BlocksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8728236948006E126D /* BlocksView.swift */; }; + 82D6FC4C2CD99F7900C925F4 /* BookmarksView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F75BA12E29A18EF500E10810 /* BookmarksView.swift */; }; + 82D6FC4D2CD99F7900C925F4 /* CarouselView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C8128385570008A31F1 /* CarouselView.swift */; }; + 82D6FC4E2CD99F7900C925F4 /* ConfigView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE4F9DD2852768D00C00DD9 /* ConfigView.swift */; }; + 82D6FC4F2CD99F7900C925F4 /* CreateAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C8328385690008A31F1 /* CreateAccountView.swift */; }; + 82D6FC502CD99F7900C925F4 /* DirectMessagesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C64987B286D03E000EAE2B3 /* DirectMessagesView.swift */; }; + 82D6FC512CD99F7900C925F4 /* DMChatView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F31286E388800040376 /* DMChatView.swift */; }; + 82D6FC522CD99F7900C925F4 /* DMView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C216F33286F5ACD00040376 /* DMView.swift */; }; + 82D6FC532CD99F7900C925F4 /* EmptyTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3169CAE5294E69C000EE4006 /* EmptyTimelineView.swift */; }; + 82D6FC542CD99F7900C925F4 /* EmptyUserSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C42E78B29DB76D90086AAC1 /* EmptyUserSearchView.swift */; }; + 82D6FC552CD99F7900C925F4 /* EventView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFB82804A2740006080F /* EventView.swift */; }; + 82D6FC562CD99F7900C925F4 /* EventDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE2AF0280B216B00AB5EEF /* EventDetailView.swift */; }; + 82D6FC572CD99F7900C925F4 /* FollowButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3AC79E2833115300E1F516 /* FollowButtonView.swift */; }; + 82D6FC582CD99F7900C925F4 /* FollowingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3AC79C2833036D00E1F516 /* FollowingView.swift */; }; + 82D6FC592CD99F7900C925F4 /* LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C90BD17283A9EE5008EE7EF /* LoginView.swift */; }; + 82D6FC5A2CD99F7900C925F4 /* QRScanNSECView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFE73542AD4793100EC7326 /* QRScanNSECView.swift */; }; + 82D6FC5B2CD99F7900C925F4 /* NoteContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8D28236FE4006E126D /* NoteContentView.swift */; }; + 82D6FC5C2CD99F7900C925F4 /* PostButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFAC28049CFB0006080F /* PostButton.swift */; }; + 82D6FC5D2CD99F7900C925F4 /* PostView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C75EFA327FA577B0006080F /* PostView.swift */; }; + 82D6FC5E2CD99F7900C925F4 /* AttachMediaUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */; }; + 82D6FC5F2CD99F7900C925F4 /* MediaPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F757933929D7AECD007DEAC1 /* MediaPicker.swift */; }; + 82D6FC602CD99F7900C925F4 /* TextViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C83F89229A937B900136C08 /* TextViewWrapper.swift */; }; + 82D6FC612CD99F7900C925F4 /* MainTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3AC7A42836987600E1F516 /* MainTabView.swift */; }; + 82D6FC622CD99F7900C925F4 /* PubkeyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363A8B28236B92006E126D /* PubkeyView.swift */; }; + 82D6FC632CD99F7900C925F4 /* ReplyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CACA9D4280C31E100D9BBE8 /* ReplyView.swift */; }; + 82D6FC642CD99F7900C925F4 /* ParticipantsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F0BA262978E54D009531F3 /* ParticipantsView.swift */; }; + 82D6FC652CD99F7900C925F4 /* SaveKeysView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C285C8D28399BFD008A31F1 /* SaveKeysView.swift */; }; + 82D6FC662CD99F7900C925F4 /* SearchHomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3AC7A628369BA200E1F516 /* SearchHomeView.swift */; }; + 82D6FC672CD99F7900C925F4 /* SearchResultsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C5C7E69284EDE2E00A22DF5 /* SearchResultsView.swift */; }; + 82D6FC682CD99F7900C925F4 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C363AA128296A7E006E126D /* SearchView.swift */; }; + 82D6FC692CD99F7900C925F4 /* SelectWalletView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB68BEC29543FA3007BA466 /* SelectWalletView.swift */; }; + 82D6FC6A2CD99F7900C925F4 /* SetupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C3AC7A02835A81400E1F516 /* SetupView.swift */; }; + 82D6FC6B2CD99F7900C925F4 /* ThreadView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9E4ED0A295867B900DD7078 /* ThreadView.swift */; }; + 82D6FC6C2CD99F7900C925F4 /* TimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CA2EF9F280E37AC0044ACD8 /* TimelineView.swift */; }; + 82D6FC6D2CD99F7900C925F4 /* UserRelaysView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB55EF4295E679D007FD187 /* UserRelaysView.swift */; }; + 82D6FC6E2CD99F7900C925F4 /* SideMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 647D9A8C2968520300A295DE /* SideMenuView.swift */; }; + 82D6FC6F2CD99F7900C925F4 /* BannerImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9609F057296E220800069BF3 /* BannerImageView.swift */; }; + 82D6FC702CD99F7900C925F4 /* ReactionsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB8838E296F781C00DC99E7 /* ReactionsView.swift */; }; + 82D6FC712CD99F7900C925F4 /* ReportView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABD529817F5B00D66079 /* ReportView.swift */; }; + 82D6FC722CD99F7900C925F4 /* EULAView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CF0ABE42981EE0C00D66079 /* EULAView.swift */; }; + 82D6FC732CD99F7900C925F4 /* RepostsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AA247FE297E3D900090C62D /* RepostsView.swift */; }; + 82D6FC742CD99F7900C925F4 /* Launch.storyboard in Sources */ = {isa = PBXBuildFile; fileRef = 50DA11252A16A23F00236234 /* Launch.storyboard */; }; + 82D6FC752CD99F7900C925F4 /* QRCodeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C513FCB2984ACA60072348F /* QRCodeView.swift */; }; + 82D6FC762CD99F7900C925F4 /* RelayFilterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643EA5C7296B764E005081BB /* RelayFilterView.swift */; }; + 82D6FC772CD99F7900C925F4 /* SuggestedHashtagsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D783A63E2AD4E53D00658DDA /* SuggestedHashtagsView.swift */; }; + 82D6FC782CD99F7900C925F4 /* ProfileActionSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77BFA0A2AE3051200621634 /* ProfileActionSheetView.swift */; }; + 82D6FC792CD99F7900C925F4 /* damusApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DEE627F7A08100C66700 /* damusApp.swift */; }; + 82D6FC7A2CD99F7900C925F4 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CE6DEE827F7A08100C66700 /* ContentView.swift */; }; + 82D6FC7B2CD99F7900C925F4 /* TestData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C687C262A6039500092C550 /* TestData.swift */; }; + 82D6FC7C2CD99F7900C925F4 /* ContentParsing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4DD3DA2A6CA7E8005B4E85 /* ContentParsing.swift */; }; + 82D6FC7D2CD99F7900C925F4 /* NotificationFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D70A3B162B02DCE5008BD568 /* NotificationFormatter.swift */; }; + 82D6FC812CD99FC500C925F4 /* secp256k1 in Frameworks */ = {isa = PBXBuildFile; productRef = 82D6FC802CD99FC500C925F4 /* secp256k1 */; }; + 82D6FC822CD9A45D00C925F4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4CE6DEEA27F7A08200C66700 /* Assets.xcassets */; }; + 82D6FC842CD9A48500C925F4 /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 82D6FC832CD9A48500C925F4 /* Kingfisher */; }; + 82D6FC862CD9A4A600C925F4 /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 82D6FC852CD9A4A600C925F4 /* MarkdownUI */; }; + 82D6FC882CD9A4DE00C925F4 /* EmojiPicker in Frameworks */ = {isa = PBXBuildFile; productRef = 82D6FC872CD9A4DE00C925F4 /* EmojiPicker */; }; + 82D6FC8A2CD9A54600C925F4 /* SwipeActions in Frameworks */ = {isa = PBXBuildFile; productRef = 82D6FC892CD9A54600C925F4 /* SwipeActions */; }; 9609F058296E220800069BF3 /* BannerImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9609F057296E220800069BF3 /* BannerImageView.swift */; }; 9C83F89329A937B900136C08 /* TextViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C83F89229A937B900136C08 /* TextViewWrapper.swift */; }; 9CA876E229A00CEA0003B9A3 /* AttachMediaUtility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */; }; @@ -1190,6 +1667,13 @@ remoteGlobalIDString = 4CE6DEE227F7A08100C66700; remoteInfo = damus; }; + 82D6FA9F2CD9820500C925F4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4CE6DEDB27F7A08100C66700 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 82D6FA962CD9820500C925F4; + remoteInfo = "share extension"; + }; D703D7232C66E47100A400EA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 4CE6DEDB27F7A08100C66700 /* Project object */; @@ -1213,6 +1697,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( + 82D6FAA12CD9820500C925F4 /* ShareExtension.appex in Embed Foundation Extensions */, D703D7252C66E47100A400EA /* HighlighterActionExtension.appex in Embed Foundation Extensions */, D79C4C1B2AFEB061003A41B4 /* DamusNotificationService.appex in Embed Foundation Extensions */, ); @@ -1869,6 +2354,10 @@ 7C902AE22981D55B002AB16E /* ZoomableScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomableScrollView.swift; sourceTree = "<group>"; }; 7C95CAED299DCEF1009DCB67 /* KFOptionSetter+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KFOptionSetter+.swift"; sourceTree = "<group>"; }; 7CFF6316299FEFE5005D382A /* SelectableText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelectableText.swift; sourceTree = "<group>"; }; + 82D6FA972CD9820500C925F4 /* ShareExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ShareExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + 82D6FA992CD9820500C925F4 /* ShareViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareViewController.swift; sourceTree = "<group>"; }; + 82D6FA9E2CD9820500C925F4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 82D6FAA62CD9820500C925F4 /* share extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "share extension.entitlements"; sourceTree = "<group>"; }; 9609F057296E220800069BF3 /* BannerImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BannerImageView.swift; sourceTree = "<group>"; }; 9C83F89229A937B900136C08 /* TextViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewWrapper.swift; sourceTree = "<group>"; }; 9CA876E129A00CE90003B9A3 /* AttachMediaUtility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachMediaUtility.swift; sourceTree = "<group>"; }; @@ -2037,6 +2526,18 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 82D6FA942CD9820500C925F4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 82D6FC862CD9A4A600C925F4 /* MarkdownUI in Frameworks */, + 82D6FC8A2CD9A54600C925F4 /* SwipeActions in Frameworks */, + 82D6FC882CD9A4DE00C925F4 /* EmojiPicker in Frameworks */, + 82D6FC842CD9A48500C925F4 /* Kingfisher in Frameworks */, + 82D6FC812CD99FC500C925F4 /* secp256k1 in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D703D7142C66E47100A400EA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -3012,6 +3513,7 @@ 4CE6DEDA27F7A08100C66700 = { isa = PBXGroup; children = ( + 82D6FAA82CD982D500C925F4 /* share extension */, D7FB14212BE5970000398331 /* PrivacyInfo.xcprivacy */, 4C32B9362A9AD44700DC3548 /* flatbuffers */, 4C9054862A6AEB4500811EEC /* nostrdb */, @@ -3038,6 +3540,7 @@ 4CE6DEFD27F7A08200C66700 /* damusUITests.xctest */, D79C4C142AFEB061003A41B4 /* DamusNotificationService.appex */, D703D7172C66E47100A400EA /* HighlighterActionExtension.appex */, + 82D6FA972CD9820500C925F4 /* ShareExtension.appex */, ); name = Products; sourceTree = "<group>"; @@ -3266,6 +3769,16 @@ path = Extensions; sourceTree = "<group>"; }; + 82D6FAA82CD982D500C925F4 /* share extension */ = { + isa = PBXGroup; + children = ( + 82D6FA9E2CD9820500C925F4 /* Info.plist */, + 82D6FAA62CD9820500C925F4 /* share extension.entitlements */, + 82D6FA992CD9820500C925F4 /* ShareViewController.swift */, + ); + path = "share extension"; + sourceTree = "<group>"; + }; BA3759882ABCCDE30018D73B /* Camera */ = { isa = PBXGroup; children = ( @@ -3439,6 +3952,7 @@ dependencies = ( D79C4C1A2AFEB061003A41B4 /* PBXTargetDependency */, D703D7242C66E47100A400EA /* PBXTargetDependency */, + 82D6FAA02CD9820500C925F4 /* PBXTargetDependency */, ); name = damus; packageProductDependencies = ( @@ -3493,6 +4007,30 @@ productReference = 4CE6DEFD27F7A08200C66700 /* damusUITests.xctest */; productType = "com.apple.product-type.bundle.ui-testing"; }; + 82D6FA962CD9820500C925F4 /* ShareExtension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 82D6FAA52CD9820500C925F4 /* Build configuration list for PBXNativeTarget "ShareExtension" */; + buildPhases = ( + 82D6FA932CD9820500C925F4 /* Sources */, + 82D6FA942CD9820500C925F4 /* Frameworks */, + 82D6FA952CD9820500C925F4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ShareExtension; + packageProductDependencies = ( + 82D6FC802CD99FC500C925F4 /* secp256k1 */, + 82D6FC832CD9A48500C925F4 /* Kingfisher */, + 82D6FC852CD9A4A600C925F4 /* MarkdownUI */, + 82D6FC872CD9A4DE00C925F4 /* EmojiPicker */, + 82D6FC892CD9A54600C925F4 /* SwipeActions */, + ); + productName = "share extension"; + productReference = 82D6FA972CD9820500C925F4 /* ShareExtension.appex */; + productType = "com.apple.product-type.app-extension"; + }; D703D7162C66E47100A400EA /* HighlighterActionExtension */ = { isa = PBXNativeTarget; buildConfigurationList = D703D7272C66E47100A400EA /* Build configuration list for PBXNativeTarget "HighlighterActionExtension" */; @@ -3549,7 +4087,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1540; + LastSwiftUpdateCheck = 1600; LastUpgradeCheck = 1520; TargetAttributes = { 4CE6DEE227F7A08100C66700 = { @@ -3564,6 +4102,9 @@ CreatedOnToolsVersion = 13.3; TestTargetID = 4CE6DEE227F7A08100C66700; }; + 82D6FA962CD9820500C925F4 = { + CreatedOnToolsVersion = 16.0; + }; D703D7162C66E47100A400EA = { CreatedOnToolsVersion = 15.4; }; @@ -3630,6 +4171,7 @@ 4CE6DEFC27F7A08200C66700 /* damusUITests */, D79C4C132AFEB061003A41B4 /* DamusNotificationService */, D703D7162C66E47100A400EA /* HighlighterActionExtension */, + 82D6FA962CD9820500C925F4 /* ShareExtension */, ); }; /* End PBXProject section */ @@ -3670,6 +4212,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 82D6FA952CD9820500C925F4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 82D6FC822CD9A45D00C925F4 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D703D7152C66E47100A400EA /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -4258,6 +4808,483 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 82D6FA932CD9820500C925F4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 82D6FA9A2CD9820500C925F4 /* ShareViewController.swift in Sources */, + 82D6FAA92CD99F7900C925F4 /* FbConstants.swift in Sources */, + 82D6FAAA2CD99F7900C925F4 /* Offset.swift in Sources */, + 82D6FAAB2CD99F7900C925F4 /* Int+extension.swift in Sources */, + 82D6FAAC2CD99F7900C925F4 /* FlatBufferBuilder.swift in Sources */, + 82D6FAAD2CD99F7900C925F4 /* FlatbuffersErrors.swift in Sources */, + 82D6FAAE2CD99F7900C925F4 /* Verifier.swift in Sources */, + 82D6FAAF2CD99F7900C925F4 /* ByteBuffer.swift in Sources */, + 82D6FAB02CD99F7900C925F4 /* TableVerifier.swift in Sources */, + 82D6FAB12CD99F7900C925F4 /* Root.swift in Sources */, + 82D6FAB22CD99F7900C925F4 /* VeriferOptions.swift in Sources */, + 82D6FAB32CD99F7900C925F4 /* Table.swift in Sources */, + 82D6FAB42CD99F7900C925F4 /* Verifiable.swift in Sources */, + 82D6FAB52CD99F7900C925F4 /* NativeObject.swift in Sources */, + 82D6FAB62CD99F7900C925F4 /* String+extension.swift in Sources */, + 82D6FAB72CD99F7900C925F4 /* FlatBufferObject.swift in Sources */, + 82D6FAB82CD99F7900C925F4 /* Enum.swift in Sources */, + 82D6FAB92CD99F7900C925F4 /* builder.c in Sources */, + 82D6FABA2CD99F7900C925F4 /* json_parser.c in Sources */, + 82D6FABB2CD99F7900C925F4 /* emitter.c in Sources */, + 82D6FABC2CD99F7900C925F4 /* refmap.c in Sources */, + 82D6FABD2CD99F7900C925F4 /* verifier.c in Sources */, + 82D6FABE2CD99F7900C925F4 /* NdbProfile.swift in Sources */, + 82D6FABF2CD99F7900C925F4 /* NdbTagIterator.swift in Sources */, + 82D6FAC02CD99F7900C925F4 /* NdbNote.swift in Sources */, + 82D6FAC12CD99F7900C925F4 /* AsciiCharacter.swift in Sources */, + 82D6FAC22CD99F7900C925F4 /* NdbTagElem.swift in Sources */, + 82D6FAC32CD99F7900C925F4 /* Ndb.swift in Sources */, + 82D6FAC42CD99F7900C925F4 /* NdbTagsIterator.swift in Sources */, + 82D6FAC52CD99F7900C925F4 /* NdbTxn.swift in Sources */, + 82D6FAC62CD99F7900C925F4 /* nostrdb.c in Sources */, + 82D6FAC72CD99F7900C925F4 /* midl.c in Sources */, + 82D6FAC82CD99F7900C925F4 /* mdb.c in Sources */, + 82D6FAC92CD99F7900C925F4 /* NdbNote+.swift in Sources */, + 82D6FACA2CD99F7900C925F4 /* NostrScript.swift in Sources */, + 82D6FACB2CD99F7900C925F4 /* nostrscript.c in Sources */, + 82D6FACC2CD99F7900C925F4 /* error.c in Sources */, + 82D6FACD2CD99F7900C925F4 /* wasm.c in Sources */, + 82D6FACE2CD99F7900C925F4 /* damus.c in Sources */, + 82D6FACF2CD99F7900C925F4 /* utf8.c in Sources */, + 82D6FAD02CD99F7900C925F4 /* bolt11.c in Sources */, + 82D6FAD12CD99F7900C925F4 /* hash_u5.c in Sources */, + 82D6FAD22CD99F7900C925F4 /* sha256.c in Sources */, + 82D6FAD32CD99F7900C925F4 /* bech32.c in Sources */, + 82D6FAD42CD99F7900C925F4 /* bech32_util.c in Sources */, + 82D6FAD52CD99F7900C925F4 /* tal.c in Sources */, + 82D6FAD62CD99F7900C925F4 /* node_id.c in Sources */, + 82D6FAD72CD99F7900C925F4 /* mem.c in Sources */, + 82D6FAD82CD99F7900C925F4 /* hex.c in Sources */, + 82D6FAD92CD99F7900C925F4 /* amount.c in Sources */, + 82D6FADA2CD99F7900C925F4 /* take.c in Sources */, + 82D6FADB2CD99F7900C925F4 /* talstr.c in Sources */, + 82D6FADC2CD99F7900C925F4 /* list.c in Sources */, + 82D6FADD2CD99F7900C925F4 /* nostr_bech32.c in Sources */, + 82D6FADE2CD99F7900C925F4 /* ThreadReply.swift in Sources */, + 82D6FADF2CD99F7900C925F4 /* AttachedWalletNotify.swift in Sources */, + 82D6FAE02CD99F7900C925F4 /* DisplayTabBarNotify.swift in Sources */, + 82D6FAE12CD99F7900C925F4 /* BroadcastNotify.swift in Sources */, + 82D6FAE22CD99F7900C925F4 /* ComposeNotify.swift in Sources */, + 82D6FAE32CD99F7900C925F4 /* FollowedNotify.swift in Sources */, + 82D6FAE42CD99F7900C925F4 /* FollowNotify.swift in Sources */, + 82D6FAE52CD99F7900C925F4 /* LikedNotify.swift in Sources */, + 82D6FAE62CD99F7900C925F4 /* LocalNotificationNotify.swift in Sources */, + 82D6FAE72CD99F7900C925F4 /* LoginNotify.swift in Sources */, + 82D6FAE82CD99F7900C925F4 /* LogoutNotify.swift in Sources */, + 82D6FAE92CD99F7900C925F4 /* NewMutesNotify.swift in Sources */, + 82D6FAEA2CD99F7900C925F4 /* NewUnmutesNotify.swift in Sources */, + 82D6FAEB2CD99F7900C925F4 /* Notify.swift in Sources */, + 82D6FAEC2CD99F7900C925F4 /* OnlyZapsNotify.swift in Sources */, + 82D6FAED2CD99F7900C925F4 /* PostNotify.swift in Sources */, + 82D6FAEE2CD99F7900C925F4 /* PresentSheetNotify.swift in Sources */, + 82D6FAEF2CD99F7900C925F4 /* ProfileUpdatedNotify.swift in Sources */, + 82D6FAF02CD99F7900C925F4 /* ReportNotify.swift in Sources */, + 82D6FAF12CD99F7900C925F4 /* ScrollToTopNotify.swift in Sources */, + 82D6FAF22CD99F7900C925F4 /* SwitchedTimelineNotify.swift in Sources */, + 82D6FAF32CD99F7900C925F4 /* UnfollowedNotify.swift in Sources */, + 82D6FAF42CD99F7900C925F4 /* UnfollowNotify.swift in Sources */, + 82D6FAF52CD99F7900C925F4 /* UpdateStatsNotify.swift in Sources */, + 82D6FAF62CD99F7900C925F4 /* ZappingNotify.swift in Sources */, + 82D6FAF72CD99F7900C925F4 /* MuteNotify.swift in Sources */, + 82D6FAF82CD99F7900C925F4 /* RelaysChangedNotify.swift in Sources */, + 82D6FAF92CD99F7900C925F4 /* MuteThreadNotify.swift in Sources */, + 82D6FAFA2CD99F7900C925F4 /* UnmuteThreadNotify.swift in Sources */, + 82D6FAFB2CD99F7900C925F4 /* ReconnectRelaysNotify.swift in Sources */, + 82D6FAFC2CD99F7900C925F4 /* PurpleAccountUpdateNotify.swift in Sources */, + 82D6FAFD2CD99F7900C925F4 /* IdType.swift in Sources */, + 82D6FAFE2CD99F7900C925F4 /* Pubkey.swift in Sources */, + 82D6FAFF2CD99F7900C925F4 /* NoteId.swift in Sources */, + 82D6FB002CD99F7900C925F4 /* Referenced.swift in Sources */, + 82D6FB012CD99F7900C925F4 /* Block.swift in Sources */, + 82D6FB022CD99F7900C925F4 /* MigratedTypes.swift in Sources */, + 82D6FB032CD99F7900C925F4 /* DamusDuration.swift in Sources */, + 82D6FB042CD99F7900C925F4 /* SwipeToDismiss.swift in Sources */, + 82D6FB052CD99F7900C925F4 /* MusicController.swift in Sources */, + 82D6FB062CD99F7900C925F4 /* UserStatusView.swift in Sources */, + 82D6FB072CD99F7900C925F4 /* UserStatus.swift in Sources */, + 82D6FB082CD99F7900C925F4 /* UserStatusSheet.swift in Sources */, + 82D6FB092CD99F7900C925F4 /* SearchHeaderView.swift in Sources */, + 82D6FB0A2CD99F7900C925F4 /* DamusGradient.swift in Sources */, + 82D6FB0B2CD99F7900C925F4 /* AlbyGradient.swift in Sources */, + 82D6FB0C2CD99F7900C925F4 /* GoldSupportGradient.swift in Sources */, + 82D6FB0D2CD99F7900C925F4 /* PinkGradient.swift in Sources */, + 82D6FB0E2CD99F7900C925F4 /* GrayGradient.swift in Sources */, + 82D6FB0F2CD99F7900C925F4 /* DamusLogoGradient.swift in Sources */, + 82D6FB102CD99F7900C925F4 /* DamusBackground.swift in Sources */, + 82D6FB112CD99F7900C925F4 /* DamusLightGradient.swift in Sources */, + 82D6FB122CD99F7900C925F4 /* MutinyGradient.swift in Sources */, + 82D6FB132CD99F7900C925F4 /* Shimmer.swift in Sources */, + 82D6FB142CD99F7900C925F4 /* EndBlock.swift in Sources */, + 82D6FB152CD99F7900C925F4 /* ImageCarousel.swift in Sources */, + 82D6FB162CD99F7900C925F4 /* InvoicesView.swift in Sources */, + 82D6FB172CD99F7900C925F4 /* InvoiceView.swift in Sources */, + 82D6FB182CD99F7900C925F4 /* NIP05Badge.swift in Sources */, + 82D6FB192CD99F7900C925F4 /* Reposted.swift in Sources */, + 82D6FB1A2CD99F7900C925F4 /* WebsiteLink.swift in Sources */, + 82D6FB1B2CD99F7900C925F4 /* Highlight.swift in Sources */, + 82D6FB1C2CD99F7900C925F4 /* CustomPicker.swift in Sources */, + 82D6FB1D2CD99F7900C925F4 /* UserView.swift in Sources */, + 82D6FB1E2CD99F7900C925F4 /* ZoomableScrollView.swift in Sources */, + 82D6FB1F2CD99F7900C925F4 /* NoteZapButton.swift in Sources */, + 82D6FB202CD99F7900C925F4 /* TranslateView.swift in Sources */, + 82D6FB212CD99F7900C925F4 /* SelectableText.swift in Sources */, + 82D6FB222CD99F7900C925F4 /* DamusColors.swift in Sources */, + 82D6FB232CD99F7900C925F4 /* ThiccDivider.swift in Sources */, + 82D6FB242CD99F7900C925F4 /* IconLabel.swift in Sources */, + 82D6FB252CD99F7900C925F4 /* TruncatedText.swift in Sources */, + 82D6FB262CD99F7900C925F4 /* SupporterBadge.swift in Sources */, + 82D6FB272CD99F7900C925F4 /* GradientButtonStyle.swift in Sources */, + 82D6FB282CD99F7900C925F4 /* NeutralButtonStyle.swift in Sources */, + 82D6FB292CD99F7900C925F4 /* URIParsing.swift in Sources */, + 82D6FB2A2CD99F7900C925F4 /* VersionInfo.swift in Sources */, + 82D6FB2B2CD99F7900C925F4 /* WalletConnect.swift in Sources */, + 82D6FB2C2CD99F7900C925F4 /* ImageMetadata.swift in Sources */, + 82D6FB2D2CD99F7900C925F4 /* ImageProcessing.swift in Sources */, + 82D6FB2E2CD99F7900C925F4 /* BlurHashEncode.swift in Sources */, + 82D6FB2F2CD99F7900C925F4 /* BlurHashDecode.swift in Sources */, + 82D6FB302CD99F7900C925F4 /* PostBox.swift in Sources */, + 82D6FB312CD99F7900C925F4 /* KFOptionSetter+.swift in Sources */, + 82D6FB322CD99F7900C925F4 /* FillAndStroke.swift in Sources */, + 82D6FB332CD99F7900C925F4 /* Array.swift in Sources */, + 82D6FB342CD99F7900C925F4 /* VectorMath.swift in Sources */, + 82D6FB352CD99F7900C925F4 /* OffsetExtension.swift in Sources */, + 82D6FB362CD99F7900C925F4 /* RelayFilters.swift in Sources */, + 82D6FB372CD99F7900C925F4 /* RelayModelCache.swift in Sources */, + 82D6FB382CD99F7900C925F4 /* RelayBootstrap.swift in Sources */, + 82D6FB392CD99F7900C925F4 /* RelayModel.swift in Sources */, + 82D6FB3A2CD99F7900C925F4 /* AnyCodable.swift in Sources */, + 82D6FB3B2CD99F7900C925F4 /* AnyDecodable.swift in Sources */, + 82D6FB3C2CD99F7900C925F4 /* AnyEncodable.swift in Sources */, + 82D6FB3D2CD99F7900C925F4 /* Zap.swift in Sources */, + 82D6FB3E2CD99F7900C925F4 /* NIPURLBuilder.swift in Sources */, + 82D6FB3F2CD99F7900C925F4 /* TimeAgo.swift in Sources */, + 82D6FB402CD99F7900C925F4 /* Parser.swift in Sources */, + 82D6FB412CD99F7900C925F4 /* InsertSort.swift in Sources */, + 82D6FB422CD99F7900C925F4 /* Keys.swift in Sources */, + 82D6FB432CD99F7900C925F4 /* KeychainStorage.swift in Sources */, + 82D6FB442CD99F7900C925F4 /* Bech32.swift in Sources */, + 82D6FB452CD99F7900C925F4 /* InputDismissKeyboard.swift in Sources */, + 82D6FB462CD99F7900C925F4 /* Constants.swift in Sources */, + 82D6FB472CD99F7900C925F4 /* LinkView.swift in Sources */, + 82D6FB482CD99F7900C925F4 /* PreviewCache.swift in Sources */, + 82D6FB492CD99F7900C925F4 /* Theme.swift in Sources */, + 82D6FB4A2CD99F7900C925F4 /* NIP05.swift in Sources */, + 82D6FB4B2CD99F7900C925F4 /* Lists.swift in Sources */, + 82D6FB4C2CD99F7900C925F4 /* Bech32Object.swift in Sources */, + 82D6FB4D2CD99F7900C925F4 /* CoreSVG.swift in Sources */, + 82D6FB4E2CD99F7900C925F4 /* AccountDeletion.swift in Sources */, + 82D6FB4F2CD99F7900C925F4 /* LNUrlPayRequest.swift in Sources */, + 82D6FB502CD99F7900C925F4 /* Zaps.swift in Sources */, + 82D6FB512CD99F7900C925F4 /* LNUrls.swift in Sources */, + 82D6FB522CD99F7900C925F4 /* Translator.swift in Sources */, + 82D6FB532CD99F7900C925F4 /* Debouncer.swift in Sources */, + 82D6FB542CD99F7900C925F4 /* EventHolder.swift in Sources */, + 82D6FB552CD99F7900C925F4 /* LocalizationUtil.swift in Sources */, + 82D6FB562CD99F7900C925F4 /* EventCache.swift in Sources */, + 82D6FB572CD99F7900C925F4 /* DisplayName.swift in Sources */, + 82D6FB582CD99F7900C925F4 /* DebouncedOnChange.swift in Sources */, + 82D6FB592CD99F7900C925F4 /* ReplyCounter.swift in Sources */, + 82D6FB5A2CD99F7900C925F4 /* CompatibleAttribute.swift in Sources */, + 82D6FB5B2CD99F7900C925F4 /* Hashtags.swift in Sources */, + 82D6FB5C2CD99F7900C925F4 /* LocalNotification.swift in Sources */, + 82D6FB5D2CD99F7900C925F4 /* StringCodable.swift in Sources */, + 82D6FB5E2CD99F7900C925F4 /* CredentialHandler.swift in Sources */, + 82D6FB5F2CD99F7900C925F4 /* KeyboardVisible.swift in Sources */, + 82D6FB602CD99F7900C925F4 /* StringUtil.swift in Sources */, + 82D6FB612CD99F7900C925F4 /* Router.swift in Sources */, + 82D6FB622CD99F7900C925F4 /* Log.swift in Sources */, + 82D6FB632CD99F7900C925F4 /* AVPlayer+Additions.swift in Sources */, + 82D6FB642CD99F7900C925F4 /* SequenceUtils.swift in Sources */, + 82D6FB652CD99F7900C925F4 /* CollectionExtension.swift in Sources */, + 82D6FB662CD99F7900C925F4 /* ZapDataModel.swift in Sources */, + 82D6FB672CD99F7900C925F4 /* Zaps+.swift in Sources */, + 82D6FB682CD99F7900C925F4 /* WalletConnect+.swift in Sources */, + 82D6FB692CD99F7900C925F4 /* DamusPurpleNotificationManagement.swift in Sources */, + 82D6FB6A2CD99F7900C925F4 /* DamusPurple.swift in Sources */, + 82D6FB6B2CD99F7900C925F4 /* StoreObserver.swift in Sources */, + 82D6FB6C2CD99F7900C925F4 /* DamusPurpleURL.swift in Sources */, + 82D6FB6D2CD99F7900C925F4 /* DamusPurpleEnvironment.swift in Sources */, + 82D6FB6E2CD99F7900C925F4 /* PurpleStoreKitManager.swift in Sources */, + 82D6FB6F2CD99F7900C925F4 /* CameraService+Extensions.swift in Sources */, + 82D6FB702CD99F7900C925F4 /* ImageResizer.swift in Sources */, + 82D6FB712CD99F7900C925F4 /* PhotoCaptureProcessor.swift in Sources */, + 82D6FB722CD99F7900C925F4 /* VideoCaptureProcessor.swift in Sources */, + 82D6FB732CD99F7900C925F4 /* CustomizeZapModel.swift in Sources */, + 82D6FB742CD99F7900C925F4 /* EventGroup.swift in Sources */, + 82D6FB752CD99F7900C925F4 /* ZapGroup.swift in Sources */, + 82D6FB762CD99F7900C925F4 /* NotificationStatusModel.swift in Sources */, + 82D6FB772CD99F7900C925F4 /* ThreadModel.swift in Sources */, + 82D6FB782CD99F7900C925F4 /* ReplyMap.swift in Sources */, + 82D6FB792CD99F7900C925F4 /* ProfileModel.swift in Sources */, + 82D6FB7A2CD99F7900C925F4 /* ActionBarModel.swift in Sources */, + 82D6FB7B2CD99F7900C925F4 /* LikeCounter.swift in Sources */, + 82D6FB7C2CD99F7900C925F4 /* Liked.swift in Sources */, + 82D6FB7D2CD99F7900C925F4 /* DamusState.swift in Sources */, + 82D6FB7E2CD99F7900C925F4 /* Mentions.swift in Sources */, + 82D6FB7F2CD99F7900C925F4 /* ProfileUpdate.swift in Sources */, + 82D6FB802CD99F7900C925F4 /* Post.swift in Sources */, + 82D6FB812CD99F7900C925F4 /* PostBlock.swift in Sources */, + 82D6FB822CD99F7900C925F4 /* Reply.swift in Sources */, + 82D6FB832CD99F7900C925F4 /* SearchModel.swift in Sources */, + 82D6FB842CD99F7900C925F4 /* NostrFilter+Hashable.swift in Sources */, + 82D6FB852CD99F7900C925F4 /* Contacts.swift in Sources */, + 82D6FB862CD99F7900C925F4 /* CreateAccountModel.swift in Sources */, + 82D6FB872CD99F7900C925F4 /* HomeModel.swift in Sources */, + 82D6FB882CD99F7900C925F4 /* SignalModel.swift in Sources */, + 82D6FB892CD99F7900C925F4 /* FollowTarget.swift in Sources */, + 82D6FB8A2CD99F7900C925F4 /* BookmarksManager.swift in Sources */, + 82D6FB8B2CD99F7900C925F4 /* EventsModel.swift in Sources */, + 82D6FB8C2CD99F7900C925F4 /* FollowingModel.swift in Sources */, + 82D6FB8D2CD99F7900C925F4 /* FollowersModel.swift in Sources */, + 82D6FB8E2CD99F7900C925F4 /* SearchHomeModel.swift in Sources */, + 82D6FB8F2CD99F7900C925F4 /* DirectMessagesModel.swift in Sources */, + 82D6FB902CD99F7900C925F4 /* DirectMessageModel.swift in Sources */, + 82D6FB912CD99F7900C925F4 /* UserSettingsStore.swift in Sources */, + 82D6FB922CD99F7900C925F4 /* Wallet.swift in Sources */, + 82D6FB932CD99F7900C925F4 /* Report.swift in Sources */, + 82D6FB942CD99F7900C925F4 /* LibreTranslateServer.swift in Sources */, + 82D6FB952CD99F7900C925F4 /* TranslationService.swift in Sources */, + 82D6FB962CD99F7900C925F4 /* DeepLPlan.swift in Sources */, + 82D6FB972CD99F7900C925F4 /* ZapsModel.swift in Sources */, + 82D6FB982CD99F7900C925F4 /* DraftsModel.swift in Sources */, + 82D6FB992CD99F7900C925F4 /* NotificationsModel.swift in Sources */, + 82D6FB9A2CD99F7900C925F4 /* ImageUploadModel.swift in Sources */, + 82D6FB9B2CD99F7900C925F4 /* MutedThreadsManager.swift in Sources */, + 82D6FB9C2CD99F7900C925F4 /* WalletModel.swift in Sources */, + 82D6FB9D2CD99F7900C925F4 /* ZapButtonModel.swift in Sources */, + 82D6FB9E2CD99F7900C925F4 /* ContentFilters.swift in Sources */, + 82D6FB9F2CD99F7900C925F4 /* DamusCacheManager.swift in Sources */, + 82D6FBA02CD99F7900C925F4 /* NotificationsManager.swift in Sources */, + 82D6FBA12CD99F7900C925F4 /* Contacts+.swift in Sources */, + 82D6FBA22CD99F7900C925F4 /* ZapType.swift in Sources */, + 82D6FBA32CD99F7900C925F4 /* NewEventsBits.swift in Sources */, + 82D6FBA42CD99F7900C925F4 /* FriendFilter.swift in Sources */, + 82D6FBA52CD99F7900C925F4 /* MediaUploader.swift in Sources */, + 82D6FBA62CD99F7900C925F4 /* FollowState.swift in Sources */, + 82D6FBA72CD99F7900C925F4 /* NoteContent.swift in Sources */, + 82D6FBA82CD99F7900C925F4 /* LongformEvent.swift in Sources */, + 82D6FBA92CD99F7900C925F4 /* DamusUserDefaults.swift in Sources */, + 82D6FBAA2CD99F7900C925F4 /* HeadlessDamusState.swift in Sources */, + 82D6FBAB2CD99F7900C925F4 /* MuteItem.swift in Sources */, + 82D6FBAC2CD99F7900C925F4 /* MutelistManager.swift in Sources */, + 82D6FBAD2CD99F7900C925F4 /* PushNotificationClient.swift in Sources */, + 82D6FBAE2CD99F7900C925F4 /* HighlightEvent.swift in Sources */, + 82D6FBAF2CD99F7900C925F4 /* CommentItem.swift in Sources */, + 82D6FBB02CD99F7900C925F4 /* RelayConnection.swift in Sources */, + 82D6FBB12CD99F7900C925F4 /* RelayLog.swift in Sources */, + 82D6FBB22CD99F7900C925F4 /* Nostr.swift in Sources */, + 82D6FBB32CD99F7900C925F4 /* NostrFilter.swift in Sources */, + 82D6FBB42CD99F7900C925F4 /* NostrResponse.swift in Sources */, + 82D6FBB52CD99F7900C925F4 /* NostrEvent.swift in Sources */, + 82D6FBB62CD99F7900C925F4 /* Nip98HTTPAuth.swift in Sources */, + 82D6FBB72CD99F7900C925F4 /* Relay.swift in Sources */, + 82D6FBB82CD99F7900C925F4 /* RelayPool.swift in Sources */, + 82D6FBB92CD99F7900C925F4 /* ProofOfWork.swift in Sources */, + 82D6FBBA2CD99F7900C925F4 /* NostrRequest.swift in Sources */, + 82D6FBBB2CD99F7900C925F4 /* Profiles.swift in Sources */, + 82D6FBBC2CD99F7900C925F4 /* NostrKind.swift in Sources */, + 82D6FBBD2CD99F7900C925F4 /* NostrLink.swift in Sources */, + 82D6FBBE2CD99F7900C925F4 /* WebSocket.swift in Sources */, + 82D6FBBF2CD99F7900C925F4 /* ReferencedId.swift in Sources */, + 82D6FBC02CD99F7900C925F4 /* Id.swift in Sources */, + 82D6FBC12CD99F7900C925F4 /* RelayURL.swift in Sources */, + 82D6FBC22CD99F7900C925F4 /* NostrEvent+.swift in Sources */, + 82D6FBC32CD99F7900C925F4 /* NIP98AuthenticatedRequest.swift in Sources */, + 82D6FBC42CD99F7900C925F4 /* NostrAuth.swift in Sources */, + 82D6FBC52CD99F7900C925F4 /* MakeZapRequest.swift in Sources */, + 82D6FBC62CD99F7900C925F4 /* KFClickable.swift in Sources */, + 82D6FBC72CD99F7900C925F4 /* ChatEventView.swift in Sources */, + 82D6FBC82CD99F7900C925F4 /* ReplyQuoteView.swift in Sources */, + 82D6FBC92CD99F7900C925F4 /* ChatroomThreadView.swift in Sources */, + 82D6FBCA2CD99F7900C925F4 /* ChatBubbleView.swift in Sources */, + 82D6FBCB2CD99F7900C925F4 /* VisibilityTracker.swift in Sources */, + 82D6FBCC2CD99F7900C925F4 /* CameraPreview.swift in Sources */, + 82D6FBCD2CD99F7900C925F4 /* CameraController.swift in Sources */, + 82D6FBCE2CD99F7900C925F4 /* OnboardingSuggestionsView.swift in Sources */, + 82D6FBCF2CD99F7900C925F4 /* SuggestedUserView.swift in Sources */, + 82D6FBD02CD99F7900C925F4 /* SuggestedUsersViewModel.swift in Sources */, + 82D6FBD12CD99F7900C925F4 /* LoadScript.swift in Sources */, + 82D6FBD22CD99F7900C925F4 /* CodeScanner.swift in Sources */, + 82D6FBD32CD99F7900C925F4 /* ScannerCoordinator.swift in Sources */, + 82D6FBD42CD99F7900C925F4 /* ScannerViewController.swift in Sources */, + 82D6FBD52CD99F7900C925F4 /* ConnectWalletView.swift in Sources */, + 82D6FBD62CD99F7900C925F4 /* WalletView.swift in Sources */, + 82D6FBD72CD99F7900C925F4 /* NWCScannerView.swift in Sources */, + 82D6FBD82CD99F7900C925F4 /* FriendsButton.swift in Sources */, + 82D6FBD92CD99F7900C925F4 /* GradientFollowButton.swift in Sources */, + 82D6FBDA2CD99F7900C925F4 /* AlbyButton.swift in Sources */, + 82D6FBDB2CD99F7900C925F4 /* MutinyButton.swift in Sources */, + 82D6FBDC2CD99F7900C925F4 /* DamusVideoPlayer.swift in Sources */, + 82D6FBDD2CD99F7900C925F4 /* DamusVideoPlayerViewModel.swift in Sources */, + 82D6FBDE2CD99F7900C925F4 /* VideoController.swift in Sources */, + 82D6FBDF2CD99F7900C925F4 /* DamusAVPlayerView.swift in Sources */, + 82D6FBE02CD99F7900C925F4 /* ReactionsSettingsView.swift in Sources */, + 82D6FBE12CD99F7900C925F4 /* NotificationSettingsView.swift in Sources */, + 82D6FBE22CD99F7900C925F4 /* AppearanceSettingsView.swift in Sources */, + 82D6FBE32CD99F7900C925F4 /* KeySettingsView.swift in Sources */, + 82D6FBE42CD99F7900C925F4 /* ZapSettingsView.swift in Sources */, + 82D6FBE52CD99F7900C925F4 /* TranslationSettingsView.swift in Sources */, + 82D6FBE62CD99F7900C925F4 /* SearchSettingsView.swift in Sources */, + 82D6FBE72CD99F7900C925F4 /* DeveloperSettingsView.swift in Sources */, + 82D6FBE82CD99F7900C925F4 /* FirstAidSettingsView.swift in Sources */, + 82D6FBE92CD99F7900C925F4 /* ImageContextMenuModifier.swift in Sources */, + 82D6FBEA2CD99F7900C925F4 /* FullScreenCarouselView.swift in Sources */, + 82D6FBEB2CD99F7900C925F4 /* ProfilePicImageView.swift in Sources */, + 82D6FBEC2CD99F7900C925F4 /* ImageContainerView.swift in Sources */, + 82D6FBED2CD99F7900C925F4 /* MediaView.swift in Sources */, + 82D6FBEE2CD99F7900C925F4 /* PurpleViewPrimitives.swift in Sources */, + 82D6FBEF2CD99F7900C925F4 /* MarketingContentView.swift in Sources */, + 82D6FBF02CD99F7900C925F4 /* LogoView.swift in Sources */, + 82D6FBF12CD99F7900C925F4 /* IAPProductStateView.swift in Sources */, + 82D6FBF22CD99F7900C925F4 /* PurpleBackdrop.swift in Sources */, + 82D6FBF32CD99F7900C925F4 /* DamusPurpleView.swift in Sources */, + 82D6FBF42CD99F7900C925F4 /* DamusPurpleWelcomeView.swift in Sources */, + 82D6FBF52CD99F7900C925F4 /* DamusPurpleTranslationSetupView.swift in Sources */, + 82D6FBF62CD99F7900C925F4 /* DamusPurpleURLSheetView.swift in Sources */, + 82D6FBF72CD99F7900C925F4 /* DamusPurpleVerifyNpubView.swift in Sources */, + 82D6FBF82CD99F7900C925F4 /* DamusPurpleAccountView.swift in Sources */, + 82D6FBF92CD99F7900C925F4 /* DamusPurpleNewUserOnboardingView.swift in Sources */, + 82D6FBFA2CD99F7900C925F4 /* SearchingEventView.swift in Sources */, + 82D6FBFB2CD99F7900C925F4 /* PullDownSearch.swift in Sources */, + 82D6FBFC2CD99F7900C925F4 /* NDBSearchView.swift in Sources */, + 82D6FBFD2CD99F7900C925F4 /* NotificationsView.swift in Sources */, + 82D6FBFE2CD99F7900C925F4 /* EventGroupView.swift in Sources */, + 82D6FBFF2CD99F7900C925F4 /* NotificationItemView.swift in Sources */, + 82D6FC002CD99F7900C925F4 /* ProfilePicturesView.swift in Sources */, + 82D6FC012CD99F7900C925F4 /* DamusAppNotificationView.swift in Sources */, + 82D6FC022CD99F7900C925F4 /* InnerTimelineView.swift in Sources */, + 82D6FC032CD99F7900C925F4 /* PostingTimelineView.swift in Sources */, + 82D6FC042CD99F7900C925F4 /* ZapsView.swift in Sources */, + 82D6FC052CD99F7900C925F4 /* CustomizeZapView.swift in Sources */, + 82D6FC062CD99F7900C925F4 /* ZapTypePicker.swift in Sources */, + 82D6FC072CD99F7900C925F4 /* ZapUserView.swift in Sources */, + 82D6FC082CD99F7900C925F4 /* ProfileZapLinkView.swift in Sources */, + 82D6FC092CD99F7900C925F4 /* AboutView.swift in Sources */, + 82D6FC0A2CD99F7900C925F4 /* ProfileName.swift in Sources */, + 82D6FC0B2CD99F7900C925F4 /* ProfilePictureSelector.swift in Sources */, + 82D6FC0C2CD99F7900C925F4 /* EditMetadataView.swift in Sources */, + 82D6FC0D2CD99F7900C925F4 /* EditPictureControl.swift in Sources */, + 82D6FC0E2CD99F7900C925F4 /* ProfilePicView.swift in Sources */, + 82D6FC0F2CD99F7900C925F4 /* ProfileView.swift in Sources */, + 82D6FC102CD99F7900C925F4 /* ProfileNameView.swift in Sources */, + 82D6FC112CD99F7900C925F4 /* MaybeAnonPfpView.swift in Sources */, + 82D6FC122CD99F7900C925F4 /* EventProfileName.swift in Sources */, + 82D6FC132CD99F7900C925F4 /* FriendIcon.swift in Sources */, + 82D6FC142CD99F7900C925F4 /* CondensedProfilePicturesView.swift in Sources */, + 82D6FC152CD99F7900C925F4 /* ProfileEditButton.swift in Sources */, + 82D6FC162CD99F7900C925F4 /* RelayPaidDetail.swift in Sources */, + 82D6FC172CD99F7900C925F4 /* RelayAuthenticationDetail.swift in Sources */, + 82D6FC182CD99F7900C925F4 /* RelaySoftwareDetail.swift in Sources */, + 82D6FC192CD99F7900C925F4 /* RelayAdminDetail.swift in Sources */, + 82D6FC1A2CD99F7900C925F4 /* RelayNipList.swift in Sources */, + 82D6FC1B2CD99F7900C925F4 /* RelayView.swift in Sources */, + 82D6FC1C2CD99F7900C925F4 /* RelayConfigView.swift in Sources */, + 82D6FC1D2CD99F7900C925F4 /* RelayDetailView.swift in Sources */, + 82D6FC1E2CD99F7900C925F4 /* RelayToggle.swift in Sources */, + 82D6FC1F2CD99F7900C925F4 /* RelayStatusView.swift in Sources */, + 82D6FC202CD99F7900C925F4 /* RelayType.swift in Sources */, + 82D6FC212CD99F7900C925F4 /* SignalView.swift in Sources */, + 82D6FC222CD99F7900C925F4 /* RelayPicView.swift in Sources */, + 82D6FC232CD99F7900C925F4 /* UserSearch.swift in Sources */, + 82D6FC242CD99F7900C925F4 /* AddMuteItemView.swift in Sources */, + 82D6FC252CD99F7900C925F4 /* MuteDurationMenu.swift in Sources */, + 82D6FC262CD99F7900C925F4 /* MutelistView.swift in Sources */, + 82D6FC272CD99F7900C925F4 /* HighlightView.swift in Sources */, + 82D6FC282CD99F7900C925F4 /* HighlightDescription.swift in Sources */, + 82D6FC292CD99F7900C925F4 /* HighlightLink.swift in Sources */, + 82D6FC2A2CD99F7900C925F4 /* HighlightEventRef.swift in Sources */, + 82D6FC2B2CD99F7900C925F4 /* HighlightDraftContentView.swift in Sources */, + 82D6FC2C2CD99F7900C925F4 /* TimeDot.swift in Sources */, + 82D6FC2D2CD99F7900C925F4 /* EventTop.swift in Sources */, + 82D6FC2E2CD99F7900C925F4 /* ReplyDescription.swift in Sources */, + 82D6FC2F2CD99F7900C925F4 /* RelativeTime.swift in Sources */, + 82D6FC302CD99F7900C925F4 /* ReplyPart.swift in Sources */, + 82D6FC312CD99F7900C925F4 /* ProxyView.swift in Sources */, + 82D6FC322CD99F7900C925F4 /* SelectedEventView.swift in Sources */, + 82D6FC332CD99F7900C925F4 /* EventBody.swift in Sources */, + 82D6FC342CD99F7900C925F4 /* BuilderEventView.swift in Sources */, + 82D6FC352CD99F7900C925F4 /* EventProfile.swift in Sources */, + 82D6FC362CD99F7900C925F4 /* EventMenu.swift in Sources */, + 82D6FC372CD99F7900C925F4 /* EventMutingContainerView.swift in Sources */, + 82D6FC382CD99F7900C925F4 /* ZapEvent.swift in Sources */, + 82D6FC392CD99F7900C925F4 /* TextEvent.swift in Sources */, + 82D6FC3A2CD99F7900C925F4 /* WideEventView.swift in Sources */, + 82D6FC3B2CD99F7900C925F4 /* LongformView.swift in Sources */, + 82D6FC3C2CD99F7900C925F4 /* LongformPreview.swift in Sources */, + 82D6FC3D2CD99F7900C925F4 /* EventShell.swift in Sources */, + 82D6FC3E2CD99F7900C925F4 /* MentionView.swift in Sources */, + 82D6FC3F2CD99F7900C925F4 /* EventLoaderView.swift in Sources */, + 82D6FC402CD99F7900C925F4 /* RepostView.swift in Sources */, + 82D6FC412CD99F7900C925F4 /* RepostedEvent.swift in Sources */, + 82D6FC422CD99F7900C925F4 /* QuoteRepostsView.swift in Sources */, + 82D6FC432CD99F7900C925F4 /* ReactionView.swift in Sources */, + 82D6FC442CD99F7900C925F4 /* EventActionBar.swift in Sources */, + 82D6FC452CD99F7900C925F4 /* EventDetailBar.swift in Sources */, + 82D6FC462CD99F7900C925F4 /* ShareAction.swift in Sources */, + 82D6FC472CD99F7900C925F4 /* RepostAction.swift in Sources */, + 82D6FC482CD99F7900C925F4 /* ShareActionButton.swift in Sources */, + 82D6FC492CD99F7900C925F4 /* BigButton.swift in Sources */, + 82D6FC4A2CD99F7900C925F4 /* AddRelayView.swift in Sources */, + 82D6FC4B2CD99F7900C925F4 /* BlocksView.swift in Sources */, + 82D6FC4C2CD99F7900C925F4 /* BookmarksView.swift in Sources */, + 82D6FC4D2CD99F7900C925F4 /* CarouselView.swift in Sources */, + 82D6FC4E2CD99F7900C925F4 /* ConfigView.swift in Sources */, + 82D6FC4F2CD99F7900C925F4 /* CreateAccountView.swift in Sources */, + 82D6FC502CD99F7900C925F4 /* DirectMessagesView.swift in Sources */, + 82D6FC512CD99F7900C925F4 /* DMChatView.swift in Sources */, + 82D6FC522CD99F7900C925F4 /* DMView.swift in Sources */, + 82D6FC532CD99F7900C925F4 /* EmptyTimelineView.swift in Sources */, + 82D6FC542CD99F7900C925F4 /* EmptyUserSearchView.swift in Sources */, + 82D6FC552CD99F7900C925F4 /* EventView.swift in Sources */, + 82D6FC562CD99F7900C925F4 /* EventDetailView.swift in Sources */, + 82D6FC572CD99F7900C925F4 /* FollowButtonView.swift in Sources */, + 82D6FC582CD99F7900C925F4 /* FollowingView.swift in Sources */, + 82D6FC592CD99F7900C925F4 /* LoginView.swift in Sources */, + 82D6FC5A2CD99F7900C925F4 /* QRScanNSECView.swift in Sources */, + 82D6FC5B2CD99F7900C925F4 /* NoteContentView.swift in Sources */, + 82D6FC5C2CD99F7900C925F4 /* PostButton.swift in Sources */, + 82D6FC5D2CD99F7900C925F4 /* PostView.swift in Sources */, + 82D6FC5E2CD99F7900C925F4 /* AttachMediaUtility.swift in Sources */, + 82D6FC5F2CD99F7900C925F4 /* MediaPicker.swift in Sources */, + 82D6FC602CD99F7900C925F4 /* TextViewWrapper.swift in Sources */, + 82D6FC612CD99F7900C925F4 /* MainTabView.swift in Sources */, + 82D6FC622CD99F7900C925F4 /* PubkeyView.swift in Sources */, + 82D6FC632CD99F7900C925F4 /* ReplyView.swift in Sources */, + 82D6FC642CD99F7900C925F4 /* ParticipantsView.swift in Sources */, + 82D6FC652CD99F7900C925F4 /* SaveKeysView.swift in Sources */, + 82D6FC662CD99F7900C925F4 /* SearchHomeView.swift in Sources */, + 82D6FC672CD99F7900C925F4 /* SearchResultsView.swift in Sources */, + 82D6FC682CD99F7900C925F4 /* SearchView.swift in Sources */, + 82D6FC692CD99F7900C925F4 /* SelectWalletView.swift in Sources */, + 82D6FC6A2CD99F7900C925F4 /* SetupView.swift in Sources */, + 82D6FC6B2CD99F7900C925F4 /* ThreadView.swift in Sources */, + 82D6FC6C2CD99F7900C925F4 /* TimelineView.swift in Sources */, + 82D6FC6D2CD99F7900C925F4 /* UserRelaysView.swift in Sources */, + 82D6FC6E2CD99F7900C925F4 /* SideMenuView.swift in Sources */, + 82D6FC6F2CD99F7900C925F4 /* BannerImageView.swift in Sources */, + 82D6FC702CD99F7900C925F4 /* ReactionsView.swift in Sources */, + 82D6FC712CD99F7900C925F4 /* ReportView.swift in Sources */, + 82D6FC722CD99F7900C925F4 /* EULAView.swift in Sources */, + 82D6FC732CD99F7900C925F4 /* RepostsView.swift in Sources */, + 82D6FC742CD99F7900C925F4 /* Launch.storyboard in Sources */, + 82D6FC752CD99F7900C925F4 /* QRCodeView.swift in Sources */, + 82D6FC762CD99F7900C925F4 /* RelayFilterView.swift in Sources */, + 82D6FC772CD99F7900C925F4 /* SuggestedHashtagsView.swift in Sources */, + 82D6FC782CD99F7900C925F4 /* ProfileActionSheetView.swift in Sources */, + 82D6FC792CD99F7900C925F4 /* damusApp.swift in Sources */, + 82D6FC7A2CD99F7900C925F4 /* ContentView.swift in Sources */, + 82D6FC7B2CD99F7900C925F4 /* TestData.swift in Sources */, + 82D6FC7C2CD99F7900C925F4 /* ContentParsing.swift in Sources */, + 82D6FC7D2CD99F7900C925F4 /* NotificationFormatter.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; D703D7132C66E47100A400EA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -4889,6 +5916,11 @@ target = 4CE6DEE227F7A08100C66700 /* damus */; targetProxy = 4CE6DEFE27F7A08200C66700 /* PBXContainerItemProxy */; }; + 82D6FAA02CD9820500C925F4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 82D6FA962CD9820500C925F4 /* ShareExtension */; + targetProxy = 82D6FA9F2CD9820500C925F4 /* PBXContainerItemProxy */; + }; D703D7242C66E47100A400EA /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = D703D7162C66E47100A400EA /* HighlighterActionExtension */; @@ -5332,6 +6364,77 @@ }; name = Release; }; + 82D6FAA22CD9820500C925F4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_ENTITLEMENTS = "share extension/share extension.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = XK7H4JAB3D; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "share extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "share extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.jb55.damus2.share-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "damus-c/damus-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 82D6FAA32CD9820500C925F4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CODE_SIGN_ENTITLEMENTS = "share extension/share extension.entitlements"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = XK7H4JAB3D; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = "share extension/Info.plist"; + INFOPLIST_KEY_CFBundleDisplayName = "share extension"; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.jb55.damus2.share-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTS_MACCATALYST = YES; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OBJC_BRIDGING_HEADER = "damus-c/damus-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; D703D7282C66E47100A400EA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -5505,6 +6608,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 82D6FAA52CD9820500C925F4 /* Build configuration list for PBXNativeTarget "ShareExtension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 82D6FAA22CD9820500C925F4 /* Debug */, + 82D6FAA32CD9820500C925F4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; D703D7272C66E47100A400EA /* Build configuration list for PBXNativeTarget "HighlighterActionExtension" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -5613,6 +6725,31 @@ package = 4C64987F286E0EE300EAE2B3 /* XCRemoteSwiftPackageReference "secp256k1" */; productName = secp256k1; }; + 82D6FC802CD99FC500C925F4 /* secp256k1 */ = { + isa = XCSwiftPackageProductDependency; + package = 4C64987F286E0EE300EAE2B3 /* XCRemoteSwiftPackageReference "secp256k1" */; + productName = secp256k1; + }; + 82D6FC832CD9A48500C925F4 /* Kingfisher */ = { + isa = XCSwiftPackageProductDependency; + package = 4C06670228FC7EC500038D2A /* XCRemoteSwiftPackageReference "Kingfisher" */; + productName = Kingfisher; + }; + 82D6FC852CD9A4A600C925F4 /* MarkdownUI */ = { + isa = XCSwiftPackageProductDependency; + package = 4C27C9302A64766F007DBC75 /* XCRemoteSwiftPackageReference "swift-markdown-ui" */; + productName = MarkdownUI; + }; + 82D6FC872CD9A4DE00C925F4 /* EmojiPicker */ = { + isa = XCSwiftPackageProductDependency; + package = 3A0A30B92C21397A00F8C9BC /* XCRemoteSwiftPackageReference "EmojiPicker" */; + productName = EmojiPicker; + }; + 82D6FC892CD9A54600C925F4 /* SwipeActions */ = { + isa = XCSwiftPackageProductDependency; + package = D78DB8572C1CE9CA00F0AB12 /* XCRemoteSwiftPackageReference "SwipeActions" */; + productName = SwipeActions; + }; D703D7482C6709B100A400EA /* secp256k1 */ = { isa = XCSwiftPackageProductDependency; package = 4C64987F286E0EE300EAE2B3 /* XCRemoteSwiftPackageReference "secp256k1" */; diff --git a/damus/Models/HighlightEvent.swift b/damus/Models/HighlightEvent.swift @@ -213,3 +213,27 @@ enum HighlightSource: Hashable { } } } + +struct ShareContent { + let title: String + let content: ContentType + + enum ContentType { + case link(URL) + case media([PreUploadedMedia]) + } + + func getLinkURL() -> URL? { + if case let .link(url) = content { + return url + } + return nil + } + + func getMediaArray() -> [PreUploadedMedia] { + if case let .media(mediaArray) = content { + return mediaArray + } + return [] + } +} diff --git a/damus/Views/PostView.swift b/damus/Views/PostView.swift @@ -31,6 +31,7 @@ enum PostAction { case quoting(NostrEvent) case posting(PostTarget) case highlighting(HighlightContentDraft) + case sharing(ShareContent) var ev: NostrEvent? { switch self { @@ -42,6 +43,8 @@ enum PostAction { return nil case .highlighting: return nil + case .sharing(_): + return nil } } } @@ -57,6 +60,7 @@ struct PostView: View { @State var imagePastedFromPasteboard: UIImage? = nil @State var imageUploadConfirmPasteboard: Bool = false @State var references: [RefId] = [] + @State var imageUploadConfirmDamusShare: Bool = false @State var filtered_pubkeys: Set<Pubkey> = [] @State var focusWordAttributes: (String?, NSRange?) = (nil, nil) @State var newCursorIndex: Int? @@ -217,6 +221,8 @@ struct PostView: View { damus_state.drafts.post = nil case .highlighting(let draft): damus_state.drafts.highlights.removeValue(forKey: draft.source) + case .sharing(_): + damus_state.drafts.post = nil } } @@ -391,6 +397,11 @@ struct PostView: View { else if case .highlighting(let draft) = action { HighlightDraftContentView(draft: draft) } + else if case .sharing(let draft) = action, + let url = draft.getLinkURL() { + LinkViewRepresentable(meta: .url(url)) + .frame(height: 50) + } } .padding(.horizontal) } @@ -499,6 +510,19 @@ struct PostView: View { } Button(NSLocalizedString("Cancel", comment: "Button to cancel the upload."), role: .cancel) {} } + // This alert seeks confirmation about media-upload from Damus Share Extension + .alert(NSLocalizedString("Are you sure you want to upload the selected media?", comment: "Alert message asking if the user wants to upload media."), isPresented: $imageUploadConfirmDamusShare) { + Button(NSLocalizedString("Upload", comment: "Button to proceed with uploading."), role: .none) { + Task { + for media in preUploadedMedia { + if let mediaToUpload = generateMediaUpload(media) { + await self.handle_upload(media: mediaToUpload) + } + } + } + } + Button(NSLocalizedString("Cancel", comment: "Button to cancel the upload."), role: .cancel) {} + } .onAppear() { let loaded_draft = load_draft() @@ -512,6 +536,15 @@ struct PostView: View { fill_target_content(target: target) case .highlighting(let draft): references = [draft.source.ref()] + case .sharing(let content): + if let url = content.getLinkURL() { + self.post = NSMutableAttributedString(string: "\(content.title)\n\(String(url.absoluteString))") + } else { + self.preUploadedMedia = content.getMediaArray() + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + self.imageUploadConfirmDamusShare = true // display Confirm Sheet after 1 sec + } + } } DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { @@ -661,6 +694,8 @@ func set_draft_for_post(drafts: Drafts, action: PostAction, artifacts: DraftArti drafts.post = artifacts case .highlighting(let draft): drafts.highlights[draft.source] = artifacts + case .sharing(_): + drafts.post = artifacts } } @@ -674,6 +709,8 @@ func load_draft_for_post(drafts: Drafts, action: PostAction) -> DraftArtifacts? return drafts.post case .highlighting(let draft): return drafts.highlights[draft.source] + case .sharing(_): + return drafts.post } } @@ -749,6 +786,8 @@ func build_post(state: DamusState, post: NSMutableAttributedString, action: Post break case .highlighting(let draft): break + case .sharing(_): + break } // append additional tags diff --git a/share extension/Info.plist b/share extension/Info.plist @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>NSExtension</key> + <dict> + <key>NSExtensionAttributes</key> + <dict> + <key>NSExtensionActivationRule</key> + <string>TRUEPREDICATE</string> + <key>NSExtensionActivationSupportsImage</key> + <true/> + <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> + <integer>1</integer> + </dict> + <key>NSExtensionPointIdentifier</key> + <string>com.apple.share-services</string> + <key>NSExtensionPrincipalClass</key> + <string>$(PRODUCT_MODULE_NAME).ShareViewController</string> + </dict> +</dict> +</plist> diff --git a/share extension/ShareViewController.swift b/share extension/ShareViewController.swift @@ -0,0 +1,356 @@ +// +// ShareViewController.swift +// share extension +// +// Created by Swift on 11/4/24. +// + +import SwiftUI +import Social +import UniformTypeIdentifiers + +let this_app: UIApplication = UIApplication() + +class ShareViewController: SLComposeServiceViewController { + private var contentView: UIHostingController<ShareExtensionView>? + + override func viewDidLoad() { + super.viewDidLoad() + self.view.tintColor = UIColor(DamusColors.purple) + + DispatchQueue.main.async { + let contentView = UIHostingController(rootView: ShareExtensionView(extensionContext: self.extensionContext!, + dismissParent: { [weak self] in + self?.dismissSelf() + } + )) + self.addChild(contentView) + self.contentView = contentView + self.view.addSubview(contentView.view) + + // set up constraints + contentView.view.translatesAutoresizingMaskIntoConstraints = false + contentView.view.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true + contentView.view.bottomAnchor.constraint (equalTo: self.view.bottomAnchor).isActive = true + contentView.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true + contentView.view.rightAnchor.constraint (equalTo: self.view.rightAnchor).isActive = true + } + } + + func dismissSelf() { + super.didSelectCancel() + } +} + +struct ShareExtensionView: View { + @State private var share_state: ShareState = .loading + let extensionContext: NSExtensionContext + @State private var state: DamusState? = nil + @State private var preUploadedMedia: [PreUploadedMedia] = [] + var dismissParent: (() -> Void)? + + @Environment(\.scenePhase) var scenePhase + + var body: some View { + VStack(spacing: 15) { + switch self.share_state { + case .loading: + ProgressView() + case .no_content: + Group { + Text("No content availabe to share", comment: "Title indicating that there was no available content to share") + .font(.largeTitle) + .multilineTextAlignment(.center) + .padding() + Text("There is no content available to share at this time. Please close this view and try again.", comment: "Label explaining that no content is available to share and instructing the user to close the view and try again.") + .multilineTextAlignment(.center) + .padding(.horizontal) + + Button(action: { + self.done() + }, label: { + Text("Close", comment: "Button label giving the user the option to close the view when no content is available to share") + }) + .foregroundStyle(.secondary) + } + case .not_logged_in: + Group { + Text("Not Logged In", comment: "Title indicating that sharing cannot proceed because the user is not logged in.") + .font(.largeTitle) + .multilineTextAlignment(.center) + .padding() + + Text("You cannot share content because you are not logged in. Please close this view, log in to your account, and try again.", comment: "Label explaining that sharing cannot proceed because the user is not logged in.") + .multilineTextAlignment(.center) + .padding(.horizontal) + + Button(action: { + self.done() + }, label: { + Text("Close", comment: "Button label giving the user the option to close the sheet due to not being logged in.") + }) + .foregroundStyle(.secondary) + } + case .loaded(let content): + PostView( + action: .sharing(content), + damus_state: state! // state will have a value at this point + ) + case .cancelled: + Group { + Text("Cancelled", comment: "Title indicating that the user has cancelled.") + .font(.largeTitle) + .padding() + Button(action: { + self.done() + }, label: { + Text("Close", comment: "Button label giving the user the option to close the sheet from which they were trying to share.") + }) + .foregroundStyle(.secondary) + } + case .failed(let error): + Group { + Text("Error", comment: "Title indicating that an error has occurred.") + .font(.largeTitle) + .multilineTextAlignment(.center) + .padding() + Text("An unexpected error occurred. Please contact Damus support via [Nostr](damus:npub18m76awca3y37hkvuneavuw6pjj4525fw90necxmadrvjg0sdy6qsngq955) or [email](support@damus.io) with the error message below.", comment: "Label explaining there was an error, and suggesting next steps") + .multilineTextAlignment(.center) + Text("Error: \(error)") + Button(action: { + done() + }, label: { + Text("Close", comment: "Button label giving the user the option to close the sheet from which they were trying share.") + }) + .foregroundStyle(.secondary) + } + case .posted(event: let event): + Group { + Image(systemName: "checkmark.circle.fill") + .resizable() + .frame(width: 60, height: 60) + Text("Shared", comment: "Title indicating that the user has shared content successfully") + .font(.largeTitle) + .multilineTextAlignment(.center) + .padding(.bottom) + + Link(destination: URL(string: "damus:\(event.id.bech32)")!, label: { + Text("Go to the app", comment: "Button label giving the user the option to go to the app after sharing content") + }) + .buttonStyle(GradientButtonStyle()) + + Button(action: { + self.done() + }, label: { + Text("Close", comment: "Button label giving the user the option to close the sheet from which they shared content") + }) + .foregroundStyle(.secondary) + } + case .posting: + Group { + ProgressView() + .frame(width: 20, height: 20) + Text("Sharing", comment: "Title indicating that the content is being published to the network") + .font(.largeTitle) + .multilineTextAlignment(.center) + .padding(.bottom) + Text("Your content is being broadcasted to the network. Please wait.", comment: "Label explaining that their content sharing action is in progress") + .multilineTextAlignment(.center) + .padding() + } + } + } + .onAppear(perform: { + if setDamusState() { + self.loadSharedContent() + } + }) + .onDisappear { + Task { @MainActor in + self.state?.ndb.close() + } + } + .onReceive(handle_notify(.post)) { post_notification in + switch post_notification { + case .post(let post): + self.post(post) + case .cancel: + self.share_state = .cancelled + dismissParent?() + } + } + .onChange(of: scenePhase) { (phase: ScenePhase) in + guard let state else { return } + switch phase { + case .background: + print("txn: 📙 SHARE BACKGROUNDED") + Task { @MainActor in + state.ndb.close() + } + break + case .inactive: + print("txn: 📙 SHARE INACTIVE") + break + case .active: + print("txn: 📙 SHARE ACTIVE") + state.pool.ping() + @unknown default: + break + } + } + .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { obj in + guard let state else { return } + print("SHARE ACTIVE NOTIFY") + if state.ndb.reopen() { + print("SHARE NOSTRDB REOPENED") + } else { + print(" SHARE NOSTRDB FAILED TO REOPEN closed: \(state.ndb.is_closed)") + } + } + .onReceive(NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)) { obj in + guard let state else { return } + print("txn: 📙 SHARE BACKGROUNDED") + Task { @MainActor in + state.ndb.close() + } + } + } + + func post(_ post: NostrPost) { + self.share_state = .posting + guard let state else { + self.share_state = .failed(error: "Damus state not initialized") + return + } + guard let full_keypair = state.keypair.to_full() else { + self.share_state = .not_logged_in + return + } + guard let posted_event = post.to_event(keypair: full_keypair) else { + self.share_state = .failed(error: "Cannot convert post data into a nostr event") + return + } + state.postbox.send(posted_event, on_flush: .once({ flushed_event in + if flushed_event.event.id == posted_event.id { + DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: { // Offset labor perception bias + self.share_state = .posted(event: flushed_event.event) + }) + } + else { + self.share_state = .failed(error: "Flushed event is not the event we just tried to post.") + } + })) + } + + @discardableResult + private func setDamusState() -> Bool { + guard let keypair = get_saved_keypair(), + keypair.privkey != nil else { + self.share_state = .not_logged_in + return false + } + state = DamusState(keypair: keypair) + return true + } + + func loadSharedContent() { + guard let extensionItem = extensionContext.inputItems.first as? NSExtensionItem else { + share_state = .failed(error: "Unable to get item provider") + return + } + + var title = "" + + // Check for the attributed text from the extension item + if let attributedContentData = extensionItem.userInfo?[NSExtensionItemAttributedContentTextKey] as? Data { + if let attributedText = try? NSAttributedString(data: attributedContentData, options: [.documentType: NSAttributedString.DocumentType.rtf], documentAttributes: nil) { + let plainText = attributedText.string + print("Extracted Text: \(plainText)") + title = plainText + } else { + print("Failed to decode RTF content.") + } + } else { + print("Content is not in RTF format or data is unavailable.") + } + + // Iterate through all attachments to handle multiple images + for itemProvider in extensionItem.attachments ?? [] { + if itemProvider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { + itemProvider.loadItem(forTypeIdentifier: UTType.url.identifier, options: nil) { (item, error) in + if let url = item as? URL { + self.share_state = .loaded(ShareContent(title: title, content: .link(url))) + } else { + self.share_state = .failed(error: "Failed to load text content") + } + } + } else if itemProvider.hasItemConformingToTypeIdentifier(UTType.image.identifier) { + itemProvider.loadItem(forTypeIdentifier: UTType.image.identifier, options: nil) { (item, error) in + if let url = item as? URL { + + attemptAcquireResourceAndChooseMedia( + url: url, + fallback: processImage, + unprocessedEnum: {.unprocessed_image($0)}, + processedEnum: {.processed_image($0)}) + + + } else { + self.share_state = .failed(error: "Failed to load image content") + } + } + } else if itemProvider.hasItemConformingToTypeIdentifier(UTType.movie.identifier) { + itemProvider.loadItem(forTypeIdentifier: UTType.movie.identifier) { (item, error) in + if let url = item as? URL { + attemptAcquireResourceAndChooseMedia( + url: url, + fallback: processVideo, + unprocessedEnum: {.unprocessed_video($0)}, + processedEnum: {.processed_video($0)} + ) + + } else { + self.share_state = .failed(error: "Failed to load video content") + } + } + } else { + share_state = .no_content + } + } + + func attemptAcquireResourceAndChooseMedia(url: URL, fallback: (URL) -> URL?, unprocessedEnum: (URL) -> PreUploadedMedia, processedEnum: (URL) -> PreUploadedMedia) { + if url.startAccessingSecurityScopedResource() { + // Have permission from system to use url out of scope + print("Acquired permission to security scoped resource") + chooseMedia(unprocessedEnum(url)) + } else { + // Need to copy URL to non-security scoped location + guard let newUrl = fallback(url) else { return } + chooseMedia(processedEnum(newUrl)) + } + } + + func chooseMedia(_ media: PreUploadedMedia) { + self.preUploadedMedia.append(media) + if extensionItem.attachments?.count == preUploadedMedia.count { + self.share_state = .loaded(ShareContent(title: "", content: .media(preUploadedMedia))) + } + } + } + + private func done() { + extensionContext.completeRequest(returningItems: [], completionHandler: nil) + } + + private enum ShareState { + case loading + case no_content + case not_logged_in + case loaded(ShareContent) + case failed(error: String) + case cancelled + case posting + case posted(event: NostrEvent) + } +} + diff --git a/share extension/share extension.entitlements b/share extension/share extension.entitlements @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>com.apple.security.app-sandbox</key> + <true/> + <key>com.apple.security.application-groups</key> + <array> + <string>group.com.damus</string> + </array> + <key>com.apple.security.network.client</key> + <true/> + <key>keychain-access-groups</key> + <array> + <string>$(AppIdentifierPrefix)com.jb55.damus2</string> + </array> +</dict> +</plist>