Files
SideStore/SideStoreApp/Sources/SideWidget/Countdown.swift

78 lines
2.4 KiB
Swift
Raw Normal View History

2020-09-15 13:51:29 -07:00
//
// Countdown.swift
2023-03-02 00:40:11 -05:00
// SideWidgetExtension
2020-09-15 13:51:29 -07:00
//
// Created by Riley Testut on 7/6/20.
// Copyright © 2020 Riley Testut. All rights reserved.
//
import SwiftUI
import WidgetKit
2023-03-01 00:48:36 -05:00
struct Countdown: View {
var startDate: Date?
var endDate: Date?
2023-03-01 00:48:36 -05:00
var currentDate: Date = .init()
2020-09-15 13:51:29 -07:00
@Environment(\.font) private var font
2023-03-01 00:48:36 -05:00
2020-09-15 13:51:29 -07:00
private var numberOfDays: Int {
2023-03-01 00:48:36 -05:00
guard let date = endDate else { return 0 }
let numberOfDays = date.numberOfCalendarDays(since: currentDate)
2020-09-15 13:51:29 -07:00
return numberOfDays
}
2023-03-01 00:48:36 -05:00
2020-09-15 13:51:29 -07:00
private var fractionComplete: CGFloat {
2023-03-01 00:48:36 -05:00
guard let startDate = startDate, let endDate = endDate else { return 1.0 }
2020-09-15 13:51:29 -07:00
let totalNumberOfDays = endDate.numberOfCalendarDays(since: startDate)
2023-03-01 00:48:36 -05:00
let fractionComplete = CGFloat(numberOfDays) / CGFloat(totalNumberOfDays)
2020-09-15 13:51:29 -07:00
return fractionComplete
}
2023-03-01 00:48:36 -05:00
2020-09-15 13:51:29 -07:00
@ViewBuilder
2023-03-01 00:48:36 -05:00
private func overlay(progress: CGFloat) -> some View {
2020-09-15 13:51:29 -07:00
let strokeStyle = StrokeStyle(lineWidth: 4.0, lineCap: .round, lineJoin: .round)
2023-03-01 00:48:36 -05:00
if numberOfDays > 9 || numberOfDays < 0 {
2020-09-15 13:51:29 -07:00
Capsule(style: .continuous)
.trim(from: 0.0, to: progress)
.stroke(style: strokeStyle)
2023-03-01 00:48:36 -05:00
} else {
2020-09-15 13:51:29 -07:00
Circle()
.trim(from: 0.0, to: progress)
.rotation(Angle(degrees: -90), anchor: .center)
.stroke(style: strokeStyle)
}
}
2023-03-01 00:48:36 -05:00
2020-09-15 13:51:29 -07:00
var body: some View {
Text("\(numberOfDays)")
.font((font ?? .title).monospacedDigit())
.bold()
.opacity(endDate != nil ? 1 : 0)
.padding(.horizontal, 12)
.padding(.vertical, 6)
.overlay(
ZStack {
overlay(progress: 1.0)
.opacity(0.3)
2023-03-01 00:48:36 -05:00
2020-09-15 13:51:29 -07:00
overlay(progress: fractionComplete)
}
)
}
}
struct Countdown_Previews: PreviewProvider {
static var previews: some View {
let startDate = Calendar.current.date(byAdding: .day, value: -2, to: Date()) ?? Date()
Group {
Countdown(startDate: startDate, endDate: Calendar.current.date(byAdding: .day, value: 7, to: startDate))
Countdown(startDate: startDate, endDate: Calendar.current.date(byAdding: .day, value: 365, to: startDate))
}
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}