mirror of
https://github.com/luxfi/wallet.git
synced 2026-10-30 15:13:19 +00:00
144 lines
3.5 KiB
Swift
144 lines
3.5 KiB
Swift
//
|
|
// ActionButtons.swift
|
|
<<<<<<< HEAD
|
|
// Lux
|
|
=======
|
|
// Uniswap
|
|
>>>>>>> upstream/main
|
|
//
|
|
// Created by Mateusz Łopaciński on 05/06/2024.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
enum ActionButtonStatus {
|
|
case success, neutral
|
|
}
|
|
|
|
struct ActionButton<Icon: Shape>: View {
|
|
var action: () -> Void
|
|
var text: String
|
|
var icon: Icon?
|
|
var status: ActionButtonStatus = .neutral
|
|
|
|
var body: some View {
|
|
var iconColor: Color
|
|
var textColor: Color
|
|
|
|
switch status {
|
|
case .success:
|
|
iconColor = Colors.statusSuccess
|
|
textColor = Colors.statusSuccess
|
|
case .neutral:
|
|
iconColor = Colors.neutral2
|
|
textColor = Colors.neutral1
|
|
}
|
|
|
|
return Button(action: action) {
|
|
HStack(alignment: .center, spacing: 4) {
|
|
if let icon = icon {
|
|
icon
|
|
.fill(iconColor)
|
|
.frame(width: 20, height: 20)
|
|
}
|
|
Text(text)
|
|
.foregroundColor(textColor)
|
|
.font(Font(UIFont(name: "Zen-Medium", size: 16)!))
|
|
}
|
|
}
|
|
.padding(EdgeInsets(top: 8, leading: icon != nil ? 12 : 16, bottom: 8, trailing: 16))
|
|
.background(Colors.surface1)
|
|
.cornerRadius(16)
|
|
.overlay(
|
|
RoundedRectangle(cornerRadius: 16)
|
|
.stroke(Colors.surface3, lineWidth: 1)
|
|
)
|
|
.shadow(color: Colors.surface3.opacity(0.04), radius: 10)
|
|
}
|
|
}
|
|
|
|
struct CopyButton: View {
|
|
// Time after which the button reverts to the copy state
|
|
private let copyTimeout: TimeInterval = 2.0
|
|
|
|
@State private var isCopied = false
|
|
@State private var copyTimer: Timer?
|
|
|
|
var copyButtonText: String
|
|
var copiedButtonText: String
|
|
var textToCopy: String
|
|
|
|
var body: some View {
|
|
ActionButton(
|
|
action: {
|
|
UIPasteboard.general.string = textToCopy
|
|
isCopied = true
|
|
|
|
// Invalidate the previous timer if it exists
|
|
copyTimer?.invalidate()
|
|
|
|
// Start a new timer
|
|
copyTimer = Timer.scheduledTimer(withTimeInterval: copyTimeout, repeats: false) { _ in
|
|
isCopied = false
|
|
}
|
|
},
|
|
text: isCopied ? copiedButtonText : copyButtonText,
|
|
icon: CopyIcon(),
|
|
status: isCopied ? .success : .neutral
|
|
)
|
|
}
|
|
}
|
|
|
|
// Similar to CopyButton, but without the text and background. It's just an icon.
|
|
struct CopyIconButton: View {
|
|
private let copyTimeout: TimeInterval = 2.0
|
|
|
|
@State private var isCopied = false
|
|
@State private var copyTimer: Timer?
|
|
|
|
var textToCopy: String
|
|
|
|
var body: some View {
|
|
let iconColor = isCopied ? Colors.statusSuccess : Colors.neutral2
|
|
|
|
return Button(action: {
|
|
UIPasteboard.general.string = textToCopy
|
|
isCopied = true
|
|
copyTimer?.invalidate()
|
|
copyTimer = Timer.scheduledTimer(withTimeInterval: copyTimeout, repeats: false) { _ in
|
|
isCopied = false
|
|
}
|
|
}) {
|
|
CopyIconOutline()
|
|
.fill(iconColor)
|
|
.frame(width: 21, height: 20)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct PasteButton: View {
|
|
var pasteButtonText: String
|
|
var onPaste: (String) -> Void
|
|
var onPasteStart: () -> Void
|
|
var onPasteEnd: () -> Void
|
|
|
|
var body: some View {
|
|
ActionButton(
|
|
action: {
|
|
let debounceTime = 0.1
|
|
onPasteStart() // Call onPasteStart just before accessing the clipboard
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + debounceTime) {
|
|
if let pastedText = UIPasteboard.general.string {
|
|
onPaste(pastedText)
|
|
}
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + debounceTime) {
|
|
onPasteEnd() // Call onPasteEnd after attempting to paste
|
|
}
|
|
}
|
|
},
|
|
text: pasteButtonText,
|
|
icon: PasteIcon()
|
|
)
|
|
}
|
|
}
|