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
@@ -0,0 +1,75 @@
import Foundation
import struct Networking.Booking

extension BookingDetailsViewModel {
struct AppointmentDetailsContent {
struct Row: Identifiable {
let title: String
let value: String

var id: String {
return title
}
}

let rows: [Row]

init(_ booking: Booking) {
let durationMinutes = Int(booking.endDate.timeIntervalSince(booking.startDate) / 60)
let appointmentDate = booking.startDate.formatted(date: .numeric, time: .omitted)
let appointmentTimeFrame = [
booking.startDate.formatted(date: .omitted, time: .shortened),
booking.endDate.formatted(date: .omitted, time: .shortened)
].joined(separator: " - ")

rows = [
Row(title: Localization.appointmentDetailsDateRowTitle, value: appointmentDate),
Row(title: Localization.appointmentDetailsTimeRowTitle, value: appointmentTimeFrame),
Row(title: Localization.appointmentDetailsServiceTitle, value: "Women's Haircut"),
Row(title: Localization.appointmentDetailsQuantityTitle, value: "1"),
Row(title: Localization.appointmentDetailsDurationTitle, value: String(durationMinutes)),
Row(title: Localization.appointmentDetailsCostTitle, value: booking.cost)
]
}
}
}

private extension BookingDetailsViewModel.AppointmentDetailsContent {
enum Localization {
static let appointmentDetailsDateRowTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.dateRow.title",
value: "Date",
comment: "Date row title in appointment details section in booking details view."
)

static let appointmentDetailsTimeRowTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.timeRow.title",
value: "Time",
comment: "Time row title in appointment details section in booking details view."
)

static let appointmentDetailsServiceTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.serviceRow.title",
value: "Service",
comment: "Service name row title in appointment details section in booking details view."
)

static let appointmentDetailsQuantityTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.quantityRow.title",
value: "Quantity",
comment: "Quantity row title in appointment details section in booking details view."
)

static let appointmentDetailsDurationTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.durationRow.title",
value: "Duration",
comment: "Duration row title in appointment details section in booking details view."
)

static let appointmentDetailsCostTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.costRow.title",
value: "Cost",
comment: "Cost row title in appointment details section in booking details view."
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import Foundation

extension BookingDetailsViewModel {
struct Section: Identifiable {
var id: String {
return content.id
}

let headerText: String?
let footerText: String?
let content: SectionContent

init(
headerText: String? = nil,
footerText: String? = nil,
content: SectionContent
) {
self.headerText = headerText
self.footerText = footerText
self.content = content
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import Foundation

extension BookingDetailsViewModel {
enum SectionContent {
case header(HeaderContent)
case appointmentDetails(AppointmentDetailsContent)
case attendance(AttendanceContent)
case payment(PaymentContent)
case customer(CustomerContent)
case teamMember(TeamMemberContent)
}
}

extension BookingDetailsViewModel.SectionContent: Identifiable {
var id: String {
switch self {
case .header:
return "header"
case .appointmentDetails:
return "appointmentDetails"
case .attendance:
return "attendance"
case .payment:
return "payment"
case .customer:
return "customer"
case .teamMember:
return "teamMember"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import Foundation
import SwiftUI

extension BookingDetailsViewModel {
enum Status {
case booked, paid
}
}

extension BookingDetailsViewModel.Status {
var labelText: String {
switch self {
case .booked:
return Localization.bookingStatusBooked
case .paid:
return Localization.bookingStatusPaid
}
}

var labelColor: Color {
switch self {
case .booked:
return Color(UIColor.systemGray6)
case .paid:
return Color(UIColor.systemGray6)
}
}
}

private extension BookingDetailsViewModel.Status {
enum Localization {
static let bookingStatusBooked = NSLocalizedString(
"BookingDetailsView.appointmentDetails.statusLabel.booked",
value: "Booked",
comment: "Title for the 'Booked' status label in the appointment details view."
)

static let bookingStatusPaid = NSLocalizedString(
"BookingDetailsView.appointmentDetails.statusLabel.paid",
value: "Paid",
comment: "Title for the 'Paid' status label in the appointment details view."
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import Foundation
import struct Networking.Booking

extension BookingDetailsViewModel {
struct AttendanceContent {
}

struct PaymentContent {
}

struct CustomerContent {
}

struct TeamMemberContent {
}
}

final class BookingDetailsViewModel: ObservableObject {
let sections: [Section]

init(booking: Booking) {
let headerSection = Section.init(
content: .header(HeaderContent(booking))
)

let appointmentDetailsSection = Section(
headerText: Localization.appointmentDetailsSectionHeaderTitle.uppercased(),
content: .appointmentDetails(AppointmentDetailsContent(booking))
)

sections = [
headerSection,
appointmentDetailsSection
]
}
}

private extension BookingDetailsViewModel {
enum Localization {
static let appointmentDetailsSectionHeaderTitle = NSLocalizedString(
"BookingDetailsView.appointmentDetails.headerTitle",
value: "Appointment Details",
comment: "Header title for the 'Appointment Details' section in the booking details screen."
)
}
}
18 changes: 18 additions & 0 deletions WooCommerce/Classes/ViewModels/Booking Details/HeaderContent.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import Foundation
import struct Networking.Booking

extension BookingDetailsViewModel {
struct HeaderContent: Hashable {
let bookingDate: String
let serviceName: String
let customerName: String
let status: [Status]

init(_ booking: Booking) {
bookingDate = booking.startDate.formatted(date: .numeric, time: .omitted)
serviceName = "Women's Haircut"
customerName = "Margarita Nikolaevna"
status = [.paid, .booked]
}
}
}
Loading