//
//  RefreshControlModifier.swift
//  SwiftUI_Pull_to_Refresh
//
//  Created by Geri Borbás on 18/09/2021.
//

import Foundation
import SwiftUI

struct RefreshControlModifier: ViewModifier {
    @State private var geometryReaderFrame: CGRect = .zero
    let refreshControl: RefreshControl

    internal init(onValueChanged: @escaping (UIRefreshControl) -> Void) {
        refreshControl = RefreshControl(onValueChanged: onValueChanged)
    }

    func body(content: Content) -> some View {
        if #available(iOS 16.0, macOS 13.0, tvOS 16.0, *) {
            return content
        } else {
            return content
                .background(
                    GeometryReader { geometry in
                        ScrollViewMatcher(
                            onResolve: { scrollView in
                                refreshControl.add(to: scrollView)
                            },
                            geometryReaderFrame: $geometryReaderFrame
                        )
                        .preference(key: FramePreferenceKey.self, value: geometry.frame(in: .global))
                        .onPreferenceChange(FramePreferenceKey.self) { frame in
                            self.geometryReaderFrame = frame
                        }
                    }
                )
        }
    }
}

extension View {
    func refreshControl(onValueChanged: @escaping (_ refreshControl: UIRefreshControl) -> Void) -> some View {
        modifier(RefreshControlModifier(onValueChanged: onValueChanged))
    }
}