Add copying

This commit is contained in:
Shadowfacts 2021-08-25 11:26:21 -04:00
parent b006293896
commit 643452459b
1 changed files with 49 additions and 28 deletions

View File

@ -11,8 +11,9 @@ import OTPKit
struct KeyView: View {
let key: TOTPKey
let currentCode: TOTPCode
@State private var copying = false
var formattedCode: String {
private var formattedCode: String {
let code = currentCode.code
let mid = code.index(code.startIndex, offsetBy: code.count / 2)
return "\(code[code.startIndex..<mid]) \(code[mid...])"
@ -24,37 +25,47 @@ struct KeyView: View {
}
var body: some View {
HStack {
VStack(alignment: .leading) {
Text(key.issuer)
.font(.title3)
if let label = key.label, !label.isEmpty {
Text(label)
.font(.footnote)
}
}
Spacer()
Text(formattedCode)
.font(.system(.title2, design: .monospaced))
// Text("\(currentCode.validUntil, style: .relative)")
// .font(.body.monospacedDigit())
// I don't think this TimelineView should be necessary since the CodeHolder timer fires every .5 seconds
TimelineView(.animation) { (ctx) in
ZStack {
CircularProgressView(progress: progress(at: Date()), colorChangeThreshold: 5.0 / Double(key.period))
Button(action: self.copy) {
HStack {
VStack(alignment: .leading) {
Text(key.issuer)
.font(.title3)
Text(Int(round(currentCode.validUntil.timeIntervalSinceNow)).description)
.font(.caption.monospacedDigit())
if let label = key.label, !label.isEmpty {
Text(label)
.font(.footnote)
}
}
Spacer()
if copying {
Text("Copied!")
.font(.title2)
.transition(.move(edge: .trailing).combined(with: .opacity))
} else {
Text(formattedCode)
.font(.system(.title2, design: .monospaced))
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)).combined(with: .opacity))
}
// Text("\(currentCode.validUntil, style: .relative)")
// .font(.body.monospacedDigit())
// I don't think this TimelineView should be necessary since the CodeHolder timer fires every .5 seconds
TimelineView(.animation) { (ctx) in
ZStack {
CircularProgressView(progress: progress(at: Date()), colorChangeThreshold: 5.0 / Double(key.period))
Text(Int(round(currentCode.validUntil.timeIntervalSinceNow)).description)
.font(.caption.monospacedDigit())
}
.frame(width: 30)
}
.frame(width: 30)
}
}
.tint(.black)
}
private func progress(at date: Date) -> Double {
@ -62,6 +73,16 @@ struct KeyView: View {
let progress = 1 - seconds / Double(key.period)
return progress
}
private func copy() {
UIPasteboard.general.string = currentCode.code
withAnimation(.easeInOut(duration: 0.5)) {
copying = true
}
withAnimation(.easeInOut(duration: 0.5).delay(0.65)) {
copying = false
}
}
}
struct KeyView_Previews: PreviewProvider {