1
0
Fork 0
tooty/src/Update/Main.elm

261 lines
9.0 KiB
Elm

module Update.Main exposing (update)
import Command
import List.Extra exposing (removeAt)
import Mastodon.Model exposing (..)
import Types exposing (..)
import Update.Draft
import Update.Error
import Update.Mastodon
import Update.Timeline
import Update.Viewer
import Update.WebSocket
toStatusRequestBody : Draft -> StatusRequestBody
toStatusRequestBody draft =
{ status = draft.status
, in_reply_to_id =
case draft.inReplyTo of
Just status ->
Just status.id
Nothing ->
Nothing
, spoiler_text = draft.spoilerText
, sensitive = draft.sensitive
, visibility = draft.visibility
, media_ids = List.map .id draft.attachments
}
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
NoOp ->
model ! []
Tick newTime ->
{ model
| currentTime = newTime
, errors = Update.Error.cleanErrors newTime model.errors
}
! []
ClearError index ->
{ model | errors = removeAt index model.errors } ! []
AskConfirm message onClick onCancel ->
{ model | confirm = Just <| Confirm message onClick onCancel } ! []
ConfirmCancelled onCancel ->
update onCancel { model | confirm = Nothing }
Confirmed onConfirm ->
update onConfirm { model | confirm = Nothing }
SetView view ->
case view of
AccountSelectorView ->
{ model | currentView = view, server = "" } ! []
FavoriteTimelineView ->
{ model
| currentView = view
, favoriteTimeline = Update.Timeline.setLoading True model.favoriteTimeline
}
! [ Command.loadFavoriteTimeline (List.head model.clients) Nothing ]
BlocksView ->
{ model
| currentView = view
, blocks = Update.Timeline.setLoading True model.blocks
}
! [ Command.loadBlocks (List.head model.clients) Nothing ]
MutesView ->
{ model
| currentView = view
, mutes = Update.Timeline.setLoading True model.mutes
}
! [ Command.loadMutes (List.head model.clients) Nothing ]
_ ->
{ model | currentView = view } ! []
SwitchClient client ->
let
newClients =
client :: (List.filter (\c -> c.token /= client.token) model.clients)
in
{ model
| clients = newClients
, homeTimeline = Update.Timeline.empty "home-timeline"
, localTimeline = Update.Timeline.empty "local-timeline"
, globalTimeline = Update.Timeline.empty "global-timeline"
, favoriteTimeline = Update.Timeline.empty "favorite-timeline"
, accountTimeline = Update.Timeline.empty "account-timeline"
, accountFollowers = Update.Timeline.empty "account-followers"
, accountFollowing = Update.Timeline.empty "account-following"
, notifications = Update.Timeline.empty "notifications"
, accountRelationships = []
, accountRelationship = Nothing
, currentView = LocalTimelineView
}
! [ Command.loadUserAccount <| Just client
, Command.loadTimelines <| Just client
]
LogoutClient client ->
let
newClients =
List.filter (\c -> c.token /= client.token) model.clients
newClient =
List.head newClients
in
{ model
| clients = newClients
, currentView = LocalTimelineView
}
! [ Command.saveClients newClients
, Command.loadUserAccount newClient
, Command.loadTimelines newClient
]
MastodonEvent msg ->
let
( newModel, commands ) =
Update.Mastodon.update msg model
in
newModel ! [ commands ]
WebSocketEvent msg ->
let
( newModel, commands ) =
Update.WebSocket.update msg model
in
newModel ! [ commands ]
ServerChange server ->
{ model | server = server } ! []
UrlChange location ->
model ! []
Register ->
model ! [ Command.registerApp model ]
OpenThread status ->
model ! [ Command.loadThread (List.head model.clients) status ]
CloseThread ->
{ model | currentView = LocalTimelineView } ! []
FollowAccount account ->
model ! [ Command.follow (List.head model.clients) account ]
UnfollowAccount account ->
model ! [ Command.unfollow (List.head model.clients) account ]
Mute account ->
model ! [ Command.mute (List.head model.clients) account ]
Unmute account ->
model ! [ Command.unmute (List.head model.clients) account ]
Block account ->
model ! [ Command.block (List.head model.clients) account ]
Unblock account ->
model ! [ Command.unblock (List.head model.clients) account ]
DeleteStatus id ->
model ! [ Command.deleteStatus (List.head model.clients) id ]
ReblogStatus status ->
Update.Timeline.processReblog status True model
! [ Command.reblogStatus (List.head model.clients) status.id ]
UnreblogStatus status ->
Update.Timeline.processReblog status False model
! [ Command.unreblogStatus (List.head model.clients) status.id ]
AddFavorite status ->
Update.Timeline.processFavourite status True model
! [ Command.favouriteStatus (List.head model.clients) status.id ]
RemoveFavorite status ->
Update.Timeline.processFavourite status False model
! [ Command.unfavouriteStatus (List.head model.clients) status.id ]
DraftEvent draftMsg ->
case model.currentUser of
Just user ->
Update.Draft.update draftMsg user model
Nothing ->
model ! []
ViewerEvent viewerMsg ->
let
( viewer, commands ) =
Update.Viewer.update viewerMsg model.viewer
in
{ model | viewer = viewer } ! [ commands ]
SubmitDraft ->
model
! [ Command.postStatus (List.head model.clients) <|
toStatusRequestBody model.draft
]
LoadAccount accountId ->
{ model
| accountTimeline = Update.Timeline.empty "account-timeline"
, accountFollowers = Update.Timeline.empty "account-followers"
, accountFollowing = Update.Timeline.empty "account-following"
, accountRelationships = []
, accountRelationship = Nothing
}
! [ Command.loadAccount (List.head model.clients) accountId ]
TimelineLoadNext id next ->
Update.Timeline.markAsLoading True id model
! [ Command.loadNextTimeline (List.head model.clients) model.currentView id next ]
ViewAccountFollowers account ->
{ model
| currentView = AccountFollowersView account model.accountFollowers
, accountRelationships = []
}
! [ Command.loadAccountFollowers (List.head model.clients) account.id Nothing ]
ViewAccountFollowing account ->
{ model
| currentView = AccountFollowingView account model.accountFollowing
, accountRelationships = []
}
! [ Command.loadAccountFollowing (List.head model.clients) account.id Nothing ]
ViewAccountStatuses account ->
{ model | currentView = AccountView account } ! []
CloseAccount ->
{ model
| currentView = LocalTimelineView
, accountTimeline = Update.Timeline.empty "account-timeline"
, accountFollowing = Update.Timeline.empty "account-following"
, accountFollowers = Update.Timeline.empty "account-followers"
}
! []
FilterNotifications filter ->
{ model | notificationFilter = filter } ! []
ScrollColumn ScrollTop column ->
model ! [ Command.scrollColumnToTop column ]
ScrollColumn ScrollBottom column ->
model ! [ Command.scrollColumnToBottom column ]