CasinoGames/Blackjack/Views/Table/BettingZoneView.swift

107 lines
3.2 KiB
Swift

//
// BettingZoneView.swift
// Blackjack
//
// The betting area where players place their bets.
//
import SwiftUI
import CasinoKit
struct BettingZoneView: View {
let betAmount: Int
let minBet: Int
let maxBet: Int
let onTap: () -> Void
@ScaledMetric(relativeTo: .headline) private var labelFontSize: CGFloat = Design.Size.handLabelFontSize
private var isAtMax: Bool {
betAmount >= maxBet
}
var body: some View {
Button(action: onTap) {
ZStack {
// Background
RoundedRectangle(cornerRadius: Design.CornerRadius.large)
.fill(Color.BettingZone.main)
.overlay(
RoundedRectangle(cornerRadius: Design.CornerRadius.large)
.strokeBorder(Color.BettingZone.mainBorder, lineWidth: Design.LineWidth.medium)
)
// Content
if betAmount > 0 {
// Show chip with amount (scaled)
ChipOnTableView(amount: betAmount, showMax: isAtMax, size: Design.Size.bettingChipSize)
} else {
// Empty state
VStack(spacing: Design.Spacing.small) {
Text(String(localized: "TAP TO BET"))
.font(.system(size: labelFontSize, weight: .bold))
.foregroundStyle(.white.opacity(Design.Opacity.medium))
HStack(spacing: Design.Spacing.medium) {
Text(String(localized: "Min: $\(minBet)"))
.font(.system(size: Design.Size.handNumberFontSize, weight: .medium))
.foregroundStyle(.white.opacity(Design.Opacity.light))
Text(String(localized: "Max: $\(maxBet.formatted())"))
.font(.system(size: Design.Size.handNumberFontSize, weight: .medium))
.foregroundStyle(.white.opacity(Design.Opacity.light))
}
}
}
}
.frame(maxWidth: .infinity)
.frame(height: Design.Size.bettingZoneHeightScaled)
}
.buttonStyle(.plain)
.accessibilityLabel(betAmount > 0 ? "$\(betAmount) bet" + (isAtMax ? ", maximum" : "") : "Place bet")
.accessibilityHint("Double tap to add chips")
}
}
// MARK: - Previews
#Preview("Empty") {
ZStack {
Color.Table.felt.ignoresSafeArea()
BettingZoneView(
betAmount: 0,
minBet: 10,
maxBet: 1000,
onTap: {}
)
.padding()
}
}
#Preview("With Bet") {
ZStack {
Color.Table.felt.ignoresSafeArea()
BettingZoneView(
betAmount: 250,
minBet: 10,
maxBet: 1000,
onTap: {}
)
.padding()
}
}
#Preview("Max Bet") {
ZStack {
Color.Table.felt.ignoresSafeArea()
BettingZoneView(
betAmount: 1000,
minBet: 10,
maxBet: 1000,
onTap: {}
)
.padding()
}
}