mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Swift
		
	
| // Copyright © 2023 Rangeproof Pty Ltd. All rights reserved.
 | |
| 
 | |
| import SwiftUI
 | |
| import SessionUIKit
 | |
| 
 | |
| public struct ActivityIndicator: View {
 | |
|     @State private var strokeStart: Double = 0.95
 | |
|     @State private var strokeEnd: Double = 1.0
 | |
|     @State private var shorten: Bool = false
 | |
|     @State private var isRotating: Bool = false
 | |
|     
 | |
|     private var themeColor: ThemeValue
 | |
|     private var width: CGFloat
 | |
|     
 | |
|     public init(themeColor: ThemeValue, width: CGFloat) {
 | |
|         self.themeColor = themeColor
 | |
|         self.width = width
 | |
|     }
 | |
| 
 | |
|     public var body: some View {
 | |
|         GeometryReader { (geometry: GeometryProxy) in
 | |
|             Circle()
 | |
|                 .trim(from: strokeStart, to: strokeEnd)
 | |
|                 .stroke(
 | |
|                     themeColor: themeColor,
 | |
|                     style: StrokeStyle(
 | |
|                         lineWidth: width,
 | |
|                         lineCap: .round
 | |
|                     )
 | |
|                 )
 | |
|                 .frame(
 | |
|                     width: geometry.size.width,
 | |
|                     height: geometry.size.height
 | |
|                 )
 | |
|                 .rotationEffect(!self.isRotating ? .degrees(0) : .degrees(360))
 | |
|         }
 | |
|         .aspectRatio(1, contentMode: .fit)
 | |
|         .onAppear {
 | |
|             withAnimation(
 | |
|                 Animation
 | |
|                     .timingCurve(0.4, 0.0, 0.2, 1.0, duration: 1.5)
 | |
|                     .repeatForever(autoreverses: false)
 | |
|             ) {
 | |
|                 self.isRotating = true
 | |
|             }
 | |
|             
 | |
|             self.trimStroke()
 | |
|             Timer.scheduledTimer(withTimeInterval: 1.5, repeats: true) { _ in
 | |
|                 self.trimStroke()
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     private func trimStroke() {
 | |
|         self.shorten = !self.shorten
 | |
|         
 | |
|         if self.shorten {
 | |
|             self.strokeStart = 0.0
 | |
|             self.strokeEnd = 1.0
 | |
|         } else {
 | |
|             self.strokeStart = 0.0
 | |
|             self.strokeEnd = 0.0
 | |
|         }
 | |
|         
 | |
|         withAnimation(.linear(duration: 1.5)) {
 | |
|             if self.shorten {
 | |
|                 self.strokeStart = 1.0
 | |
|             } else {
 | |
|                 self.strokeEnd = 1.0
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct ActivityIndicator_Previews: PreviewProvider {
 | |
|     static var previews: some View {
 | |
|         ActivityIndicator(themeColor: .textPrimary, width: 2)
 | |
|             .frame(
 | |
|                 width: 40,
 | |
|                 height: 40
 | |
|             )
 | |
|     }
 | |
| }
 |