mirror of
https://github.com/ivanvorobei/SwiftUI.git
synced 2026-03-28 20:22:02 +01:00
Update
This commit is contained in:
53
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/UserDetailView.swift
Executable file
53
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/UserDetailView.swift
Executable file
@@ -0,0 +1,53 @@
|
||||
//
|
||||
// UserDetailView.swift
|
||||
// SwiftUIDemo
|
||||
//
|
||||
// Created by Thomas Ricouard on 04/06/2019.
|
||||
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import Combine
|
||||
|
||||
struct UserDetailView : View {
|
||||
@EnvironmentObject var state: AppState
|
||||
let userId: Int
|
||||
|
||||
var editModal: Modal {
|
||||
let user = state.usersState.users[userId]
|
||||
return Modal(UserEditForm(userId: user.id, saveHandler: { saved in
|
||||
self.state.dispatch(action: UserActions.stopEditUser)
|
||||
}).environmentObject(state)) {
|
||||
self.state.dispatch(action: UserActions.stopEditUser)
|
||||
}
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
let user = state.usersState.users[userId]
|
||||
return VStack {
|
||||
Image(systemName: user.imageName)
|
||||
Text(user.name)
|
||||
Text(user.username).lineLimit(0)
|
||||
}
|
||||
.navigationBarTitle(Text(user.name), displayMode: .inline)
|
||||
.navigationBarItems(trailing:
|
||||
Button(action: {
|
||||
self.state.dispatch(action: UserActions.startEditUser)
|
||||
}) {
|
||||
Text("Edit user")
|
||||
}
|
||||
.presentation(self.state.usersState.isEditingUser ? self.editModal : nil))
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
struct UserDetailView_Previews : PreviewProvider {
|
||||
static var previews: some View {
|
||||
NavigationView {
|
||||
UserDetailView(userId: 0).environmentObject(sampleStore)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
88
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/UserEditForm.swift
Executable file
88
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/UserEditForm.swift
Executable file
@@ -0,0 +1,88 @@
|
||||
//
|
||||
// UserEditForm.swift
|
||||
// SwiftUIDemo
|
||||
//
|
||||
// Created by Thomas Ricouard on 05/06/2019.
|
||||
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct UserEditForm : View {
|
||||
@EnvironmentObject var state: AppState
|
||||
|
||||
let userId: Int
|
||||
let saveHandler: ((Bool) -> Swift.Void)?
|
||||
|
||||
@State var newUserName = ""
|
||||
@State var newUserUsername = ""
|
||||
@State var showSaved = false
|
||||
@State var showError = false
|
||||
|
||||
var body: some View {
|
||||
let user = state.usersState.users[userId]
|
||||
return NavigationView {
|
||||
VStack(alignment: .leading, spacing: 10) {
|
||||
Text("User name")
|
||||
TextField($newUserName, placeholder: Text("New name"))
|
||||
.textFieldStyle(.roundedBorder)
|
||||
Divider()
|
||||
Text("Username")
|
||||
TextField($newUserUsername, placeholder: Text("New username"))
|
||||
.textFieldStyle(.roundedBorder)
|
||||
}.padding(16)
|
||||
Button(action: save) {
|
||||
Text("Save")
|
||||
.padding(8)
|
||||
.foregroundColor(.white)
|
||||
.background(Color.green)
|
||||
.cornerRadius(8)
|
||||
}
|
||||
.navigationBarItems(trailing: Button(action: close) {
|
||||
Text("Close")
|
||||
})
|
||||
.navigationBarTitle(Text("Edit \(user.name)"), displayMode: .inline)
|
||||
|
||||
Badge(text: "Saved successfully", color: .green, show: $showSaved)
|
||||
Badge(text: "Missing username or name", color: .red, show: $showError)
|
||||
}
|
||||
}
|
||||
|
||||
func save() {
|
||||
guard !newUserName.isEmpty && !newUserUsername.isEmpty else {
|
||||
withAnimation{
|
||||
showError = true
|
||||
}
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
|
||||
self.showError = false
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
withAnimation {
|
||||
showSaved = true
|
||||
}
|
||||
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
|
||||
self.showSaved = false
|
||||
}
|
||||
|
||||
state.dispatch(action: UserActions.editUser(id: userId, name: newUserName, username: newUserUsername))
|
||||
saveHandler?(true)
|
||||
}
|
||||
|
||||
func close() {
|
||||
saveHandler?(false)
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
struct UserEditForm_Previews : PreviewProvider {
|
||||
static var previews: some View {
|
||||
UserEditForm(userId: 0, saveHandler: nil).environmentObject(sampleStore)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
66
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/UsersListView.swift
Executable file
66
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/UsersListView.swift
Executable file
@@ -0,0 +1,66 @@
|
||||
//
|
||||
// ContentView.swift
|
||||
// SwiftUIDemo
|
||||
//
|
||||
// Created by Thomas Ricouard on 04/06/2019.
|
||||
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct UsersListView : View {
|
||||
@EnvironmentObject var state: AppState
|
||||
|
||||
var body: some View {
|
||||
NavigationView {
|
||||
List {
|
||||
Section {
|
||||
Button(action: addUser) {
|
||||
Text("Add user")
|
||||
}
|
||||
Button(action: targetUpdate) {
|
||||
Text("Update first")
|
||||
}
|
||||
}
|
||||
Section {
|
||||
ForEach(state.usersState.users) {user in
|
||||
NavigationButton(destination: UserDetailView(userId: user.id)) {
|
||||
UserRow(user: user)
|
||||
}
|
||||
}
|
||||
.onDelete(perform: delete)
|
||||
.onMove(perform: move)
|
||||
}
|
||||
}
|
||||
.listStyle(.grouped)
|
||||
.navigationBarTitle(Text("Users (\(state.usersState.users.count))"))
|
||||
.navigationBarItems(trailing: EditButton())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func addUser() {
|
||||
state.dispatch(action: UserActions.addUser)
|
||||
|
||||
}
|
||||
|
||||
func targetUpdate() {
|
||||
state.dispatch(action: UserActions.testEditFirstUser)
|
||||
}
|
||||
|
||||
func delete(at offset: IndexSet) {
|
||||
state.dispatch(action: UserActions.deleteUser(index: offset.first!))
|
||||
}
|
||||
|
||||
func move(from: IndexSet, to: Int) {
|
||||
state.dispatch(action: UserActions.move(from: from.first!, to: to))
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
struct ContentView_Previews : PreviewProvider {
|
||||
static var previews: some View {
|
||||
UsersListView().environmentObject(sampleStore)
|
||||
}
|
||||
}
|
||||
#endif
|
||||
32
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/component/Badge.swift
Executable file
32
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/component/Badge.swift
Executable file
@@ -0,0 +1,32 @@
|
||||
//
|
||||
// GreenBadge.swift
|
||||
// SwiftUIDemo
|
||||
//
|
||||
// Created by Thomas Ricouard on 06/06/2019.
|
||||
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct Badge : View {
|
||||
let text: String
|
||||
let color: Color
|
||||
@Binding var show: Bool
|
||||
|
||||
var animation: Animation {
|
||||
Animation
|
||||
.spring(initialVelocity: 5)
|
||||
.speed(2)
|
||||
}
|
||||
|
||||
var body: some View {
|
||||
Text(text)
|
||||
.color(.white)
|
||||
.padding()
|
||||
.background(color)
|
||||
.cornerRadius(8)
|
||||
.scaleEffect(show ? 1: 0.5)
|
||||
.opacity(show ? 1 : 0)
|
||||
.animation(animation)
|
||||
}
|
||||
}
|
||||
36
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/rows/UserRow.swift
Executable file
36
Other Projects/SwiftUI + Redux/SwiftUIDemo/views/users/rows/UserRow.swift
Executable file
@@ -0,0 +1,36 @@
|
||||
//
|
||||
// UserRw.swift
|
||||
// SwiftUIDemo
|
||||
//
|
||||
// Created by Thomas Ricouard on 04/06/2019.
|
||||
// Copyright © 2019 Thomas Ricouarf. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
struct UserRow : View {
|
||||
let user: User
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
HStack {
|
||||
Image(systemName: user.imageName)
|
||||
|
||||
VStack {
|
||||
Text(user.name)
|
||||
Text(user.username)
|
||||
.color(.secondary)
|
||||
.lineLimit(0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
struct UserRw_Previews : PreviewProvider {
|
||||
static var previews: some View {
|
||||
UserRow(user: sampleData[0])
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user