//
//  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 {
        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))
    }
}