73 lines · 2.6 KB · Swift
RawDownload
import CodexBarCoreimport SwiftUI struct CodexResetCreditsContent: View {    let text: String    let detailText: String?    @Environment(\.menuItemHighlighted) private var isHighlighted     var body: some View {        VStack(alignment: .leading, spacing: 4) {            HStack(alignment: .firstTextBaseline) {                Text(L("Limit Reset Credits"))                    .font(.body)                    .fontWeight(.medium)                    .lineLimit(1)                Spacer()                Text(self.text)                    .font(.footnote)                    .foregroundStyle(MenuHighlightStyle.secondary(self.isHighlighted))                    .lineLimit(1)            }            if let detailText, !detailText.isEmpty {                Text(detailText)                    .font(.footnote)                    .foregroundStyle(MenuHighlightStyle.secondary(self.isHighlighted))                    .lineLimit(1)            }        }        .frame(maxWidth: .infinity, alignment: .leading)        .accessibilityElement(children: .combine)        .accessibilityLabel([            L("Limit Reset Credits"),            self.text,            self.detailText,        ].compactMap(\.self).joined(separator: ", "))    }} extension UsageMenuCardView.Model {    static func codexResetCreditsText(input: Input) -> String? {        guard input.provider == .codex,              input.showOptionalCreditsAndExtraUsage,              let resetCredits = input.snapshot?.codexResetCredits,              resetCredits.availableCount > 0        else {            return nil        }        let count = resetCredits.availableCount        if count == 1 {            return L("1 manual reset available")        }        return String(format: L("%d manual resets available"), count)    }     static func codexResetCreditsDetailText(input: Input) -> String? {        guard input.provider == .codex,              input.showOptionalCreditsAndExtraUsage,              let resetCredits = input.snapshot?.codexResetCredits,              let expiresAt = resetCredits.nextExpiringAvailableCredit?.expiresAt        else {            return nil        }        let timeText: String        switch input.resetTimeDisplayStyle {        case .absolute:            timeText = UsageFormatter.resetDescription(from: expiresAt, now: input.now)        case .countdown:            let countdown = UsageFormatter.resetCountdownDescription(from: expiresAt, now: input.now)            timeText = countdown == "now" ? L("now") : countdown        }        return String(format: L("Next expires %@"), timeText)    }}