mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2025-06-29 04:39:53 +00:00
docs: user profiles rfc (#1656)
This commit is contained in:
parent
3ec29d8ef4
commit
96ad9faa85
2 changed files with 131 additions and 1 deletions
130
docs/rfcs/2022-12-17-user-profiles.md
Normal file
130
docs/rfcs/2022-12-17-user-profiles.md
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
# User profiles
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
Convenience of having different communication contexts in a single client without shared metadata.
|
||||||
|
|
||||||
|
Currently requires changing chat database and restarting chat.
|
||||||
|
|
||||||
|
Events (notifications) for databases other than current are not received.
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
Support for multiple user profiles in a single database.
|
||||||
|
|
||||||
|
Separate transport connections with the same servers not shared between profiles.
|
||||||
|
|
||||||
|
## Design
|
||||||
|
|
||||||
|
### API
|
||||||
|
|
||||||
|
- new users are created using existing CreateActiveUser API
|
||||||
|
|
||||||
|
- APIListUsers
|
||||||
|
|
||||||
|
- APISetActiveUser UserId
|
||||||
|
|
||||||
|
- CRUsersList {users :: [User]}
|
||||||
|
|
||||||
|
- terminal APIs
|
||||||
|
|
||||||
|
### Subscriptions
|
||||||
|
|
||||||
|
- get connections for all users, subscribe to all - to receive events for users other than active
|
||||||
|
|
||||||
|
- map subscriptions to users?
|
||||||
|
|
||||||
|
- option to subscribe to connections for only one user? `StartChat {allUsers :: Bool}` API
|
||||||
|
|
||||||
|
- if more than one user profiles - start with last active user (persist?), or always load list of users first and wait for choice? same for terminal?
|
||||||
|
|
||||||
|
### Chat items expiration
|
||||||
|
|
||||||
|
- store supports this configuration per user
|
||||||
|
|
||||||
|
- expire chat items for all users with different ttl
|
||||||
|
|
||||||
|
- in `runExpireCIs` get list of users, for each - `getChatItemTTL` and run `expireChatItems`
|
||||||
|
|
||||||
|
### Disappearing messages
|
||||||
|
|
||||||
|
- `cleanupManager` - remove parameterization by User
|
||||||
|
|
||||||
|
- either `getTimedItems` and start deletion threads for all users, or similar to expiration get list of users and run `cleanupTimedItems` per user
|
||||||
|
|
||||||
|
### Events
|
||||||
|
|
||||||
|
- events need to have information for which user they happened
|
||||||
|
|
||||||
|
```haskell
|
||||||
|
data UserChatResponse = UserChatResponse
|
||||||
|
{ user :: User,
|
||||||
|
chatResponse :: ChatResponse
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- replace ChatResponse with UserChatResponse in APIResponse, toView, etc.
|
||||||
|
|
||||||
|
- in `agentSubscriber` don't get currentUser from controller, instead either:
|
||||||
|
|
||||||
|
- get user from database by agent connection id
|
||||||
|
|
||||||
|
- get from subscriptions user-connections map - either requires scan or keys and values have to be inverted, also key would have to be agent connection id not database connection id - probably easier/better to read from db
|
||||||
|
|
||||||
|
- non active user profile can be shown in notifications
|
||||||
|
|
||||||
|
- interactions via notifications - prohibit for simplicity? or change APIs to allow specifying User?
|
||||||
|
|
||||||
|
- changes to chat model are applied only for current user
|
||||||
|
|
||||||
|
### ChatController
|
||||||
|
|
||||||
|
- currentCalls:
|
||||||
|
|
||||||
|
- change `currentCalls` key? `currentCalls :: TMap (UserId, ContactId) Call`
|
||||||
|
|
||||||
|
- `restoreCalls` - for all users?
|
||||||
|
|
||||||
|
- interaction via notification - prohibit for non active user? change current user before accepting?
|
||||||
|
|
||||||
|
- `incognitoMode` - save setting or share between users?
|
||||||
|
|
||||||
|
- when changing active user reset `activeTo`?
|
||||||
|
|
||||||
|
- in `newChatController` when creating smpAgent - `getSMPServers` have to get servers for all users, or depending on allUsers flag in StartChat; // drop known_servers table?
|
||||||
|
|
||||||
|
- `AgentConfig` should depend on network configuration per user?
|
||||||
|
|
||||||
|
- double check other state
|
||||||
|
|
||||||
|
### Storage
|
||||||
|
|
||||||
|
- schema already has support for multiple users
|
||||||
|
|
||||||
|
- persist last active user?
|
||||||
|
|
||||||
|
- persist user settings? (see below)
|
||||||
|
|
||||||
|
### Frontend
|
||||||
|
|
||||||
|
- view with list of user profiles available from settings, change active user from there
|
||||||
|
|
||||||
|
- do we need additional information in that view? for example, number of unread messages
|
||||||
|
|
||||||
|
- network configuration is stored in app preferences - if unchanged will be the same across users
|
||||||
|
|
||||||
|
- persist in database per user and load?
|
||||||
|
|
||||||
|
- different configuration across platforms
|
||||||
|
|
||||||
|
- save network settings in separate preference for each user as json? dynamic preferences or predefined number of users?
|
||||||
|
|
||||||
|
- same for other settings - auto-accept images, send link previews, etc.
|
||||||
|
|
||||||
|
### Terminal view
|
||||||
|
|
||||||
|
- for users other than active view responses to have indication that it's for a different user profile, e.g. `[<user_name>]`, `[user: <user_name>]`
|
||||||
|
|
||||||
|
- don't set `activeTo` for non active user profiles
|
||||||
|
|
||||||
|
- only way to reply to a message in other user profile is to manually switch current active user first?
|
|
@ -1845,7 +1845,7 @@ expireChatItems user ttl sync = do
|
||||||
(Just ts, Just count) -> when (count == 0) $ updateGroupTs db user gInfo ts
|
(Just ts, Just count) -> when (count == 0) $ updateGroupTs db user gInfo ts
|
||||||
_ -> pure ()
|
_ -> pure ()
|
||||||
|
|
||||||
processAgentMessage :: forall m. ChatMonad m => Maybe User -> ConnId -> ACorrId -> ACommand 'Agent -> m ()
|
processAgentMessage :: forall m. ChatMonad m => Maybe User -> ACorrId -> ConnId -> ACommand 'Agent -> m ()
|
||||||
processAgentMessage Nothing _ _ _ = throwChatError CENoActiveUser
|
processAgentMessage Nothing _ _ _ = throwChatError CENoActiveUser
|
||||||
processAgentMessage (Just User {userId}) _ "" agentMessage = case agentMessage of
|
processAgentMessage (Just User {userId}) _ "" agentMessage = case agentMessage of
|
||||||
CONNECT p h -> hostEvent $ CRHostConnected p h
|
CONNECT p h -> hostEvent $ CRHostConnected p h
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue