Files
iceglass/Shared/Extensions/TimeInterval+humanReadableTime.swift
T
rzen aaffa3771c Add iPhone target with shared data layer and persistent cache
Two-target restructure: shared sources (models, services, settings,
extensions, team logos) move into Shared/, consumed by both the
existing macOS menu bar app and a new iOS app. MainService no longer
imports AppKit — platform code attaches via a MainServiceObserver
protocol (MacObserverAdapter wires back to MenuManager / StatusItemManager
/ NotificationManager).

iPhone app is a single SwiftUI page mirroring the macOS menu (playoff
round + yesterday/today/tomorrow), with a gear-icon settings sheet
(display option + IndieAbout for license/changelog). Persistent JSON
snapshot in Application Support paints last-known data on cold launch;
"Updated …" header escalates secondary → orange (>5min) → red (>30min)
so staleness is visually unmistakable. Foreground polling, scenePhase
refresh, and pull-to-refresh; no notifications on iOS in v1.
2026-04-25 06:34:36 -04:00

37 lines
1001 B
Swift

//
// TimeInterval+humanReadableTime.swift
// IceGlass
//
// Copyright 2026 Rouslan Zenetl. All Rights Reserved.
//
import Foundation
extension TimeInterval {
static func humanReadableTime(from timeInterval: TimeInterval) -> String {
let seconds = Int(timeInterval)
let hours = seconds / 3600
let minutes = (seconds % 3600) / 60
let remainingSeconds = seconds % 60
var components: [String] = []
if hours > 0 {
components.append("\(hours) \(hours == 1 ? "hour" : "hours")")
}
if minutes > 0 {
components.append("\(minutes) \(minutes == 1 ? "minute" : "minutes")")
}
if remainingSeconds > 0 || components.isEmpty {
components.append("\(remainingSeconds) \(remainingSeconds == 1 ? "second" : "seconds")")
}
return components.joined(separator: " ")
}
func humanReadableTime() -> String {
return TimeInterval.humanReadableTime(from: self)
}
}