Update thread and account views on new websocket update event. (#151)
This commit is contained in:
parent
68311725df
commit
73c3868d05
@ -2,6 +2,7 @@ module Update.WebSocket exposing (update)
|
|||||||
|
|
||||||
import Mastodon.Decoder
|
import Mastodon.Decoder
|
||||||
import Mastodon.Helper
|
import Mastodon.Helper
|
||||||
|
import Mastodon.Model exposing (..)
|
||||||
import Mastodon.WebSocket
|
import Mastodon.WebSocket
|
||||||
import Types exposing (..)
|
import Types exposing (..)
|
||||||
import Update.Error exposing (..)
|
import Update.Error exposing (..)
|
||||||
@ -19,7 +20,11 @@ update msg model =
|
|||||||
Mastodon.WebSocket.StatusUpdateEvent result ->
|
Mastodon.WebSocket.StatusUpdateEvent result ->
|
||||||
case result of
|
case result of
|
||||||
Ok status ->
|
Ok status ->
|
||||||
{ model | homeTimeline = Update.Timeline.prepend status model.homeTimeline } ! []
|
(model
|
||||||
|
|> (\m -> { m | homeTimeline = Update.Timeline.prepend status m.homeTimeline })
|
||||||
|
|> updateCurrentViewWithStatus status
|
||||||
|
)
|
||||||
|
! []
|
||||||
|
|
||||||
Err error ->
|
Err error ->
|
||||||
{ model | errors = addErrorNotification error model } ! []
|
{ model | errors = addErrorNotification error model } ! []
|
||||||
@ -60,7 +65,11 @@ update msg model =
|
|||||||
Mastodon.WebSocket.StatusUpdateEvent result ->
|
Mastodon.WebSocket.StatusUpdateEvent result ->
|
||||||
case result of
|
case result of
|
||||||
Ok status ->
|
Ok status ->
|
||||||
{ model | localTimeline = Update.Timeline.prepend status model.localTimeline } ! []
|
(model
|
||||||
|
|> (\m -> { m | localTimeline = Update.Timeline.prepend status m.localTimeline })
|
||||||
|
|> updateCurrentViewWithStatus status
|
||||||
|
)
|
||||||
|
! []
|
||||||
|
|
||||||
Err error ->
|
Err error ->
|
||||||
{ model | errors = addErrorNotification error model } ! []
|
{ model | errors = addErrorNotification error model } ! []
|
||||||
@ -84,7 +93,11 @@ update msg model =
|
|||||||
Mastodon.WebSocket.StatusUpdateEvent result ->
|
Mastodon.WebSocket.StatusUpdateEvent result ->
|
||||||
case result of
|
case result of
|
||||||
Ok status ->
|
Ok status ->
|
||||||
{ model | globalTimeline = Update.Timeline.prepend status model.globalTimeline } ! []
|
(model
|
||||||
|
|> (\m -> { m | globalTimeline = Update.Timeline.prepend status m.globalTimeline })
|
||||||
|
|> updateCurrentViewWithStatus status
|
||||||
|
)
|
||||||
|
! []
|
||||||
|
|
||||||
Err error ->
|
Err error ->
|
||||||
{ model | errors = addErrorNotification error model } ! []
|
{ model | errors = addErrorNotification error model } ! []
|
||||||
@ -99,3 +112,50 @@ update msg model =
|
|||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
model ! []
|
model ! []
|
||||||
|
|
||||||
|
|
||||||
|
isThreadMember : Thread -> Status -> Bool
|
||||||
|
isThreadMember thread status =
|
||||||
|
case status.in_reply_to_id of
|
||||||
|
Nothing ->
|
||||||
|
False
|
||||||
|
|
||||||
|
Just inReplyToId ->
|
||||||
|
let
|
||||||
|
threadStatusIds =
|
||||||
|
List.concat
|
||||||
|
[ [ thread.status.id ]
|
||||||
|
, List.map .id thread.context.ancestors
|
||||||
|
, List.map .id thread.context.descendants
|
||||||
|
]
|
||||||
|
in
|
||||||
|
List.member inReplyToId threadStatusIds
|
||||||
|
|
||||||
|
|
||||||
|
appendToThreadDescendants : Thread -> Status -> Thread
|
||||||
|
appendToThreadDescendants ({ context } as thread) status =
|
||||||
|
{ thread
|
||||||
|
| context =
|
||||||
|
{ context
|
||||||
|
| descendants = List.append thread.context.descendants [ status ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
updateCurrentViewWithStatus : Status -> Model -> Model
|
||||||
|
updateCurrentViewWithStatus status model =
|
||||||
|
case model.currentView of
|
||||||
|
ThreadView ({ context } as thread) ->
|
||||||
|
if isThreadMember thread status then
|
||||||
|
{ model | currentView = ThreadView (appendToThreadDescendants thread status) }
|
||||||
|
else
|
||||||
|
model
|
||||||
|
|
||||||
|
AccountView account ->
|
||||||
|
if Mastodon.Helper.sameAccount account status.account then
|
||||||
|
{ model | accountTimeline = Update.Timeline.prepend status model.accountTimeline }
|
||||||
|
else
|
||||||
|
model
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
model
|
||||||
|
Loading…
Reference in New Issue
Block a user