Update thread and account views on new websocket update event. (#151)

This commit is contained in:
Nicolas Perriault 2017-05-08 14:13:07 +02:00 committed by GitHub
parent 68311725df
commit 73c3868d05

View File

@ -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