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.
		
		
		
		
		
			
		
			
				
	
	
		
			55 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			55 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Swift
		
	
// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved.
 | 
						|
 | 
						|
import Foundation
 | 
						|
import GRDB
 | 
						|
import SessionUtilitiesKit
 | 
						|
 | 
						|
extension MessageReceiver {
 | 
						|
    internal static func handleTypingIndicator(
 | 
						|
        _ db: Database,
 | 
						|
        threadId: String,
 | 
						|
        threadVariant: SessionThread.Variant,
 | 
						|
        message: TypingIndicator
 | 
						|
    ) throws {
 | 
						|
        guard try SessionThread.exists(db, id: threadId) else { return }
 | 
						|
        
 | 
						|
        switch message.kind {
 | 
						|
            case .started:
 | 
						|
                let userPublicKey: String = getUserHexEncodedPublicKey(db)
 | 
						|
                let threadIsBlocked: Bool = (
 | 
						|
                    threadVariant == .contact &&
 | 
						|
                    (try? Contact
 | 
						|
                        .filter(id: threadId)
 | 
						|
                        .select(.isBlocked)
 | 
						|
                        .asRequest(of: Bool.self)
 | 
						|
                        .fetchOne(db))
 | 
						|
                        .defaulting(to: false)
 | 
						|
                )
 | 
						|
                let threadIsMessageRequest: Bool = (try? SessionThread
 | 
						|
                    .filter(id: threadId)
 | 
						|
                    .filter(SessionThread.isMessageRequest(userPublicKey: userPublicKey, includeNonVisible: true))
 | 
						|
                    .isEmpty(db))
 | 
						|
                    .defaulting(to: false)
 | 
						|
                let needsToStartTypingIndicator: Bool = TypingIndicators.didStartTypingNeedsToStart(
 | 
						|
                    threadId: threadId,
 | 
						|
                    threadVariant: threadVariant,
 | 
						|
                    threadIsBlocked: threadIsBlocked,
 | 
						|
                    threadIsMessageRequest: threadIsMessageRequest,
 | 
						|
                    direction: .incoming,
 | 
						|
                    timestampMs: message.sentTimestamp.map { Int64($0) }
 | 
						|
                )
 | 
						|
                
 | 
						|
                if needsToStartTypingIndicator {
 | 
						|
                    TypingIndicators.start(db, threadId: threadId, direction: .incoming)
 | 
						|
                }
 | 
						|
                
 | 
						|
            case .stopped:
 | 
						|
                TypingIndicators.didStopTyping(db, threadId: threadId, direction: .incoming)
 | 
						|
            
 | 
						|
            default:
 | 
						|
                SNLog("Unknown TypingIndicator Kind ignored")
 | 
						|
                return
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |