ui: improve status view
Changelog-Changed: Improved status view design Closes: https://github.com/damus-io/damus/pull/1606
This commit is contained in:
committed by
William Casarin
parent
76f6ed0f86
commit
cf243e39c9
@@ -46,17 +46,26 @@ enum StatusDuration: CustomStringConvertible, CaseIterable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let formatter = DateComponentsFormatter()
|
let formatter = DateComponentsFormatter()
|
||||||
formatter.unitsStyle = .full
|
formatter.unitsStyle = .abbreviated
|
||||||
formatter.allowedUnits = [.minute, .hour, .day, .weekOfMonth]
|
formatter.allowedUnits = [.minute, .hour, .day, .weekOfMonth]
|
||||||
return formatter.string(from: timeInterval) ?? "\(timeInterval) seconds"
|
return formatter.string(from: timeInterval) ?? "\(timeInterval) seconds"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum Fields{
|
||||||
|
case status
|
||||||
|
case link
|
||||||
|
}
|
||||||
|
|
||||||
struct UserStatusSheet: View {
|
struct UserStatusSheet: View {
|
||||||
|
let damus_state: DamusState
|
||||||
let postbox: PostBox
|
let postbox: PostBox
|
||||||
let keypair: Keypair
|
let keypair: Keypair
|
||||||
|
|
||||||
@State var duration: StatusDuration = .never
|
@State var duration: StatusDuration = .never
|
||||||
|
@State var show_link: Bool = false
|
||||||
|
|
||||||
|
@FocusState var focusedTextField : Fields?
|
||||||
|
|
||||||
@ObservedObject var status: UserStatusModel
|
@ObservedObject var status: UserStatusModel
|
||||||
@Environment(\.dismiss) var dismiss
|
@Environment(\.dismiss) var dismiss
|
||||||
@@ -86,45 +95,15 @@ struct UserStatusSheet: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading, spacing: 20) {
|
VStack {
|
||||||
Text("Set Status", comment: "Title of view that allows the user to set their profile status (e.g. working, studying, coding)")
|
|
||||||
.font(.largeTitle)
|
|
||||||
|
|
||||||
TextField(text: status_binding, label: {
|
|
||||||
Text("📋 Working", comment: "Placeholder as an example of what the user could set as their profile status.")
|
|
||||||
})
|
|
||||||
|
|
||||||
HStack {
|
HStack {
|
||||||
Image("link")
|
|
||||||
|
|
||||||
TextField(text: url_binding, label: {
|
|
||||||
Text("https://example.com", comment: "Placeholder as an example of what the user could set so that the link is opened when the status is tapped.")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
HStack {
|
|
||||||
Text("Clear status", comment: "Label to prompt user to select an expiration time for the profile status to clear.")
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
|
|
||||||
Picker(NSLocalizedString("Duration", comment: "Label for profile status expiration duration picker."), selection: $duration) {
|
|
||||||
ForEach(StatusDuration.allCases, id: \.self) { d in
|
|
||||||
Text(verbatim: d.description)
|
|
||||||
.tag(d)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Toggle(isOn: $status.playing_enabled, label: {
|
|
||||||
Text("Broadcast music playing on Apple Music", comment: "Toggle to enable or disable broadcasting what music is being played on Apple Music in their profile status.")
|
|
||||||
})
|
|
||||||
|
|
||||||
HStack(alignment: .center) {
|
|
||||||
Button(action: {
|
Button(action: {
|
||||||
dismiss()
|
dismiss()
|
||||||
}, label: {
|
}, label: {
|
||||||
Text("Cancel", comment: "Cancel button text for dismissing profile status settings view.")
|
Text("Cancel", comment: "Cancel button text for dismissing profile status settings view.")
|
||||||
|
.padding(10)
|
||||||
})
|
})
|
||||||
|
.buttonStyle(NeutralButtonStyle())
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
@@ -140,21 +119,98 @@ struct UserStatusSheet: View {
|
|||||||
|
|
||||||
dismiss()
|
dismiss()
|
||||||
}, label: {
|
}, label: {
|
||||||
Text("Save", comment: "Save button text for saving profile status settings.")
|
Text("Share", comment: "Save button text for saving profile status settings.")
|
||||||
})
|
})
|
||||||
.buttonStyle(GradientButtonStyle())
|
.buttonStyle(GradientButtonStyle(padding: 10))
|
||||||
}
|
}
|
||||||
.padding([.top], 30)
|
.padding()
|
||||||
|
|
||||||
|
Divider()
|
||||||
|
|
||||||
|
ZStack {
|
||||||
|
ProfilePicView(pubkey: keypair.pubkey, size: 120.0, highlight: .custom(DamusColors.white, 3.0), profiles: damus_state.profiles, disable_animation: damus_state.settings.disable_animation)
|
||||||
|
.padding(.top, 130)
|
||||||
|
|
||||||
|
VStack(spacing: 0) {
|
||||||
|
HStack {
|
||||||
|
TextField(NSLocalizedString("Staying humble...", comment: "Placeholder as an example of what the user could set as their profile status."), text: status_binding, axis: .vertical)
|
||||||
|
.focused($focusedTextField, equals: Fields.status)
|
||||||
|
.task {
|
||||||
|
self.focusedTextField = .status
|
||||||
|
}
|
||||||
|
.autocorrectionDisabled(true)
|
||||||
|
.textInputAutocapitalization(.never)
|
||||||
|
.lineLimit(3)
|
||||||
|
.frame(width: 175)
|
||||||
|
}
|
||||||
|
.padding(10)
|
||||||
|
.background(DamusColors.adaptableWhite)
|
||||||
|
.cornerRadius(15)
|
||||||
|
.shadow(color: DamusColors.neutral3, radius: 15)
|
||||||
|
|
||||||
|
Circle()
|
||||||
|
.fill(DamusColors.adaptableWhite)
|
||||||
|
.frame(width: 12, height: 12)
|
||||||
|
.padding(.trailing, 140)
|
||||||
|
|
||||||
|
Circle()
|
||||||
|
.fill(DamusColors.adaptableWhite)
|
||||||
|
.frame(width: 7, height: 7)
|
||||||
|
.padding(.trailing, 120)
|
||||||
|
|
||||||
|
}
|
||||||
|
.padding(.leading, 60)
|
||||||
|
}
|
||||||
|
|
||||||
|
VStack {
|
||||||
|
HStack {
|
||||||
|
Image("link")
|
||||||
|
.foregroundColor(DamusColors.neutral3)
|
||||||
|
|
||||||
|
TextField(text: url_binding, label: {
|
||||||
|
Text("Add an external link", comment: "Placeholder as an example of what the user could set so that the link is opened when the status is tapped.")
|
||||||
|
})
|
||||||
|
.focused($focusedTextField, equals: Fields.link)
|
||||||
|
}
|
||||||
|
.padding(10)
|
||||||
|
.cornerRadius(12)
|
||||||
|
.overlay(
|
||||||
|
RoundedRectangle(cornerRadius: 12)
|
||||||
|
.stroke(DamusColors.neutral3, lineWidth: 1)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
|
||||||
|
Toggle(isOn: $status.playing_enabled, label: {
|
||||||
|
Text("Broadcast music playing on Apple Music", comment: "Toggle to enable or disable broadcasting what music is being played on Apple Music in their profile status.")
|
||||||
|
})
|
||||||
|
.tint(DamusColors.purple)
|
||||||
|
.padding(.horizontal)
|
||||||
|
|
||||||
|
HStack {
|
||||||
|
Text("Clear status", comment: "Label to prompt user to select an expiration time for the profile status to clear.")
|
||||||
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
Picker(NSLocalizedString("Duration", comment: "Label for profile status expiration duration picker."), selection: $duration) {
|
||||||
|
ForEach(StatusDuration.allCases, id: \.self) { d in
|
||||||
|
Text(verbatim: d.description)
|
||||||
|
.tag(d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.pickerStyle(.segmented)
|
||||||
|
}
|
||||||
|
.padding()
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
.padding(30)
|
.padding(.top)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct UserStatusSheet_Previews: PreviewProvider {
|
struct UserStatusSheet_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
UserStatusSheet(postbox: test_damus_state.postbox, keypair: test_keypair, status: .init())
|
UserStatusSheet(damus_state: test_damus_state, postbox: test_damus_state.postbox, keypair: test_keypair, status: .init())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -312,7 +312,8 @@ struct ContentView: View {
|
|||||||
case .post(let action):
|
case .post(let action):
|
||||||
PostView(action: action, damus_state: damus_state!)
|
PostView(action: action, damus_state: damus_state!)
|
||||||
case .user_status:
|
case .user_status:
|
||||||
UserStatusSheet(postbox: damus_state!.postbox, keypair: damus_state!.keypair, status: damus_state!.profiles.profile_data(damus_state!.pubkey).status)
|
UserStatusSheet(damus_state: damus_state!, postbox: damus_state!.postbox, keypair: damus_state!.keypair, status: damus_state!.profiles.profile_data(damus_state!.pubkey).status)
|
||||||
|
.presentationDragIndicator(.visible)
|
||||||
case .event:
|
case .event:
|
||||||
EventDetailView()
|
EventDetailView()
|
||||||
case .zap(let zapsheet):
|
case .zap(let zapsheet):
|
||||||
|
|||||||
Reference in New Issue
Block a user