Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions flipchatApp/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<!-- region rooms -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
Expand All @@ -72,6 +73,48 @@
<data android:pathPrefix="/room" />
</intent-filter>

<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="app.flipchat.xyz" />
<data android:pathPrefix="/id" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="flipchat" />
<data android:host="app.flipchat.xyz" />
<data android:pathPrefix="/id" />
</intent-filter>

<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="https" />
<data android:host="app.flipchat.xyz" />
<data android:pathPrefix="/number" />
</intent-filter>

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data android:scheme="flipchat" />
<data android:host="app.flipchat.xyz" />
<data android:pathPrefix="/number" />
</intent-filter>
<!-- endregion rooms -->

<!-- region login -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
Expand All @@ -91,7 +134,9 @@
<data android:host="app.flipchat.xyz" />
<data android:pathPrefix="/login" />
</intent-filter>
<!-- endregion login -->

<!-- region user -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
Expand All @@ -111,6 +156,7 @@
<data android:host="app.flipchat.xyz" />
<data android:pathPrefix="/user" />
</intent-filter>
<!-- endregion user -->
</activity>

<!--
Expand Down
6 changes: 6 additions & 0 deletions flipchatApp/src/main/kotlin/xyz/flipchat/app/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import androidx.compose.runtime.CompositionLocalProvider
import androidx.fragment.app.FragmentActivity
import com.getcode.libs.opengraph.LocalOpenGraphParser
import com.getcode.libs.opengraph.OpenGraphParser
import com.getcode.network.BalanceController
import com.getcode.network.LocalBalanceController
import com.getcode.network.client.Client
import com.getcode.network.exchange.ExchangeNull
import com.getcode.network.exchange.LocalExchange
Expand Down Expand Up @@ -73,6 +75,9 @@ class MainActivity : FragmentActivity() {
@Inject
lateinit var openGraphParser: OpenGraphParser

@Inject
lateinit var balanceController: BalanceController

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
handleUncaughtException()
Expand All @@ -90,6 +95,7 @@ class MainActivity : FragmentActivity() {
LocalLabs provides betaFeatures,
LocalBillingClient provides iapController,
LocalOpenGraphParser provides openGraphParser,
LocalBalanceController provides balanceController,
) {
Rinku {
App(tipsEngine = tipsEngine)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ import com.getcode.util.resources.LocalResources
import com.getcode.utils.Kin
import com.getcode.utils.formatAmountString
import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeoutOrNull
import xyz.flipchat.app.R

@Composable
Expand Down Expand Up @@ -121,14 +122,18 @@ fun ConversationChatInput(
}
}

var wasKeyboardVisible by remember { mutableStateOf(false) }

LaunchedEffect(keyboardVisible) {
delay(300)
if (!keyboardVisible) {
if (chattableState is ChattableState.TemporarilyEnabled) {
if (wasKeyboardVisible && !keyboardVisible) {
delay(150) // Short delay to prevent accidental blips
if (!keyboardVisible && chattableState is ChattableState.TemporarilyEnabled) {
dispatchEvent(ConversationViewModel.Event.ResetToSpectator)
}
}
wasKeyboardVisible = keyboardVisible
}

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ import xyz.flipchat.services.data.metadata.SendMessageAsListenerPaymentMetadata
import xyz.flipchat.services.data.metadata.SendTipMessagePaymentMetadata
import xyz.flipchat.services.data.metadata.erased
import xyz.flipchat.services.data.metadata.typeUrl
import xyz.flipchat.services.domain.model.chat.ConversationMember
import xyz.flipchat.services.domain.model.chat.ConversationMemberWithPersonalInfo
import xyz.flipchat.services.domain.model.chat.ConversationMessage
import xyz.flipchat.services.domain.model.chat.ConversationWithMembersAndLastPointers
import xyz.flipchat.services.extensions.titleOrFallback
Expand Down Expand Up @@ -1004,13 +1004,13 @@ class ConversationViewModel @Inject constructor(
},
sender = Sender(
id = reply.message.senderId,
profileImage = reply.member?.imageUri.takeIf {
profileImage = reply.personalInfo?.imageUri.takeIf {
it.orEmpty().isNotEmpty()
},
isFullMember = reply.member?.isFullMember == true,
displayName = reply.member?.memberName ?: "Deleted",
displayName = reply.personalInfo?.memberName.orEmpty().ifEmpty { "Member" },
isSelf = reply.contentEntity.isFromSelf,
isBlocked = reply.member?.isBlocked == true,
isBlocked = reply.personalInfo?.isBlocked == true,
isHost = reply.message.senderId == currentState.hostId && !contents.isFromSelf,
)
)
Expand All @@ -1022,16 +1022,16 @@ class ConversationViewModel @Inject constructor(
currentState.isTippingEnabled && !userManager.isSelf(message.senderId)

val tips = if (currentState.isTippingEnabled && tipInfo.isNotEmpty()) {
tipInfo.map { (tip, member) ->
tipInfo.map { (tip, member, user) ->
MessageTip(
amount = tip.kin,
tipper = Sender(
id = member?.id,
profileImage = member?.imageUri.nullIfEmpty(),
displayName = member?.memberName,
profileImage = user?.imageUri.nullIfEmpty(),
displayName = user?.memberName,
isHost = member?.isHost ?: false,
isSelf = userManager.isSelf(member?.id),
isBlocked = member?.isBlocked ?: false,
isBlocked = user?.isBlocked ?: false,
)
)
}
Expand Down Expand Up @@ -1063,7 +1063,7 @@ class ConversationViewModel @Inject constructor(
sender = Sender(
id = message.senderId,
profileImage = member?.imageUri.takeIf { it.orEmpty().isNotEmpty() },
displayName = member?.memberName ?: "Deleted",
displayName = member?.displayName.orEmpty().ifEmpty { "Member" },
isSelf = contents.isFromSelf,
isFullMember = member?.isFullMember == true,
isHost = message.senderId == currentState.hostId,
Expand Down Expand Up @@ -1119,20 +1119,20 @@ class ConversationViewModel @Inject constructor(

private fun buildMessageActions(
message: ConversationMessage,
member: ConversationMember?,
member: ConversationMemberWithPersonalInfo?,
contents: MessageContent,
enableReply: Boolean,
enableTip: Boolean,
): List<MessageControlAction> {
return mutableListOf<MessageControlAction>().apply {
if (stateFlow.value.isHost) {
if (member?.memberName?.isNotEmpty() == true && !contents.isFromSelf) {
if (member?.displayName?.isNotEmpty() == true && !contents.isFromSelf) {
if (member.isFullMember) {
add(
MessageControlAction.DemoteUser {
confirmUserDemote(
conversationId = message.conversationId,
user = member.memberName,
user = member.displayName,
userId = message.senderId
)
}
Expand All @@ -1142,7 +1142,7 @@ class ConversationViewModel @Inject constructor(
MessageControlAction.PromoteUser {
confirmUserPromote(
conversationId = message.conversationId,
user = member.memberName,
user = member.displayName,
userId = message.senderId
)
}
Expand All @@ -1157,7 +1157,7 @@ class ConversationViewModel @Inject constructor(
val sender = Sender(
id = message.senderId,
profileImage = member?.imageUri.takeIf { it.orEmpty().isNotEmpty() },
displayName = member?.memberName ?: "Deleted",
displayName = member?.displayName ?: "Deleted",
isSelf = contents.isFromSelf,
isHost = message.senderId == stateFlow.value.hostId && !contents.isFromSelf,
isBlocked = member?.isBlocked == true
Expand Down Expand Up @@ -1193,7 +1193,7 @@ class ConversationViewModel @Inject constructor(

private fun buildSelfDefenseControls(
message: ConversationMessage,
member: ConversationMember?,
member: ConversationMemberWithPersonalInfo?,
contents: MessageContent
): List<MessageControlAction> {
return mutableListOf<MessageControlAction>().apply {
Expand All @@ -1211,7 +1211,7 @@ class ConversationViewModel @Inject constructor(


if (stateFlow.value.isHost) {
if (member?.memberName?.isNotEmpty() == true && !contents.isFromSelf) {
if (member?.displayName?.isNotEmpty() == true && !contents.isFromSelf) {
// add(
// MessageControlAction.RemoveUser(member.memberName.orEmpty()) {
// confirmUserRemoval(
Expand All @@ -1225,7 +1225,7 @@ class ConversationViewModel @Inject constructor(
MessageControlAction.MuteUser {
confirmUserMute(
conversationId = message.conversationId,
user = member.memberName,
user = member.displayName,
userId = message.senderId,
)
}
Expand All @@ -1238,14 +1238,14 @@ class ConversationViewModel @Inject constructor(
if (member.isBlocked) {
add(
MessageControlAction.UnblockUser {
dispatchEvent(Event.UnblockUser(member.id))
dispatchEvent(Event.UnblockUser(message.senderId))
}
)
} else {
add(
MessageControlAction.BlockUser {
confirmUserBlock(
user = member.memberName,
user = member.displayName,
userId = message.senderId,
)
}
Expand All @@ -1254,9 +1254,9 @@ class ConversationViewModel @Inject constructor(
}

add(
MessageControlAction.ReportUserForMessage(member?.memberName.orEmpty()) {
MessageControlAction.ReportUserForMessage(member?.displayName.orEmpty()) {
confirmUserReport(
user = member?.memberName,
user = member?.displayName,
userId = message.senderId,
messageId = message.id
)
Expand Down Expand Up @@ -1487,7 +1487,7 @@ class ConversationViewModel @Inject constructor(
roomId = conversation.id,
roomNumber = conversation.roomNumber,
ownerId = conversation.ownerId,
hostName = host?.memberName,
hostName = host?.displayName,
memberCount = members.count(),
messagingFeeQuarks = conversation.coverCharge.quarks
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ class ChatInfoViewModel @Inject constructor(
members.map { m ->
MinimalMember(
id = m.id,
displayName = m.memberName.nullIfEmpty(),
displayName = m.displayName.nullIfEmpty(),
profileImageUrl = m.imageUri,
isHost = m.isHost,
canSpeak = m.isFullMember,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,7 @@ class RoomInfoScreen(
buildActions(
state,
viewModel::dispatchEvent
),
ContextMenuStyle.Themed
)
)
)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
package xyz.flipchat.app.features.payments

import androidx.activity.compose.BackHandler
import androidx.compose.animation.core.animateFloatAsState
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource
import cafe.adriel.voyager.navigator.currentOrThrow
import com.getcode.model.Currency
import com.getcode.model.KinAmount
import com.getcode.model.Rate
import com.getcode.model.kin
import com.getcode.models.ConfirmationState
import com.getcode.models.MessageTipPaymentConfirmation
import com.getcode.network.LocalBalanceController
import com.getcode.theme.CodeTheme
import com.getcode.ui.components.Modal
import com.getcode.ui.components.SlideToConfirm
Expand Down Expand Up @@ -58,11 +62,18 @@ internal fun MessageTipPaymentConfirmation(
)
}

val balanceController = LocalBalanceController.currentOrThrow
val currentBalance by balanceController.formattedBalance.collectAsState()

BackHandler {
onCancel()
}

Modal(modifier) {
if (state != null) {
MessageTipConfirmationContent(
pickerState = pickerState,
balance = confirmation?.balance,
balance = currentBalance?.formattedValue,
isSending = isSending,
state = state,
onApproved = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import com.getcode.models.BillState
import com.getcode.theme.Black40
import com.getcode.ui.modals.TipConfirmation
import com.getcode.ui.utils.AnimationUtils
import com.getcode.ui.utils.ModalAnimationSpeed
import com.getcode.ui.utils.rememberedClickable
Expand Down Expand Up @@ -45,7 +44,7 @@ fun PaymentScaffold(content: @Composable () -> Unit) {
interactionSource = remember { MutableInteractionSource() }
) {
if (scrimDetails.cancellable) {
payments.cancelPayment()
payments.cancelPayment(fromUser = true)
}
}
)
Expand Down Expand Up @@ -73,7 +72,7 @@ fun PaymentScaffold(content: @Composable () -> Unit) {

AnimatedContent(
modifier = Modifier.align(BottomCenter),
targetState = state.billState.messageTipPaymentConfirmation?.balance,
targetState = state.billState.messageTipPaymentConfirmation?.metadata,
transitionSpec = AnimationUtils.modalAnimationSpec(speed = ModalAnimationSpeed.Fast),
label = "message tip payments",
) {
Expand Down
Loading