Some checks failed
CI / UI / Build (push) Failing after 11s
CI / Scraper / Lint (pull_request) Failing after 15s
CI / UI / Docker Push (push) Has been skipped
CI / Scraper / Test (pull_request) Successful in 20s
CI / Scraper / Docker Push (pull_request) Has been skipped
CI / UI / Build (pull_request) Failing after 17s
CI / UI / Docker Push (pull_request) Has been skipped
iOS CI / Build (push) Successful in 3m40s
iOS CI / Build (pull_request) Successful in 1m49s
iOS CI / Test (push) Successful in 4m24s
iOS CI / Test (pull_request) Successful in 4m46s
- Add UserProfileView and UserProfileViewModel for iOS - Implement user library API endpoint (/api/users/[username]/library) - Add DELETE /api/progress/[slug] endpoint for removing books from library - Integrate subscription feed in home API - Update Xcode project with new profile components
42 lines
1.8 KiB
Swift
42 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
// MARK: - String helpers for display purposes
|
|
|
|
extension String {
|
|
/// Strips trailing relative-date suffixes (e.g. "2 years ago", "3 days ago",
|
|
/// or "(One)4 years ago" where the number is attached without a preceding space).
|
|
func strippingTrailingDate() -> String {
|
|
let units = ["second", "minute", "hour", "day", "week", "month", "year"]
|
|
let lower = self.lowercased()
|
|
for unit in units {
|
|
for suffix in [unit + "s ago", unit + " ago"] {
|
|
guard let suffixRange = lower.range(of: suffix, options: .backwards) else { continue }
|
|
// Everything before the suffix
|
|
let before = String(self[self.startIndex ..< suffixRange.lowerBound])
|
|
let trimmed = before.trimmingCharacters(in: .whitespaces)
|
|
// Strip trailing digits (the numeric count, which may be attached without a space)
|
|
var result = trimmed
|
|
while let last = result.last, last.isNumber {
|
|
result.removeLast()
|
|
}
|
|
result = result.trimmingCharacters(in: .whitespaces)
|
|
if result != trimmed {
|
|
// We actually stripped some digits — return cleaned result
|
|
return result
|
|
}
|
|
// Fallback: number preceded by space
|
|
if let spaceIdx = trimmed.lastIndex(of: " ") {
|
|
let potentialNum = String(trimmed[trimmed.index(after: spaceIdx)...])
|
|
if Int(potentialNum) != nil {
|
|
return String(trimmed[trimmed.startIndex ..< spaceIdx])
|
|
.trimmingCharacters(in: .whitespaces)
|
|
}
|
|
} else if Int(trimmed) != nil {
|
|
return ""
|
|
}
|
|
}
|
|
}
|
|
return self
|
|
}
|
|
}
|