wip
This commit is contained in:
parent
13b34c90de
commit
6a167f6c2c
|
@ -1,5 +1,6 @@
|
|||
import CoreLocation
|
||||
import Foundation
|
||||
import SwiftUI
|
||||
|
||||
extension String {
|
||||
var firstLetter: String {
|
||||
|
@ -57,3 +58,49 @@ extension String {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension String {
|
||||
var firstLetterColor: Color {
|
||||
let firstLetter = self.firstLetter
|
||||
switch firstLetter {
|
||||
case "A", "M", "Y":
|
||||
return Color.Rainbow.tortoiseLight500
|
||||
|
||||
case "B", "N", "Z":
|
||||
return Color.Rainbow.orangeLight500
|
||||
|
||||
case "C", "O":
|
||||
return Color.Rainbow.yellowLight500
|
||||
|
||||
case "D", "P":
|
||||
return Color.Rainbow.greenLight500
|
||||
|
||||
case "E", "Q":
|
||||
return Color.Rainbow.blueLight500
|
||||
|
||||
case "F", "R":
|
||||
return Color.Rainbow.magentaLight500
|
||||
|
||||
case "G", "S":
|
||||
return Color.Rainbow.tortoiseDark500
|
||||
|
||||
case "H", "T":
|
||||
return Color.Rainbow.orangeDark500
|
||||
|
||||
case "I", "U":
|
||||
return Color.Rainbow.yellowDark500
|
||||
|
||||
case "J", "V":
|
||||
return Color.Rainbow.greenDark500
|
||||
|
||||
case "K", "W":
|
||||
return Color.Rainbow.blueDark500
|
||||
|
||||
case "L", "X":
|
||||
return Color.Rainbow.magentaDark500
|
||||
|
||||
default:
|
||||
return Color.Rainbow.tortoiseLight500
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,22 +24,22 @@ struct ChatsCreateMainScreen: View {
|
|||
|
||||
// List
|
||||
List {
|
||||
ChatsCreateRowButton(
|
||||
title: L10n.Chats.Create.Main.createGroup,
|
||||
image: "person.2.fill",
|
||||
action: {}
|
||||
)
|
||||
ChatsCreateRowButton(
|
||||
title: L10n.Chats.Create.Main.createPrivateGroup,
|
||||
image: "person.2.fill",
|
||||
action: {}
|
||||
)
|
||||
ChatsCreateRowButton(
|
||||
title: L10n.Chats.Create.Main.findGroup,
|
||||
image: "magnifyingglass",
|
||||
action: {}
|
||||
)
|
||||
|
||||
// ChatsCreateRowButton(
|
||||
// title: L10n.Chats.Create.Main.createGroup,
|
||||
// image: "person.2.fill",
|
||||
// action: {}
|
||||
// )
|
||||
// ChatsCreateRowButton(
|
||||
// title: L10n.Chats.Create.Main.createPrivateGroup,
|
||||
// image: "person.2.fill",
|
||||
// action: {}
|
||||
// )
|
||||
// ChatsCreateRowButton(
|
||||
// title: L10n.Chats.Create.Main.findGroup,
|
||||
// image: "magnifyingglass",
|
||||
// action: {}
|
||||
// )
|
||||
|
||||
// for contacts list
|
||||
let rosters = store.state.rostersState.rosters.filter { !$0.locallyDeleted }
|
||||
if rosters.isEmpty {
|
||||
|
@ -54,37 +54,37 @@ struct ChatsCreateMainScreen: View {
|
|||
}
|
||||
}
|
||||
|
||||
private struct ChatsCreateRowButton: View {
|
||||
var title: String
|
||||
var image: String
|
||||
var action: () -> Void
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .center, spacing: 0) {
|
||||
Spacer()
|
||||
HStack(alignment: .center, spacing: 16) {
|
||||
Image(systemName: image)
|
||||
.font(.head2)
|
||||
.foregroundColor(.Material.Elements.active)
|
||||
.padding(.leading, 16)
|
||||
Text(title)
|
||||
.font(.body1)
|
||||
.foregroundColor(.Material.Text.main)
|
||||
Spacer()
|
||||
}
|
||||
Spacer()
|
||||
Rectangle()
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 1)
|
||||
.foregroundColor(.Material.Background.dark)
|
||||
}
|
||||
.sharedListRow()
|
||||
.frame(height: 48)
|
||||
.onTapGesture {
|
||||
action()
|
||||
}
|
||||
}
|
||||
}
|
||||
// private struct ChatsCreateRowButton: View {
|
||||
// var title: String
|
||||
// var image: String
|
||||
// var action: () -> Void
|
||||
//
|
||||
// var body: some View {
|
||||
// VStack(alignment: .center, spacing: 0) {
|
||||
// Spacer()
|
||||
// HStack(alignment: .center, spacing: 16) {
|
||||
// Image(systemName: image)
|
||||
// .font(.head2)
|
||||
// .foregroundColor(.Material.Elements.active)
|
||||
// .padding(.leading, 16)
|
||||
// Text(title)
|
||||
// .font(.body1)
|
||||
// .foregroundColor(.Material.Text.main)
|
||||
// Spacer()
|
||||
// }
|
||||
// Spacer()
|
||||
// Rectangle()
|
||||
// .frame(maxWidth: .infinity)
|
||||
// .frame(height: 1)
|
||||
// .foregroundColor(.Material.Background.dark)
|
||||
// }
|
||||
// .sharedListRow()
|
||||
// .frame(height: 48)
|
||||
// .onTapGesture {
|
||||
// action()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
private struct ChatsCreateRowSeparator: View {
|
||||
var body: some View {
|
||||
|
@ -175,7 +175,7 @@ private struct ChatsCreateRowSeparator: View {
|
|||
state.rostersState.rosters = [
|
||||
.init(contactBareJid: "test@me.com", subscription: "both", ask: true, data: .init(groups: [], annotations: []))
|
||||
]
|
||||
|
||||
|
||||
return state
|
||||
}
|
||||
}
|
||||
|
|
|
@ -53,31 +53,9 @@ private struct ChatsRow: View {
|
|||
var chat: Chat
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
HStack(spacing: 8) {
|
||||
ZStack {
|
||||
Circle()
|
||||
.frame(width: 44, height: 44)
|
||||
.foregroundColor(.red)
|
||||
Text(chat.participant.firstLetter)
|
||||
.foregroundColor(.white)
|
||||
.font(.body1)
|
||||
}
|
||||
Text(chat.participant)
|
||||
.foregroundColor(Color.Material.Text.main)
|
||||
.font(.body2)
|
||||
Spacer()
|
||||
SharedListRow(iconType: .charCircle(chat.participant), text: chat.participant)
|
||||
.onTapGesture {
|
||||
store.dispatch(.chatsAction(.startChat(accountJid: chat.account, participantJid: chat.participant)))
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 4)
|
||||
Rectangle()
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 1)
|
||||
.foregroundColor(.Material.Background.dark)
|
||||
}
|
||||
.sharedListRow()
|
||||
.onTapGesture {
|
||||
store.dispatch(.chatsAction(.startChat(accountJid: chat.account, participantJid: chat.participant)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,29 +76,33 @@ private struct ContactsScreenRow: View {
|
|||
@Binding var isShowingLoader: Bool
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
HStack(spacing: 8) {
|
||||
ZStack {
|
||||
Circle()
|
||||
.frame(width: 44, height: 44)
|
||||
.foregroundColor(.red)
|
||||
Text(roster.name?.firstLetter ?? roster.contactBareJid.firstLetter)
|
||||
.foregroundColor(.white)
|
||||
.font(.body1)
|
||||
}
|
||||
Text(roster.contactBareJid)
|
||||
.foregroundColor(Color.Material.Text.main)
|
||||
.font(.body2)
|
||||
Spacer()
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 4)
|
||||
Rectangle()
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 1)
|
||||
.foregroundColor(.Material.Background.dark)
|
||||
}
|
||||
.sharedListRow()
|
||||
SharedListRow(
|
||||
iconType: .charCircle(roster.name?.firstLetter ?? roster.contactBareJid.firstLetter),
|
||||
text: roster.contactBareJid
|
||||
)
|
||||
// VStack(spacing: 0) {
|
||||
// HStack(spacing: 8) {
|
||||
// ZStack {
|
||||
// Circle()
|
||||
// .frame(width: 44, height: 44)
|
||||
// .foregroundColor(.red)
|
||||
// Text(roster.name?.firstLetter ?? roster.contactBareJid.firstLetter)
|
||||
// .foregroundColor(.white)
|
||||
// .font(.body1)
|
||||
// }
|
||||
// Text(roster.contactBareJid)
|
||||
// .foregroundColor(Color.Material.Text.main)
|
||||
// .font(.body2)
|
||||
// Spacer()
|
||||
// }
|
||||
// .padding(.horizontal, 16)
|
||||
// .padding(.vertical, 4)
|
||||
// Rectangle()
|
||||
// .frame(maxWidth: .infinity)
|
||||
// .frame(height: 1)
|
||||
// .foregroundColor(.Material.Background.dark)
|
||||
// }
|
||||
// .sharedListRow()
|
||||
.onTapGesture {
|
||||
store.dispatch(.chatsAction(.startChat(accountJid: roster.bareJid, participantJid: roster.contactBareJid)))
|
||||
}
|
||||
|
|
|
@ -77,8 +77,8 @@ private struct ContactView: View {
|
|||
ZStack {
|
||||
Circle()
|
||||
.frame(width: 44, height: 44)
|
||||
.foregroundColor(.red)
|
||||
Text(message.body?.getContactJid.firstLetter ?? "?")
|
||||
.foregroundColor(contactName.firstLetterColor)
|
||||
Text(contactName.firstLetter)
|
||||
.foregroundColor(.white)
|
||||
.font(.body1)
|
||||
}
|
||||
|
@ -92,6 +92,10 @@ private struct ContactView: View {
|
|||
// TODO: Jump to add roster from here
|
||||
}
|
||||
}
|
||||
|
||||
private var contactName: String {
|
||||
message.body?.getContactJid ?? "?"
|
||||
}
|
||||
}
|
||||
|
||||
private struct AttachmentView: View {
|
||||
|
|
|
@ -57,7 +57,10 @@ struct ConversationMessageRow: View {
|
|||
}
|
||||
)
|
||||
}
|
||||
.sharedListRow()
|
||||
.listRowInsets(.zero)
|
||||
.listRowSeparator(.hidden)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.background(Color.Material.Background.light)
|
||||
}
|
||||
|
||||
private func isOutgoing() -> Bool {
|
||||
|
|
|
@ -53,35 +53,10 @@ private struct ContactRow: View {
|
|||
@Binding var selectedContact: Roster?
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
HStack(spacing: 8) {
|
||||
ZStack {
|
||||
Circle()
|
||||
.frame(width: 44, height: 44)
|
||||
.foregroundColor(.red)
|
||||
Text(roster.name?.firstLetter ?? roster.contactBareJid.firstLetter)
|
||||
.foregroundColor(.white)
|
||||
.font(.body1)
|
||||
}
|
||||
Text(roster.contactBareJid)
|
||||
.foregroundColor(Color.Material.Text.main)
|
||||
.font(.body2)
|
||||
Spacer()
|
||||
if selectedContact == roster {
|
||||
Image(systemName: "checkmark")
|
||||
.foregroundColor(.Material.Text.main)
|
||||
.font(.body1)
|
||||
.padding(.trailing, 8)
|
||||
}
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 4)
|
||||
Rectangle()
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 1)
|
||||
.foregroundColor(.Material.Background.dark)
|
||||
}
|
||||
.sharedListRow()
|
||||
SharedListRow(
|
||||
iconType: .charCircle(roster.name?.firstLetter ?? roster.contactBareJid.firstLetter),
|
||||
text: roster.contactBareJid
|
||||
)
|
||||
.onTapGesture {
|
||||
selectedContact = roster
|
||||
}
|
||||
|
|
|
@ -1,17 +1,59 @@
|
|||
import SwiftUI
|
||||
|
||||
extension View {
|
||||
func sharedListRow() -> some View {
|
||||
modifier(SharedListRow())
|
||||
}
|
||||
enum SharedListRowIconType {
|
||||
case charCircle(String)
|
||||
case image(Image, Color)
|
||||
}
|
||||
|
||||
struct SharedListRow: ViewModifier {
|
||||
public func body(content: Content) -> some View {
|
||||
content
|
||||
.listRowInsets(.zero)
|
||||
.listRowSeparator(.hidden)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.background(Color.Material.Background.light)
|
||||
struct SharedListRow: View {
|
||||
let iconType: SharedListRowIconType
|
||||
let text: String
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 0) {
|
||||
HStack(spacing: 8) {
|
||||
// Icon
|
||||
switch iconType {
|
||||
case .charCircle(let str):
|
||||
let char = str.firstLetter
|
||||
let color = str.firstLetterColor
|
||||
ZStack {
|
||||
Circle()
|
||||
.frame(width: 44, height: 44)
|
||||
.foregroundColor(color)
|
||||
Text(char)
|
||||
.foregroundColor(.white)
|
||||
.font(.body1)
|
||||
}
|
||||
|
||||
case .image(let image, let color):
|
||||
ZStack {
|
||||
Circle()
|
||||
.frame(width: 44, height: 44)
|
||||
.foregroundColor(.clearTappable)
|
||||
.overlay {
|
||||
image
|
||||
.foregroundColor(color)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Text
|
||||
Text(text)
|
||||
.foregroundColor(Color.Material.Text.main)
|
||||
.font(.body2)
|
||||
Spacer()
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 4)
|
||||
Rectangle()
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 1)
|
||||
.foregroundColor(.Material.Background.dark)
|
||||
}
|
||||
.listRowInsets(.zero)
|
||||
.listRowSeparator(.hidden)
|
||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
.background(Color.Material.Background.light)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue