Implemented the MessageView component for the Browse module.
This commit is contained in:
parent
3d21e0f78a
commit
3e70186959
@ -6,11 +6,23 @@
|
||||
Copyright © 2022 Röck+Cöde. All rights reserved.
|
||||
*/
|
||||
|
||||
// Loading
|
||||
// LoadingView
|
||||
|
||||
"loading.loading_data.text" = "Loading data\nfrom the API...";
|
||||
|
||||
// Browse
|
||||
// MessageView
|
||||
|
||||
"message.type_no_credentials.text.first" = "No user credentials have been found in your device";
|
||||
"message.type_no_credentials.text.second" = "Please login again with your credentials to load this data.";
|
||||
"message.type_no_credentials.button.text" = "Log in";
|
||||
"message.type_empty.text.first" = "No data has been found for this folder";
|
||||
"message.type_empty.text.second" = "Please populate this folder by uploading some file from your device.";
|
||||
"message.type_empty.button.text" = "Upload a file";
|
||||
"message.type_error.text.first" = "An error occurred while loading this data";
|
||||
"message.type_error.text.second" = "Please try loading this data again at a later time.";
|
||||
"message.type_error.button.text" = "Try again";
|
||||
|
||||
// BrowseView
|
||||
|
||||
"browse.toolbar_item.menu.add_actions.text" = "Add file and/or folder";
|
||||
"browse.toolbar_item.button.add_folder.text" = "Create a new folder";
|
||||
|
134
Modules/Sources/Browse/UI/Components/MessageView.swift
Normal file
134
Modules/Sources/Browse/UI/Components/MessageView.swift
Normal file
@ -0,0 +1,134 @@
|
||||
//
|
||||
// MessageView.swift
|
||||
// Browse
|
||||
//
|
||||
// Created by Javier Cicchelli on 15/12/2022.
|
||||
// Copyright © 2022 Röck+Cöde. All rights reserved.
|
||||
//
|
||||
|
||||
import DataModels
|
||||
import SwiftUI
|
||||
|
||||
struct MessageView: View {
|
||||
|
||||
// MARK: Properties
|
||||
|
||||
let type: MessageType
|
||||
let action: ActionClosure
|
||||
|
||||
// MARK: Body
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 72) {
|
||||
Image.warning
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(width: 120, height: 120)
|
||||
|
||||
VStack(spacing: 48) {
|
||||
Text(
|
||||
type.firstText,
|
||||
bundle: .module
|
||||
)
|
||||
.font(.title)
|
||||
.fontWeight(.semibold)
|
||||
|
||||
Text(
|
||||
type.secondText,
|
||||
bundle: .module
|
||||
)
|
||||
.font(.title2)
|
||||
.fontWeight(.regular)
|
||||
}
|
||||
.multilineTextAlignment(.center)
|
||||
|
||||
Button(action: action) {
|
||||
Text(
|
||||
type.button,
|
||||
bundle: .module
|
||||
)
|
||||
.font(.body)
|
||||
.foregroundColor(.primary)
|
||||
.frame(maxWidth: .infinity)
|
||||
}
|
||||
.tint(.red)
|
||||
.buttonStyle(.borderedProminent)
|
||||
.buttonBorderShape(.roundedRectangle(radius: 8))
|
||||
.controlSize(.large)
|
||||
}
|
||||
.padding(.horizontal, 48)
|
||||
.ignoresSafeArea()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Enumerations
|
||||
|
||||
extension MessageView {
|
||||
enum MessageType {
|
||||
case noCredentials
|
||||
case empty
|
||||
case error
|
||||
}
|
||||
}
|
||||
|
||||
private extension MessageView.MessageType {
|
||||
var firstText: LocalizedStringKey {
|
||||
switch self {
|
||||
case .noCredentials:
|
||||
return "message.type_no_credentials.text.first"
|
||||
case .empty:
|
||||
return "message.type_empty.text.first"
|
||||
case .error:
|
||||
return "message.type_error.text.first"
|
||||
}
|
||||
}
|
||||
|
||||
var secondText: LocalizedStringKey {
|
||||
switch self {
|
||||
case .noCredentials:
|
||||
return "message.type_no_credentials.text.second"
|
||||
case .empty:
|
||||
return "message.type_empty.text.second"
|
||||
case .error:
|
||||
return "message.type_error.text.second"
|
||||
}
|
||||
}
|
||||
|
||||
var button: LocalizedStringKey {
|
||||
switch self {
|
||||
case .noCredentials:
|
||||
return "message.type_no_credentials.button.text"
|
||||
case .empty:
|
||||
return "message.type_empty.button.text"
|
||||
case .error:
|
||||
return "message.type_error.button.text"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Image+Constants
|
||||
|
||||
private extension Image {
|
||||
static let warning = Image(systemName: "exclamationmark.circle.fill")
|
||||
}
|
||||
|
||||
// MARK: - Previews
|
||||
|
||||
struct MessageView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
MessageView(type: .noCredentials) {
|
||||
// action closure.
|
||||
}
|
||||
.previewDisplayName("View of type no credentials")
|
||||
|
||||
MessageView(type: .empty) {
|
||||
// action closure.
|
||||
}
|
||||
.previewDisplayName("View of type empty")
|
||||
|
||||
MessageView(type: .error) {
|
||||
// action closure.
|
||||
}
|
||||
.previewDisplayName("View of type error")
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user