47 lines
1.2 KiB
Swift
47 lines
1.2 KiB
Swift
|
//
|
||
|
// PhraseChip+WhenDraggable.swift
|
||
|
// secant-testnet
|
||
|
//
|
||
|
// Created by Francisco Gindre on 11/4/21.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import SwiftUI
|
||
|
import ComposableArchitecture
|
||
|
|
||
|
extension PhraseChip {
|
||
|
static let validationWordTypeIdentifier = "public.text"
|
||
|
|
||
|
/// Makes a PhraseChip draggable when it is of kind .unassigned
|
||
|
@ViewBuilder func makeDraggable() -> some View {
|
||
|
switch self.kind {
|
||
|
case .unassigned(let word):
|
||
|
self.onDrag {
|
||
|
NSItemProvider(object: word as NSString)
|
||
|
}
|
||
|
default:
|
||
|
self
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
extension View {
|
||
|
/// Makes a View accept drop types Self.validationWordTypeIdentifier when it is of kind .empty
|
||
|
func whenIsDroppable(_ isDroppable: Bool, dropDelegate: DropDelegate) -> some View {
|
||
|
self.modifier(MakeDroppableModifier(isDroppable: isDroppable, drop: dropDelegate))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct MakeDroppableModifier: ViewModifier {
|
||
|
var isDroppable: Bool
|
||
|
var drop: DropDelegate
|
||
|
|
||
|
func body(content: Content) -> some View {
|
||
|
if isDroppable {
|
||
|
content.onDrop(of: [PhraseChip.validationWordTypeIdentifier], delegate: drop)
|
||
|
} else {
|
||
|
content
|
||
|
}
|
||
|
}
|
||
|
}
|