ios: refresh call invitations and report call on start and activation; core: restore calls on activation (#776)

This commit is contained in:
JRoberts
2022-07-05 15:15:15 +04:00
committed by GitHub
parent 8c307c4675
commit ab848e8c13
13 changed files with 89 additions and 57 deletions
+14 -9
View File
@@ -150,7 +150,7 @@ newChatController chatStore user cfg@ChatConfig {agentConfig = aCfg, tbqSize, de
startChatController :: (MonadUnliftIO m, MonadReader ChatController m) => User -> Bool -> m (Async ())
startChatController user subConns = do
asks smpAgent >>= resumeAgentClient
restoreCalls
restoreCalls user
s <- asks agentAsync
readTVarIO s >>= maybe (start s) (pure . fst)
where
@@ -162,11 +162,13 @@ startChatController user subConns = do
else pure Nothing
atomically . writeTVar s $ Just (a1, a2)
pure a1
restoreCalls = do
savedCalls <- fromRight [] <$> runExceptT (withStore' $ \db -> getCalls db user)
let callsMap = M.fromList $ map (\(call@Call {contactId}) -> (contactId, call)) savedCalls
calls <- asks currentCalls
atomically $ writeTVar calls callsMap
restoreCalls :: (MonadUnliftIO m, MonadReader ChatController m) => User -> m ()
restoreCalls user = do
savedCalls <- fromRight [] <$> runExceptT (withStore' $ \db -> getCalls db user)
let callsMap = M.fromList $ map (\call@Call {contactId} -> (contactId, call)) savedCalls
calls <- asks currentCalls
atomically $ writeTVar calls callsMap
stopChatController :: MonadUnliftIO m => ChatController -> m ()
stopChatController ChatController {smpAgent, agentAsync = s} = do
@@ -213,7 +215,9 @@ processChatCommand = \case
APIStopChat -> do
ask >>= stopChatController
pure CRChatStopped
APIActivateChat -> withAgent activateAgent $> CRCmdOk
APIActivateChat -> do
withUser $ \user -> restoreCalls user
withAgent activateAgent $> CRCmdOk
APISuspendChat t -> withAgent (`suspendAgent` t) $> CRCmdOk
ResubscribeAllConnections -> withUser (subscribeUserConnections resubscribeConnection) $> CRCmdOk
SetFilesFolder filesFolder' -> do
@@ -544,8 +548,9 @@ processChatCommand = \case
SndMessage {msgId} <- sendDirectContactMessage ct (XCallEnd callId)
updateCallItemStatus userId ct call WCSDisconnected $ Just msgId
pure Nothing
APIGetCallInvitations -> withUser $ \user@User {userId} -> do
invs <- mapMaybe callInvitation <$> withStore' (`getCalls` user)
APIGetCallInvitations -> withUser $ \User {userId} -> do
calls <- asks currentCalls >>= readTVarIO
let invs = mapMaybe callInvitation $ M.elems calls
CRCallInvitations <$> mapM (rcvCallInvitation userId) invs
where
callInvitation Call {contactId, callState, callTs} = case callState of
+2 -1
View File
@@ -33,6 +33,7 @@ data Call = Call
callState :: CallState,
callTs :: UTCTime
}
deriving (Show)
isRcvInvitation :: Call -> Bool
isRcvInvitation Call {callState} = case callState of
@@ -88,7 +89,7 @@ data CallState
peerCallSession :: WebRTCSession,
sharedKey :: Maybe C.Key
}
deriving (Generic)
deriving (Show, Generic)
-- database representation
instance FromJSON CallState where
+1
View File
@@ -3693,6 +3693,7 @@ getCalls db User {userId} = do
contact_id, shared_call_id, chat_item_id, call_state, call_ts
FROM calls
WHERE user_id = ?
ORDER BY call_ts ASC
|]
(Only userId)
where