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
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.anytypeio.anytype.ui.widgets.types
import android.content.res.Configuration.UI_MODE_NIGHT_NO
import android.content.res.Configuration.UI_MODE_NIGHT_YES
import androidx.annotation.StringRes
import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
Expand All @@ -11,6 +12,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
Expand All @@ -19,6 +21,7 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.Divider
import androidx.compose.material.Text
Expand All @@ -32,6 +35,7 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.ParagraphStyle
import androidx.compose.ui.text.buildAnnotatedString
Expand All @@ -52,6 +56,7 @@ import com.anytypeio.anytype.core_models.Relations
import com.anytypeio.anytype.core_ui.features.wallpaper.gradient
import com.anytypeio.anytype.core_ui.foundation.noRippleClickable
import com.anytypeio.anytype.core_ui.views.Caption1Medium
import com.anytypeio.anytype.core_ui.views.Caption1Regular
import com.anytypeio.anytype.core_ui.views.PreviewTitle2Medium
import com.anytypeio.anytype.core_ui.views.Relations3
import com.anytypeio.anytype.core_ui.widgets.ListWidgetObjectIcon
Expand Down Expand Up @@ -131,7 +136,8 @@ fun DataViewListWidgetCard(
icon = element.objectIcon,
mode = mode,
onObjectCheckboxClicked = onObjectCheckboxClicked,
name = element.getPrettyName()
name = element.getPrettyName(),
counter = element.counter
)
if (idx != item.elements.lastIndex) {
Divider(
Expand Down Expand Up @@ -338,7 +344,8 @@ fun ListWidgetElement(
onObjectCheckboxClicked: (Id, Boolean) -> Unit,
icon: ObjectIcon,
obj: ObjectWrapper.Basic,
name: String
name: String,
counter: WidgetView.ChatCounter? = null
) {
Box(
modifier = Modifier
Expand Down Expand Up @@ -400,6 +407,52 @@ fun ListWidgetElement(
)
)
}

if (counter != null) {
androidx.compose.foundation.layout.Row(
modifier = Modifier.align(Alignment.CenterEnd),
verticalAlignment = Alignment.CenterVertically
) {
if (counter.unreadMentionCount > 0) {
Box(
modifier = Modifier
.background(
color = colorResource(R.color.color_accent),
shape = CircleShape
)
.size(20.dp),
contentAlignment = Alignment.Center
) {
Image(
painter = painterResource(R.drawable.ic_chat_widget_mention),
contentDescription = null
)
}
}
if (counter.unreadMessageCount > 0) {
if (counter.unreadMentionCount > 0) {
Spacer(modifier = Modifier.width(8.dp))
}
Box(
modifier = Modifier
.height(20.dp)
.defaultMinSize(minWidth = 20.dp)
.background(
color = colorResource(R.color.color_accent),
shape = CircleShape
),
contentAlignment = Alignment.Center
) {
Text(
modifier = Modifier.padding(horizontal = 6.dp),
text = counter.unreadMessageCount.toString(),
style = Caption1Regular,
color = colorResource(id = R.color.text_white),
)
}
}
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,30 @@
package com.anytypeio.anytype.ui.widgets.types

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_ui.views.Caption1Regular
import com.anytypeio.anytype.core_ui.views.HeadlineSubheading
import com.anytypeio.anytype.core_ui.widgets.ListWidgetObjectIcon
import com.anytypeio.anytype.presentation.widgets.DropDownMenuAction
Expand Down Expand Up @@ -62,11 +71,58 @@ fun LinkWidgetCard(
style = HeadlineSubheading,
color = colorResource(id = R.color.text_primary),
)

// Display counter if present
item.counter?.let { counter ->
if (counter.unreadMentionCount > 0) {
Box(
modifier = Modifier
.background(
color = colorResource(R.color.color_accent),
shape = CircleShape
)
.size(20.dp),
contentAlignment = Alignment.Center
) {
Image(
painter = painterResource(R.drawable.ic_chat_widget_mention),
contentDescription = null
)
}
if (counter.unreadMessageCount == 0) {
Spacer(modifier = Modifier.width(16.dp))
}
}

if (counter.unreadMessageCount > 0) {
if (counter.unreadMentionCount > 0) {
Spacer(modifier = Modifier.width(8.dp))
}
Box(
modifier = Modifier
.height(20.dp)
.defaultMinSize(minWidth = 20.dp)
.background(
color = colorResource(R.color.color_accent),
shape = CircleShape
),
contentAlignment = Alignment.Center
) {
Text(
modifier = Modifier.padding(horizontal = 6.dp),
text = counter.unreadMessageCount.toString(),
style = Caption1Regular,
color = colorResource(id = R.color.text_white),
)
}
Spacer(modifier = Modifier.width(16.dp))
}
}
}
WidgetLongClickMenu(
menuItems = menuItems,
isCardMenuExpanded = isCardMenuExpanded,
onDropDownMenuAction = onDropDownMenuAction
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
package com.anytypeio.anytype.ui.widgets.types

import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Divider
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
Expand All @@ -15,13 +21,15 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import com.anytypeio.anytype.R
import com.anytypeio.anytype.core_models.Id
import com.anytypeio.anytype.core_models.ObjectWrapper
import com.anytypeio.anytype.core_ui.foundation.noRippleClickable
import com.anytypeio.anytype.core_ui.views.Caption1Regular
import com.anytypeio.anytype.core_ui.views.PreviewTitle2Medium
import com.anytypeio.anytype.core_ui.widgets.ListWidgetObjectIcon
import com.anytypeio.anytype.presentation.home.InteractionMode
Expand Down Expand Up @@ -84,7 +92,8 @@ fun ListWidgetCard(
icon = element.objectIcon,
mode = mode,
onObjectCheckboxClicked = onObjectCheckboxClicked,
name = element.getPrettyName()
name = element.getPrettyName(),
counter = element.counter
)
if (idx != item.elements.lastIndex) {
Divider(
Expand Down Expand Up @@ -186,6 +195,53 @@ fun CompactListWidgetList(
style = PreviewTitle2Medium,
color = color
)

val counter = element.counter

if (counter != null) {
Row(
verticalAlignment = Alignment.CenterVertically
) {
if (counter.unreadMentionCount > 0) {
Box(
modifier = Modifier
.background(
color = colorResource(R.color.color_accent),
shape = CircleShape
)
.size(20.dp),
contentAlignment = Alignment.Center
) {
Image(
painter = painterResource(R.drawable.ic_chat_widget_mention),
contentDescription = null
)
}
}
if (counter.unreadMessageCount > 0) {
if (counter.unreadMentionCount > 0) {
Spacer(modifier = Modifier.width(8.dp))
}
Box(
modifier = Modifier
.height(20.dp)
.defaultMinSize(minWidth = 20.dp)
.background(
color = colorResource(R.color.color_accent),
shape = CircleShape
),
contentAlignment = Alignment.Center
) {
Text(
modifier = Modifier.padding(horizontal = 6.dp),
text = counter.unreadMessageCount.toString(),
style = Caption1Regular,
color = colorResource(id = R.color.text_white),
)
}
}
}
}
}
if (idx != elements.lastIndex) {
Divider(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ interface ChatPreviewContainer {
* @return Flow of chat preview for the space, or null if not found
*/
fun observePreviewBySpaceId(spaceId: SpaceId): Flow<Chat.Preview?>
fun observePreviewsBySpaceId(spaceId: SpaceId): Flow<List<Chat.Preview>>

sealed interface PreviewState {
object Loading : PreviewState
Expand Down Expand Up @@ -140,11 +141,24 @@ interface ChatPreviewContainer {
@OptIn(ExperimentalCoroutinesApi::class)
override fun observePreviewsWithAttachments(): Flow<PreviewState> = previewsState

/**
* Need to be refactored in the context of multi chats,
* since one space can have more than one chat now,
* more than one preview
*/
override fun observePreviewBySpaceId(spaceId: SpaceId): Flow<Chat.Preview?> =
previews
.map { list -> list?.find { it.space == spaceId } }
.distinctUntilChanged()

override fun observePreviewsBySpaceId(spaceId: SpaceId): Flow<List<Chat.Preview>> {
return previews.map { list ->
list?.filter { preview ->
preview.space == spaceId
} ?: emptyList()
}
}

private suspend fun collectEvents(initial: List<Chat.Preview>) {
events.subscribe(SUBSCRIPTION_ID)
.scan(initial = initial) { previews, batch ->
Expand Down
Loading