mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-08-06 22:54:39 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f73c9b5773 | ||
|
|
5848255e72 | ||
|
|
1cf828b165 | ||
|
|
2e1f7d6587 | ||
|
|
c6977d97d3 | ||
|
|
d12e886e9e | ||
|
|
8299f4cfca | ||
|
|
432b1e4902 | ||
|
|
e9fd62dc26 | ||
|
|
f42ec3c149 | ||
|
|
43e1e0f23e | ||
|
|
7bc393143c | ||
|
|
23718f51dd | ||
|
|
8b2efecfbe | ||
|
|
9081d5a54b | ||
|
|
709e3bdd3a | ||
|
|
1f66ef717b | ||
|
|
cd2b5d78a1 |
@@ -241,12 +241,14 @@ dependencyResolutionManagement {
|
||||
Add the dependency
|
||||
|
||||
```gradle
|
||||
implementation('com.github.vitorpamplona.amethyst:quartz:v0.84.3')
|
||||
implementation('com.github.vitorpamplona.amethyst:quartz:v0.85.1')
|
||||
```
|
||||
|
||||
## Contributing
|
||||
|
||||
[Issues](https://github.com/vitorpamplona/amethyst/issues) and [pull requests](https://github.com/vitorpamplona/amethyst/pulls) here are very welcome. Translations can be provided via [Crowdin](https://crowdin.com/project/amethyst-social)
|
||||
Issues can be logged on: [https://gitworkshop.dev/repo/amethyst](https://gitworkshop.dev/repo/amethyst)
|
||||
|
||||
[GitHub issues](https://github.com/vitorpamplona/amethyst/issues) and [pull requests](https://github.com/vitorpamplona/amethyst/pulls) here are also welcome. Translations can be provided via [Crowdin](https://crowdin.com/project/amethyst-social)
|
||||
|
||||
You can also send patches through Nostr using [GitStr](https://github.com/fiatjaf/gitstr) to [this nostr address](https://patch34.pages.dev/naddr1qqyxzmt9w358jum5qyg8v6t5daezumn0wd68yvfwvdhk6qg7waehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2ap0qy2hwumn8ghj7un9d3shjtnwdaehgu3wvfnj7q3qgcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqxpqqqpmej720gac)
|
||||
|
||||
|
||||
+2
-2
@@ -12,8 +12,8 @@ android {
|
||||
applicationId "com.vitorpamplona.amethyst"
|
||||
minSdk 26
|
||||
targetSdk 34
|
||||
versionCode 360
|
||||
versionName "0.85.1"
|
||||
versionCode 362
|
||||
versionName "0.85.3"
|
||||
buildConfigField "String", "RELEASE_NOTES_ID", "\"d8da33fd13d129d86c53564aedefafbe3716f007c520431be4a8e488d3925afb\""
|
||||
|
||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||
|
||||
@@ -35,6 +35,9 @@ import com.vitorpamplona.quartz.events.AdvertisedRelayListEvent
|
||||
import com.vitorpamplona.quartz.events.BadgeAwardEvent
|
||||
import com.vitorpamplona.quartz.events.BadgeProfilesEvent
|
||||
import com.vitorpamplona.quartz.events.BookmarkListEvent
|
||||
import com.vitorpamplona.quartz.events.CalendarDateSlotEvent
|
||||
import com.vitorpamplona.quartz.events.CalendarRSVPEvent
|
||||
import com.vitorpamplona.quartz.events.CalendarTimeSlotEvent
|
||||
import com.vitorpamplona.quartz.events.ChannelMessageEvent
|
||||
import com.vitorpamplona.quartz.events.ContactListEvent
|
||||
import com.vitorpamplona.quartz.events.EmojiPackSelectionEvent
|
||||
@@ -42,6 +45,10 @@ import com.vitorpamplona.quartz.events.Event
|
||||
import com.vitorpamplona.quartz.events.EventInterface
|
||||
import com.vitorpamplona.quartz.events.GenericRepostEvent
|
||||
import com.vitorpamplona.quartz.events.GiftWrapEvent
|
||||
import com.vitorpamplona.quartz.events.GitIssueEvent
|
||||
import com.vitorpamplona.quartz.events.GitPatchEvent
|
||||
import com.vitorpamplona.quartz.events.GitReplyEvent
|
||||
import com.vitorpamplona.quartz.events.HighlightEvent
|
||||
import com.vitorpamplona.quartz.events.LnZapEvent
|
||||
import com.vitorpamplona.quartz.events.LnZapPaymentResponseEvent
|
||||
import com.vitorpamplona.quartz.events.MetadataEvent
|
||||
@@ -120,24 +127,12 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
||||
)
|
||||
}
|
||||
|
||||
fun createAccountAcceptedAwardsFilter(): TypedFilter {
|
||||
fun createAccountSettingsFilter(): TypedFilter {
|
||||
return TypedFilter(
|
||||
types = COMMON_FEED_TYPES,
|
||||
filter =
|
||||
JsonFilter(
|
||||
kinds = listOf(BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND),
|
||||
authors = listOf(account.userProfile().pubkeyHex),
|
||||
limit = 10,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
fun createAccountBookmarkListFilter(): TypedFilter {
|
||||
return TypedFilter(
|
||||
types = COMMON_FEED_TYPES,
|
||||
filter =
|
||||
JsonFilter(
|
||||
kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND),
|
||||
kinds = listOf(BookmarkListEvent.KIND, PeopleListEvent.KIND, MuteListEvent.KIND, BadgeProfilesEvent.KIND, EmojiPackSelectionEvent.KIND),
|
||||
authors = listOf(account.userProfile().pubkeyHex),
|
||||
limit = 100,
|
||||
),
|
||||
@@ -204,6 +199,36 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
||||
)
|
||||
}
|
||||
|
||||
fun createNotificationFilter2(): TypedFilter {
|
||||
val since =
|
||||
latestEOSEs.users[account.userProfile()]
|
||||
?.followList
|
||||
?.get(account.defaultNotificationFollowList.value)
|
||||
?.relayList
|
||||
?: account.activeRelays()?.associate { it.url to EOSETime(TimeUtils.oneWeekAgo()) }
|
||||
?: account.convertLocalRelays().associate { it.url to EOSETime(TimeUtils.oneWeekAgo()) }
|
||||
|
||||
return TypedFilter(
|
||||
types = COMMON_FEED_TYPES,
|
||||
filter =
|
||||
JsonFilter(
|
||||
kinds =
|
||||
listOf(
|
||||
GitReplyEvent.KIND,
|
||||
GitIssueEvent.KIND,
|
||||
GitPatchEvent.KIND,
|
||||
HighlightEvent.KIND,
|
||||
CalendarDateSlotEvent.KIND,
|
||||
CalendarTimeSlotEvent.KIND,
|
||||
CalendarRSVPEvent.KIND,
|
||||
),
|
||||
tags = mapOf("p" to listOf(account.userProfile().pubkeyHex)),
|
||||
limit = 400,
|
||||
since = since,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
fun createGiftWrapsToMeFilter() =
|
||||
TypedFilter(
|
||||
types = COMMON_FEED_TYPES,
|
||||
@@ -297,10 +322,10 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
||||
createAccountContactListFilter(),
|
||||
createAccountRelayListFilter(),
|
||||
createNotificationFilter(),
|
||||
createNotificationFilter2(),
|
||||
createGiftWrapsToMeFilter(),
|
||||
createAccountReportsFilter(),
|
||||
createAccountAcceptedAwardsFilter(),
|
||||
createAccountBookmarkListFilter(),
|
||||
createAccountSettingsFilter(),
|
||||
createAccountLastPostsListFilter(),
|
||||
createOtherAccountsBaseFilter(),
|
||||
)
|
||||
@@ -312,7 +337,7 @@ object NostrAccountDataSource : NostrDataSource("AccountData") {
|
||||
createAccountMetadataFilter(),
|
||||
createAccountContactListFilter(),
|
||||
createAccountRelayListFilter(),
|
||||
createAccountBookmarkListFilter(),
|
||||
createAccountSettingsFilter(),
|
||||
)
|
||||
.ifEmpty { null }
|
||||
}
|
||||
|
||||
@@ -289,6 +289,8 @@ open class NewPostViewModel() : ViewModel() {
|
||||
}
|
||||
|
||||
forkedFromNote = it
|
||||
} ?: run {
|
||||
forkedFromNote = null
|
||||
}
|
||||
|
||||
if (!forwardZapTo.items.isEmpty()) {
|
||||
@@ -627,6 +629,8 @@ open class NewPostViewModel() : ViewModel() {
|
||||
toUsers = TextFieldValue("")
|
||||
subject = TextFieldValue("")
|
||||
|
||||
forkedFromNote = null
|
||||
|
||||
contentToAddUrl = null
|
||||
urlPreview = null
|
||||
isUploadingImage = false
|
||||
|
||||
@@ -32,6 +32,9 @@ import com.vitorpamplona.quartz.events.ChannelCreateEvent
|
||||
import com.vitorpamplona.quartz.events.ChannelMetadataEvent
|
||||
import com.vitorpamplona.quartz.events.GenericRepostEvent
|
||||
import com.vitorpamplona.quartz.events.GiftWrapEvent
|
||||
import com.vitorpamplona.quartz.events.GitIssueEvent
|
||||
import com.vitorpamplona.quartz.events.GitPatchEvent
|
||||
import com.vitorpamplona.quartz.events.HighlightEvent
|
||||
import com.vitorpamplona.quartz.events.LnZapEvent
|
||||
import com.vitorpamplona.quartz.events.LnZapRequestEvent
|
||||
import com.vitorpamplona.quartz.events.MuteListEvent
|
||||
@@ -94,6 +97,14 @@ class NotificationFeedFilter(val account: Account) : AdditiveFeedFilter<Note>()
|
||||
): Boolean {
|
||||
val event = note.event
|
||||
|
||||
if (event is GitIssueEvent || event is GitPatchEvent) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (event is HighlightEvent) {
|
||||
return true
|
||||
}
|
||||
|
||||
if (event is BaseTextNoteEvent) {
|
||||
if (note.replyTo?.any { it.author?.pubkeyHex == authorHex } == true) return true
|
||||
|
||||
|
||||
@@ -72,10 +72,13 @@ import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.platform.LocalFocusManager
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.SpanStyle
|
||||
import androidx.compose.ui.text.buildAnnotatedString
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.input.ImeAction
|
||||
import androidx.compose.ui.text.input.KeyboardCapitalization
|
||||
import androidx.compose.ui.text.style.TextOverflow
|
||||
import androidx.compose.ui.text.withStyle
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||
@@ -86,6 +89,7 @@ import com.vitorpamplona.amethyst.model.User
|
||||
import com.vitorpamplona.amethyst.service.relays.RelayPool
|
||||
import com.vitorpamplona.amethyst.service.relays.RelayPoolStatus
|
||||
import com.vitorpamplona.amethyst.ui.actions.NewRelayListView
|
||||
import com.vitorpamplona.amethyst.ui.components.ClickableText
|
||||
import com.vitorpamplona.amethyst.ui.components.CreateTextWithEmoji
|
||||
import com.vitorpamplona.amethyst.ui.components.RobohashFallbackAsyncImage
|
||||
import com.vitorpamplona.amethyst.ui.note.LoadStatuses
|
||||
@@ -736,29 +740,24 @@ fun BottomContent(
|
||||
modifier = Modifier.fillMaxWidth().padding(horizontal = 15.dp),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
Text(
|
||||
ClickableText(
|
||||
text =
|
||||
buildAnnotatedString {
|
||||
withStyle(
|
||||
SpanStyle(
|
||||
fontSize = 12.sp,
|
||||
fontWeight = FontWeight.Bold,
|
||||
),
|
||||
) {
|
||||
append("v" + BuildConfig.VERSION_NAME + "-" + BuildConfig.FLAVOR.uppercase())
|
||||
}
|
||||
},
|
||||
onClick = {
|
||||
nav("Note/${BuildConfig.RELEASE_NOTES_ID}")
|
||||
coroutineScope.launch { drawerState.close() }
|
||||
},
|
||||
modifier = Modifier.padding(start = 16.dp),
|
||||
text = "v" + BuildConfig.VERSION_NAME + "-" + BuildConfig.FLAVOR.uppercase(),
|
||||
fontSize = 12.sp,
|
||||
fontWeight = FontWeight.Bold,
|
||||
)
|
||||
/*
|
||||
IconButton(
|
||||
onClick = {
|
||||
when (AppCompatDelegate.getDefaultNightMode()) {
|
||||
AppCompatDelegate.MODE_NIGHT_NO -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
AppCompatDelegate.MODE_NIGHT_YES -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
|
||||
else -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
|
||||
}
|
||||
}
|
||||
) {
|
||||
Icon(
|
||||
painter = painterResource(R.drawable.ic_theme),
|
||||
null,
|
||||
modifier = Modifier.size(24.dp),
|
||||
tint = MaterialTheme.colorScheme.primary
|
||||
)
|
||||
}*/
|
||||
Box(modifier = Modifier.weight(1F))
|
||||
IconButton(
|
||||
onClick = {
|
||||
|
||||
@@ -230,6 +230,7 @@ import com.vitorpamplona.quartz.events.FhirResourceEvent
|
||||
import com.vitorpamplona.quartz.events.FileHeaderEvent
|
||||
import com.vitorpamplona.quartz.events.FileStorageHeaderEvent
|
||||
import com.vitorpamplona.quartz.events.GenericRepostEvent
|
||||
import com.vitorpamplona.quartz.events.GitIssueEvent
|
||||
import com.vitorpamplona.quartz.events.GitPatchEvent
|
||||
import com.vitorpamplona.quartz.events.GitRepositoryEvent
|
||||
import com.vitorpamplona.quartz.events.HighlightEvent
|
||||
@@ -1136,6 +1137,11 @@ class EditState() {
|
||||
|
||||
fun latest() = modificationsList.lastOrNull()
|
||||
|
||||
fun latestBefore(createdAt: Long?): Note? {
|
||||
if (createdAt == null) return latest()
|
||||
return modificationsList.lastOrNull { (it.createdAt() ?: Long.MAX_VALUE) < createdAt }
|
||||
}
|
||||
|
||||
fun nextModification() {
|
||||
if (modificationToShowIndex < 0) {
|
||||
modificationToShowIndex = 0
|
||||
@@ -1304,6 +1310,16 @@ private fun RenderNoteRow(
|
||||
nav,
|
||||
)
|
||||
}
|
||||
is GitIssueEvent -> {
|
||||
RenderGitIssueEvent(
|
||||
baseNote,
|
||||
makeItShort,
|
||||
canPreview,
|
||||
backgroundColor,
|
||||
accountViewModel,
|
||||
nav,
|
||||
)
|
||||
}
|
||||
is PrivateDmEvent -> {
|
||||
RenderPrivateMessage(
|
||||
baseNote,
|
||||
@@ -1370,7 +1386,6 @@ private fun RenderNoteRow(
|
||||
makeItShort,
|
||||
canPreview,
|
||||
backgroundColor,
|
||||
editState,
|
||||
accountViewModel,
|
||||
nav,
|
||||
)
|
||||
@@ -1509,40 +1524,31 @@ fun RenderTextModificationEvent(
|
||||
makeItShort: Boolean,
|
||||
canPreview: Boolean,
|
||||
backgroundColor: MutableState<Color>,
|
||||
editStateByAuthor: State<GenericLoadable<EditState>>,
|
||||
accountViewModel: AccountViewModel,
|
||||
nav: (String) -> Unit,
|
||||
) {
|
||||
val noteEvent = note.event as? TextNoteModificationEvent ?: return
|
||||
val noteAuthor = note.author ?: return
|
||||
|
||||
val isAuthorTheLoggedUser = remember(note.event) { accountViewModel.isLoggedUser(note.author) }
|
||||
|
||||
val editState =
|
||||
remember {
|
||||
derivedStateOf {
|
||||
val loadable = editStateByAuthor.value as? GenericLoadable.Loaded<EditState>
|
||||
|
||||
val state = EditState()
|
||||
|
||||
val latestChangeByAuthor =
|
||||
if (loadable != null && loadable.loaded.hasModificationsToShow()) {
|
||||
loadable.loaded.latest()
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
state.updateModifications(listOfNotNull(latestChangeByAuthor, note))
|
||||
|
||||
GenericLoadable.Loaded(state)
|
||||
}
|
||||
}
|
||||
|
||||
val wantsToEditPost =
|
||||
remember {
|
||||
mutableStateOf(false)
|
||||
}
|
||||
|
||||
val isAuthorTheLoggedUser =
|
||||
remember {
|
||||
val authorOfTheOriginalNote = noteEvent.editedNote()?.let { accountViewModel.getNoteIfExists(it)?.author }
|
||||
|
||||
mutableStateOf(accountViewModel.isLoggedUser(authorOfTheOriginalNote))
|
||||
}
|
||||
|
||||
noteEvent.editedNote()?.let {
|
||||
LoadNote(baseNoteHex = it, accountViewModel = accountViewModel) { baseOriginalNote ->
|
||||
baseOriginalNote?.let {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Card(
|
||||
modifier = MaterialTheme.colorScheme.imageModifier,
|
||||
) {
|
||||
@@ -1574,6 +1580,38 @@ fun RenderTextModificationEvent(
|
||||
noteEvent.editedNote()?.let {
|
||||
LoadNote(baseNoteHex = it, accountViewModel = accountViewModel) { baseNote ->
|
||||
baseNote?.let {
|
||||
val noteState by baseNote.live().metadata.observeAsState()
|
||||
|
||||
val editStateOriginalNote = observeEdits(baseNote = baseNote, accountViewModel = accountViewModel)
|
||||
|
||||
val editState =
|
||||
remember(note) {
|
||||
derivedStateOf {
|
||||
val loadable = editStateOriginalNote.value as? GenericLoadable.Loaded<EditState>
|
||||
|
||||
val state = EditState()
|
||||
|
||||
val latestChangeByAuthor =
|
||||
if (loadable != null && loadable.loaded.hasModificationsToShow()) {
|
||||
loadable.loaded.latestBefore(note.createdAt())
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
state.updateModifications(listOfNotNull(latestChangeByAuthor, note))
|
||||
|
||||
GenericLoadable.Loaded(state)
|
||||
}
|
||||
}
|
||||
|
||||
LaunchedEffect(key1 = noteState) {
|
||||
val newAuthor = accountViewModel.isLoggedUser(noteState?.note?.author)
|
||||
|
||||
if (isAuthorTheLoggedUser.value != newAuthor) {
|
||||
isAuthorTheLoggedUser.value = newAuthor
|
||||
}
|
||||
}
|
||||
|
||||
Column(
|
||||
modifier =
|
||||
MaterialTheme.colorScheme.innerPostModifier.padding(Size10dp).clickable {
|
||||
@@ -1609,13 +1647,15 @@ fun RenderTextModificationEvent(
|
||||
}
|
||||
}
|
||||
|
||||
Spacer(modifier = StdVertSpacer)
|
||||
if (isAuthorTheLoggedUser.value) {
|
||||
Spacer(modifier = StdVertSpacer)
|
||||
|
||||
Button(
|
||||
onClick = { wantsToEditPost.value = true },
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
) {
|
||||
Text(text = stringResource(id = R.string.accept_the_suggestion))
|
||||
Button(
|
||||
onClick = { wantsToEditPost.value = true },
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
) {
|
||||
Text(text = stringResource(id = R.string.accept_the_suggestion))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4095,6 +4135,92 @@ private fun RenderGitPatchEvent(
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun RenderGitIssueEvent(
|
||||
baseNote: Note,
|
||||
makeItShort: Boolean,
|
||||
canPreview: Boolean,
|
||||
backgroundColor: MutableState<Color>,
|
||||
accountViewModel: AccountViewModel,
|
||||
nav: (String) -> Unit,
|
||||
) {
|
||||
val event = baseNote.event as? GitIssueEvent ?: return
|
||||
|
||||
RenderGitIssueEvent(event, baseNote, makeItShort, canPreview, backgroundColor, accountViewModel, nav)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun RenderGitIssueEvent(
|
||||
noteEvent: GitIssueEvent,
|
||||
note: Note,
|
||||
makeItShort: Boolean,
|
||||
canPreview: Boolean,
|
||||
backgroundColor: MutableState<Color>,
|
||||
accountViewModel: AccountViewModel,
|
||||
nav: (String) -> Unit,
|
||||
) {
|
||||
val repository = remember(noteEvent) { noteEvent.repository() }
|
||||
|
||||
if (repository != null) {
|
||||
LoadAddressableNote(aTag = repository, accountViewModel = accountViewModel) {
|
||||
if (it != null) {
|
||||
RenderShortRepositoryHeader(it, accountViewModel, nav)
|
||||
Spacer(modifier = DoubleVertSpacer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LoadDecryptedContent(note, accountViewModel) { body ->
|
||||
val eventContent by
|
||||
remember(note.event) {
|
||||
derivedStateOf {
|
||||
val subject = (note.event as? TextNoteEvent)?.subject()?.ifEmpty { null }
|
||||
|
||||
if (!subject.isNullOrBlank() && !body.split("\n")[0].contains(subject)) {
|
||||
"### $subject\n$body"
|
||||
} else {
|
||||
body
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val isAuthorTheLoggedUser = remember(note.event) { accountViewModel.isLoggedUser(note.author) }
|
||||
|
||||
if (makeItShort && isAuthorTheLoggedUser) {
|
||||
Text(
|
||||
text = eventContent,
|
||||
color = MaterialTheme.colorScheme.placeholderText,
|
||||
maxLines = 2,
|
||||
overflow = TextOverflow.Ellipsis,
|
||||
)
|
||||
} else {
|
||||
SensitivityWarning(
|
||||
note = note,
|
||||
accountViewModel = accountViewModel,
|
||||
) {
|
||||
val modifier = remember(note) { Modifier.fillMaxWidth() }
|
||||
val tags = remember(note) { note.event?.tags()?.toImmutableListOfLists() ?: EmptyTagList }
|
||||
|
||||
TranslatableRichTextViewer(
|
||||
content = eventContent,
|
||||
canPreview = canPreview && !makeItShort,
|
||||
modifier = modifier,
|
||||
tags = tags,
|
||||
backgroundColor = backgroundColor,
|
||||
accountViewModel = accountViewModel,
|
||||
nav = nav,
|
||||
)
|
||||
}
|
||||
|
||||
if (note.event?.hasHashtags() == true) {
|
||||
val hashtags =
|
||||
remember(note.event) { note.event?.hashtags()?.toImmutableList() ?: persistentListOf() }
|
||||
DisplayUncitedHashtags(hashtags, eventContent, nav)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun RenderGitRepositoryEvent(
|
||||
baseNote: Note,
|
||||
|
||||
@@ -124,6 +124,7 @@ import com.vitorpamplona.amethyst.ui.note.ReactionsRow
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderAppDefinition
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderEmojiPack
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderFhirResource
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderGitIssueEvent
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderGitPatchEvent
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderGitRepositoryEvent
|
||||
import com.vitorpamplona.amethyst.ui.note.RenderPinListEvent
|
||||
@@ -166,6 +167,7 @@ import com.vitorpamplona.quartz.events.FhirResourceEvent
|
||||
import com.vitorpamplona.quartz.events.FileHeaderEvent
|
||||
import com.vitorpamplona.quartz.events.FileStorageHeaderEvent
|
||||
import com.vitorpamplona.quartz.events.GenericRepostEvent
|
||||
import com.vitorpamplona.quartz.events.GitIssueEvent
|
||||
import com.vitorpamplona.quartz.events.GitPatchEvent
|
||||
import com.vitorpamplona.quartz.events.GitRepositoryEvent
|
||||
import com.vitorpamplona.quartz.events.HighlightEvent
|
||||
@@ -554,6 +556,8 @@ fun NoteMaster(
|
||||
RenderGitRepositoryEvent(baseNote, accountViewModel, nav)
|
||||
} else if (noteEvent is GitPatchEvent) {
|
||||
RenderGitPatchEvent(baseNote, false, true, backgroundColor, accountViewModel, nav)
|
||||
} else if (noteEvent is GitIssueEvent) {
|
||||
RenderGitIssueEvent(baseNote, false, true, backgroundColor, accountViewModel, nav)
|
||||
} else if (noteEvent is AppDefinitionEvent) {
|
||||
RenderAppDefinition(baseNote, accountViewModel, nav)
|
||||
} else if (noteEvent is HighlightEvent) {
|
||||
@@ -576,7 +580,6 @@ fun NoteMaster(
|
||||
makeItShort = false,
|
||||
canPreview = true,
|
||||
backgroundColor,
|
||||
editState,
|
||||
accountViewModel,
|
||||
nav,
|
||||
)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<string name="your_profile_image">Tu imagen de perfil</string>
|
||||
<string name="scan_qr">Escanear el QR</string>
|
||||
<string name="show_anyway">Mostrar de todos modos</string>
|
||||
<string name="post_was_hidden">Esta publicación se ocultó porque menciona tus usuarios o palabras ocultas</string>
|
||||
<string name="post_was_flagged_as_inappropriate_by">Post marcado como inapropiado por</string>
|
||||
<string name="post_not_found">El evento se está cargando o no se puede encontrar en la lista de relés</string>
|
||||
<string name="channel_image">Imagen del canal</string>
|
||||
@@ -47,8 +48,12 @@
|
||||
<string name="view_count">Total de visualizaciones</string>
|
||||
<string name="boost">Impulsar</string>
|
||||
<string name="boosted">Impulsada</string>
|
||||
<string name="edited">editada</string>
|
||||
<string name="edited_number">edición #%1$s</string>
|
||||
<string name="original">original</string>
|
||||
<string name="quote">Citar</string>
|
||||
<string name="fork">Bifurcar</string>
|
||||
<string name="propose_an_edit">Proponer una edición</string>
|
||||
<string name="new_amount_in_sats">Nueva cantidad en sats</string>
|
||||
<string name="add">Añadir</string>
|
||||
<string name="replying_to">"respondiendo a "</string>
|
||||
@@ -670,4 +675,18 @@
|
||||
<string name="existed_since">OTS: %1$s</string>
|
||||
<string name="ots_info_title">Prueba de marca de tiempo</string>
|
||||
<string name="ots_info_description">Hay prueba de que esta publicación se firmó en algún momento antes de %1$s. La prueba se marcó en la cadena de bloques de Bitcoin en esa fecha y hora.</string>
|
||||
<string name="edit_post">Editar publicación</string>
|
||||
<string name="proposal_to_edit">Propuesta para mejorar una publicación</string>
|
||||
<string name="message_to_author">Resumen de cambios</string>
|
||||
<string name="message_to_author_placeholder">Correcciones rápidas…</string>
|
||||
<string name="accept_the_suggestion">Aceptar la sugerencia</string>
|
||||
<string name="accessibility_download_for_offline">Descargar</string>
|
||||
<string name="accessibility_lyrics_on">Letra activada</string>
|
||||
<string name="accessibility_lyrics_off">Letra desactivada</string>
|
||||
<string name="accessibility_turn_on_sealed_message">Mensaje sellado desactivado. Haz clic para activar el mensaje sellado.</string>
|
||||
<string name="accessibility_turn_off_sealed_message">Mensaje sellado activado. Haz clic para desactivar el mensaje sellado.</string>
|
||||
<string name="accessibility_send">Enviar</string>
|
||||
<string name="accessibility_play_username">Reproducir nombre de usuario como audio</string>
|
||||
<string name="accessibility_scan_qr_code">Escanear código QR</string>
|
||||
<string name="accessibility_navigate_to_alby">Ir al proveedor externo de monederos Alby</string>
|
||||
</resources>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<string name="your_profile_image">Tu imagen de perfil</string>
|
||||
<string name="scan_qr">Escanear código QR</string>
|
||||
<string name="show_anyway">Mostrar de todos modos</string>
|
||||
<string name="post_was_hidden">Esta publicación se ocultó porque menciona tus usuarios o palabras ocultas</string>
|
||||
<string name="post_was_flagged_as_inappropriate_by">La publicación fue reportada por</string>
|
||||
<string name="post_not_found">El evento se está cargando o no se puede encontrar en la lista de relés</string>
|
||||
<string name="channel_image">Imagen del canal</string>
|
||||
@@ -47,8 +48,12 @@
|
||||
<string name="view_count">Total de visualizaciones</string>
|
||||
<string name="boost">Impulsar</string>
|
||||
<string name="boosted">Impulsada</string>
|
||||
<string name="edited">editada</string>
|
||||
<string name="edited_number">edición #%1$s</string>
|
||||
<string name="original">original</string>
|
||||
<string name="quote">Cita</string>
|
||||
<string name="fork">Bifurcar</string>
|
||||
<string name="propose_an_edit">Proponer una edición</string>
|
||||
<string name="new_amount_in_sats">Nueva cantidad en sats</string>
|
||||
<string name="add">Agregar</string>
|
||||
<string name="replying_to">"respondiendo a "</string>
|
||||
@@ -670,4 +675,18 @@
|
||||
<string name="existed_since">OTS: %1$s</string>
|
||||
<string name="ots_info_title">Prueba de marca de tiempo</string>
|
||||
<string name="ots_info_description">Hay prueba de que esta publicación se firmó en algún momento antes de %1$s. La prueba se marcó en la cadena de bloques de Bitcoin en esa fecha y hora.</string>
|
||||
<string name="edit_post">Editar publicación</string>
|
||||
<string name="proposal_to_edit">Propuesta para mejorar una publicación</string>
|
||||
<string name="message_to_author">Resumen de cambios</string>
|
||||
<string name="message_to_author_placeholder">Correcciones rápidas…</string>
|
||||
<string name="accept_the_suggestion">Aceptar la sugerencia</string>
|
||||
<string name="accessibility_download_for_offline">Descargar</string>
|
||||
<string name="accessibility_lyrics_on">Letra activada</string>
|
||||
<string name="accessibility_lyrics_off">Letra desactivada</string>
|
||||
<string name="accessibility_turn_on_sealed_message">Mensaje sellado desactivado. Haz clic para activar el mensaje sellado.</string>
|
||||
<string name="accessibility_turn_off_sealed_message">Mensaje sellado activado. Haz clic para desactivar el mensaje sellado.</string>
|
||||
<string name="accessibility_send">Enviar</string>
|
||||
<string name="accessibility_play_username">Reproducir nombre de usuario como audio</string>
|
||||
<string name="accessibility_scan_qr_code">Escanear código QR</string>
|
||||
<string name="accessibility_navigate_to_alby">Ir al proveedor externo de billeteras Alby</string>
|
||||
</resources>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<string name="your_profile_image">Tu imagen de perfil</string>
|
||||
<string name="scan_qr">Escanear código QR</string>
|
||||
<string name="show_anyway">Mostrar de todos modos</string>
|
||||
<string name="post_was_hidden">Esta publicación se ocultó porque menciona tus usuarios o palabras ocultas</string>
|
||||
<string name="post_was_flagged_as_inappropriate_by">La publicación fue reportada por</string>
|
||||
<string name="post_not_found">El evento se está cargando o no se puede encontrar en la lista de relés</string>
|
||||
<string name="channel_image">Imagen del canal</string>
|
||||
@@ -47,8 +48,12 @@
|
||||
<string name="view_count">Total vistas</string>
|
||||
<string name="boost">Impulsar</string>
|
||||
<string name="boosted">Impulsada</string>
|
||||
<string name="edited">editada</string>
|
||||
<string name="edited_number">edición #%1$s</string>
|
||||
<string name="original">original</string>
|
||||
<string name="quote">Cita</string>
|
||||
<string name="fork">Bifurcar</string>
|
||||
<string name="propose_an_edit">Proponer una edición</string>
|
||||
<string name="new_amount_in_sats">Nueva cantidad en sats</string>
|
||||
<string name="add">Agregar</string>
|
||||
<string name="replying_to">"respondiendo a "</string>
|
||||
@@ -670,4 +675,18 @@
|
||||
<string name="existed_since">OTS: %1$s</string>
|
||||
<string name="ots_info_title">Prueba de marca de tiempo</string>
|
||||
<string name="ots_info_description">Hay prueba de que esta publicación se firmó en algún momento antes de %1$s. La prueba se marcó en la cadena de bloques de Bitcoin en esa fecha y hora.</string>
|
||||
<string name="edit_post">Editar publicación</string>
|
||||
<string name="proposal_to_edit">Propuesta para mejorar una publicación</string>
|
||||
<string name="message_to_author">Resumen de cambios</string>
|
||||
<string name="message_to_author_placeholder">Correcciones rápidas…</string>
|
||||
<string name="accept_the_suggestion">Aceptar la sugerencia</string>
|
||||
<string name="accessibility_download_for_offline">Descargar</string>
|
||||
<string name="accessibility_lyrics_on">Letra activada</string>
|
||||
<string name="accessibility_lyrics_off">Letra desactivada</string>
|
||||
<string name="accessibility_turn_on_sealed_message">Mensaje sellado desactivado. Haz clic para activar el mensaje sellado.</string>
|
||||
<string name="accessibility_turn_off_sealed_message">Mensaje sellado activado. Haz clic para desactivar el mensaje sellado.</string>
|
||||
<string name="accessibility_send">Enviar</string>
|
||||
<string name="accessibility_play_username">Reproducir nombre de usuario como audio</string>
|
||||
<string name="accessibility_scan_qr_code">Escanear código QR</string>
|
||||
<string name="accessibility_navigate_to_alby">Ir al proveedor externo de billeteras Alby</string>
|
||||
</resources>
|
||||
|
||||
@@ -3,8 +3,10 @@
|
||||
<string name="point_to_the_qr_code">สแกน Qr Code</string>
|
||||
<string name="show_qr">โชว์ QR</string>
|
||||
<string name="profile_image">รูปโปรไฟล์</string>
|
||||
<string name="your_profile_image">รูปโปรไฟล์</string>
|
||||
<string name="scan_qr">แสกน QR</string>
|
||||
<string name="show_anyway">แสดง</string>
|
||||
<string name="post_was_hidden">โน๊ตนี้ถูกซ่อนเนื่องจากมีเนื้อหา หรือผู้ใช้ ที่ท่านไม่อยากเห็น</string>
|
||||
<string name="post_was_flagged_as_inappropriate_by">โพสต์ถูกรายงานว่าไม่เหมาะสมโดย</string>
|
||||
<string name="post_not_found">ไม่พบโพสต์นี้</string>
|
||||
<string name="channel_image">รูปของ channel</string>
|
||||
@@ -15,6 +17,7 @@
|
||||
<string name="spam">สแปม</string>
|
||||
<string name="impersonation">เลียนแบบ</string>
|
||||
<string name="illegal_behavior">พฤติกรรมที่ผิดกฎหมาย</string>
|
||||
<string name="other">อื่นๆ</string>
|
||||
<string name="unknown">ไม่ทราบ</string>
|
||||
<string name="relay_icon">รีเลย์ไอคอน</string>
|
||||
<string name="unknown_author">ไม่ทราบผู้เขียน</string>
|
||||
@@ -22,6 +25,8 @@
|
||||
<string name="copy_user_pubkey">คัดลอก ID ผู้เขียน</string>
|
||||
<string name="copy_note_id">คัดลอก ID โน้ต</string>
|
||||
<string name="broadcast">เพยแพร่</string>
|
||||
<string name="timestamp_it">ประทับเวลา</string>
|
||||
<string name="timestamp_pending">กำลังรอยืนยันการประทับเวลา</string>
|
||||
<string name="request_deletion">ส่งคำขอให้ลบ</string>
|
||||
<string name="block_report">บล๊อก / รายงาน</string>
|
||||
<string name="block_hide_user"><![CDATA[บล๊อก & ซ่อนผู้ใช้นี้]]></string>
|
||||
|
||||
@@ -797,7 +797,7 @@
|
||||
<string name="ots_info_description">There\'s proof this post was signed sometime before %1$s. The proof was stamped in the Bitcoin blockchain at that date and time.</string>
|
||||
|
||||
<string name="edit_post">Edit Post</string>
|
||||
<string name="proposal_to_edit">Proposal to improve your post</string>
|
||||
<string name="proposal_to_edit">Proposal to improve a post</string>
|
||||
<string name="message_to_author">Summary of changes</string>
|
||||
<string name="message_to_author_placeholder">Quick fixes…</string>
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ import com.fasterxml.jackson.databind.JsonNode
|
||||
import com.fasterxml.jackson.databind.deser.std.StdDeserializer
|
||||
import com.fasterxml.jackson.databind.module.SimpleModule
|
||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
||||
import com.fasterxml.jackson.module.kotlin.readValue
|
||||
import com.vitorpamplona.quartz.encoders.HexKey
|
||||
import com.vitorpamplona.quartz.events.Event
|
||||
import com.vitorpamplona.quartz.events.EventInterface
|
||||
import com.vitorpamplona.quartz.events.LnZapRequestEvent
|
||||
|
||||
@@ -90,9 +90,7 @@ class Result(
|
||||
* Parses the json with a string of events to an Array of Event objects.
|
||||
*/
|
||||
fun fromJsonArray(json: String): Array<Result> {
|
||||
return Event.mapper.readTree(json).map {
|
||||
fromJson(it.asText())
|
||||
}.toTypedArray()
|
||||
return mapper.readValue(json)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user