1
0
Fork 0

Fix #177: Remove all toots from an unfollowed account.

This commit is contained in:
Nicolas Perriault 2017-05-25 10:25:43 +02:00
parent c5add865c4
commit cba6ea07e0
No known key found for this signature in database
GPG Key ID: DA5E4C83904F7A2A
10 changed files with 131 additions and 23 deletions

View File

@ -472,27 +472,27 @@ unfavouriteStatus client statusId =
Cmd.none Cmd.none
follow : Maybe Client -> Int -> Cmd Msg follow : Maybe Client -> Account -> Cmd Msg
follow client id = follow client account =
case client of case client of
Just client -> Just client ->
HttpBuilder.post (ApiUrl.follow id) HttpBuilder.post (ApiUrl.follow account.id)
|> withClient client |> withClient client
|> withBodyDecoder relationshipDecoder |> withBodyDecoder relationshipDecoder
|> send (MastodonEvent << AccountFollowed) |> send (MastodonEvent << (AccountFollowed account))
Nothing -> Nothing ->
Cmd.none Cmd.none
unfollow : Maybe Client -> Int -> Cmd Msg unfollow : Maybe Client -> Account -> Cmd Msg
unfollow client id = unfollow client account =
case client of case client of
Just client -> Just client ->
HttpBuilder.post (ApiUrl.unfollow id) HttpBuilder.post (ApiUrl.unfollow account.id)
|> withClient client |> withClient client
|> withBodyDecoder relationshipDecoder |> withBodyDecoder relationshipDecoder
|> send (MastodonEvent << AccountUnfollowed) |> send (MastodonEvent << (AccountUnfollowed account))
Nothing -> Nothing ->
Cmd.none Cmd.none

View File

@ -42,14 +42,14 @@ type alias MastodonResult a =
type MastodonMsg type MastodonMsg
= AccessToken (MastodonResult AccessTokenResult) = AccessToken (MastodonResult AccessTokenResult)
| AccountFollowed (MastodonResult Relationship) | AccountFollowed Account (MastodonResult Relationship)
| AccountFollowers Bool (MastodonResult (List Account)) | AccountFollowers Bool (MastodonResult (List Account))
| AccountFollowing Bool (MastodonResult (List Account)) | AccountFollowing Bool (MastodonResult (List Account))
| AccountReceived (MastodonResult Account) | AccountReceived (MastodonResult Account)
| AccountRelationship (MastodonResult (List Relationship)) | AccountRelationship (MastodonResult (List Relationship))
| AccountRelationships (MastodonResult (List Relationship)) | AccountRelationships (MastodonResult (List Relationship))
| AccountTimeline Bool (MastodonResult (List Status)) | AccountTimeline Bool (MastodonResult (List Status))
| AccountUnfollowed (MastodonResult Relationship) | AccountUnfollowed Account (MastodonResult Relationship)
| AppRegistered (MastodonResult AppRegistration) | AppRegistered (MastodonResult AppRegistration)
| AutoSearch (MastodonResult (List Account)) | AutoSearch (MastodonResult (List Account))
| ContextLoaded Status (MastodonResult Context) | ContextLoaded Status (MastodonResult Context)
@ -85,7 +85,7 @@ type Msg
| DeleteStatus Int | DeleteStatus Int
| DraftEvent DraftMsg | DraftEvent DraftMsg
| FilterNotifications NotificationFilter | FilterNotifications NotificationFilter
| FollowAccount Int | FollowAccount Account
| LoadAccount Int | LoadAccount Int
| LogoutClient Client | LogoutClient Client
| TimelineLoadNext String String | TimelineLoadNext String String
@ -101,7 +101,7 @@ type Msg
| SubmitDraft | SubmitDraft
| SwitchClient Client | SwitchClient Client
| Tick Time | Tick Time
| UnfollowAccount Int | UnfollowAccount Account
| UrlChange Navigation.Location | UrlChange Navigation.Location
| UnreblogStatus Status | UnreblogStatus Status
| ViewAccountFollowing Account | ViewAccountFollowing Account

View File

@ -135,11 +135,11 @@ update msg model =
CloseThread -> CloseThread ->
{ model | currentView = LocalTimelineView } ! [] { model | currentView = LocalTimelineView } ! []
FollowAccount id -> FollowAccount account ->
model ! [ Command.follow (List.head model.clients) id ] model ! [ Command.follow (List.head model.clients) account ]
UnfollowAccount id -> UnfollowAccount account ->
model ! [ Command.unfollow (List.head model.clients) id ] model ! [ Command.unfollow (List.head model.clients) account ]
DeleteStatus id -> DeleteStatus id ->
model ! [ Command.deleteStatus (List.head model.clients) id ] model ! [ Command.deleteStatus (List.head model.clients) id ]

View File

@ -47,7 +47,7 @@ update msg model =
Err error -> Err error ->
{ model | errors = addErrorNotification (errorText error) model } ! [] { model | errors = addErrorNotification (errorText error) model } ! []
AccountFollowed result -> AccountFollowed _ result ->
case result of case result of
Ok { decoded } -> Ok { decoded } ->
processFollowEvent decoded True model ! [] processFollowEvent decoded True model ! []
@ -55,10 +55,10 @@ update msg model =
Err error -> Err error ->
{ model | errors = addErrorNotification (errorText error) model } ! [] { model | errors = addErrorNotification (errorText error) model } ! []
AccountUnfollowed result -> AccountUnfollowed account result ->
case result of case result of
Ok { decoded } -> Ok { decoded } ->
processFollowEvent decoded False model ! [] processUnfollowEvent account decoded model ! []
Err error -> Err error ->
{ model | errors = addErrorNotification (errorText error) model } ! [] { model | errors = addErrorNotification (errorText error) model } ! []
@ -328,3 +328,19 @@ processFollowEvent relationship flag model =
| accountRelationships = accountRelationships | accountRelationships = accountRelationships
, accountRelationship = accountRelationship , accountRelationship = accountRelationship
} }
processUnfollowEvent : Account -> Relationship -> Model -> Model
processUnfollowEvent account relationship model =
let
newModel =
processFollowEvent relationship False model
in
case model.currentUser of
Just currentUser ->
{ newModel
| homeTimeline = Update.Timeline.cleanUnfollow account currentUser model.homeTimeline
}
Nothing ->
newModel

View File

@ -1,6 +1,7 @@
module Update.Timeline module Update.Timeline
exposing exposing
( deleteStatusFromAllTimelines ( cleanUnfollow
, deleteStatusFromAllTimelines
, deleteStatus , deleteStatus
, empty , empty
, markAsLoading , markAsLoading
@ -17,6 +18,30 @@ import Mastodon.Model exposing (..)
import Types exposing (..) import Types exposing (..)
type alias CurrentUser =
Account
{-| Remove statuses from a given account when they're not a direct mention to
the current user. This is typically used after an account has been unfollowed.
-}
cleanUnfollow : Account -> CurrentUser -> Timeline Status -> Timeline Status
cleanUnfollow account currentUser timeline =
let
keep status =
if Mastodon.Helper.sameAccount account status.account then
case List.head status.mentions of
Just mention ->
mention.id == currentUser.id && mention.acct == currentUser.acct
Nothing ->
False
else
True
in
{ timeline | entries = List.filter keep timeline.entries }
deleteStatusFromCurrentView : Int -> Model -> CurrentView deleteStatusFromCurrentView : Int -> Model -> CurrentView
deleteStatusFromCurrentView id model = deleteStatusFromCurrentView id model =
-- Note: account timeline is already cleaned in deleteStatusFromAllTimelines -- Note: account timeline is already cleaned in deleteStatusFromAllTimelines

View File

@ -58,13 +58,13 @@ followButton currentUser relationship account =
Just relationship -> Just relationship ->
if relationship.following then if relationship.following then
( UnfollowAccount account.id ( UnfollowAccount account
, "btn btn-default btn-primary" , "btn btn-default btn-primary"
, "eye-close" , "eye-close"
, "Unfollow" , "Unfollow"
) )
else else
( FollowAccount account.id ( FollowAccount account
, "btn btn-default" , "btn btn-default"
, "eye-open" , "eye-open"
, "Follow" , "Follow"

View File

@ -75,6 +75,31 @@ accountPloum =
} }
statusNico : Status
statusNico =
{ account = accountNico
, application = Nothing
, content = "<p>hello</p>"
, created_at = "2017-04-24T20:12:20.922Z"
, favourited = Nothing
, favourites_count = 0
, id = 737931
, in_reply_to_account_id = Nothing
, in_reply_to_id = Nothing
, media_attachments = []
, mentions = []
, reblog = Nothing
, reblogged = Nothing
, reblogs_count = 0
, sensitive = Just False
, spoiler_text = ""
, tags = []
, uri = "tag:mamot.fr,2017-04-24:objectId=737932:objectType=Status"
, url = Just "https://mamot.fr/@n1k0/737931"
, visibility = "public"
}
statusNicoToVjousse : Status statusNicoToVjousse : Status
statusNicoToVjousse = statusNicoToVjousse =
{ account = accountNico { account = accountNico

View File

@ -2,6 +2,7 @@ port module Main exposing (..)
import MastodonTest.HelperTest import MastodonTest.HelperTest
import MastodonTest.HttpTest import MastodonTest.HttpTest
import UpdateTest.TimelineTest
import Test import Test
import Test.Runner.Node exposing (run, TestProgram) import Test.Runner.Node exposing (run, TestProgram)
import Json.Encode exposing (Value) import Json.Encode exposing (Value)
@ -13,6 +14,7 @@ main =
Test.concat Test.concat
[ MastodonTest.HelperTest.all [ MastodonTest.HelperTest.all
, MastodonTest.HttpTest.all , MastodonTest.HttpTest.all
, UpdateTest.TimelineTest.all
] ]

View File

@ -0,0 +1,39 @@
module UpdateTest.TimelineTest exposing (..)
import Test exposing (..)
import Update.Timeline
import Expect
import Fixtures
all : Test
all =
describe "Update.Timeline tests"
[ describe "removeAccountStatuses"
[ test "Remove account statuses" <|
\() ->
let
timeline =
{ id = "foo"
, entries =
[ Fixtures.statusNico -- discard
, Fixtures.statusNicoToVjousse
, Fixtures.statusNicoToVjousseAgain
, Fixtures.statusPloumToVjousse
, Fixtures.statusReblogged
]
, links = { prev = Nothing, next = Nothing }
, loading = False
}
in
timeline
|> Update.Timeline.removeAccountStatuses Fixtures.accountNico Fixtures.accountVjousse
|> .entries
|> Expect.equal
[ Fixtures.statusNicoToVjousse
, Fixtures.statusNicoToVjousseAgain
, Fixtures.statusPloumToVjousse
, Fixtures.statusReblogged
]
]
]

View File

@ -28,7 +28,8 @@
"elm-lang/websocket": "1.0.2 <= v < 2.0.0", "elm-lang/websocket": "1.0.2 <= v < 2.0.0",
"evancz/url-parser": "2.0.1 <= v < 3.0.0", "evancz/url-parser": "2.0.1 <= v < 3.0.0",
"jinjor/elm-html-parser": "1.1.5 <= v < 2.0.0", "jinjor/elm-html-parser": "1.1.5 <= v < 2.0.0",
"lukewestby/elm-http-builder": "5.1.0 <= v < 6.0.0" "lukewestby/elm-http-builder": "5.1.0 <= v < 6.0.0",
"thebritican/elm-autocomplete": "4.0.3 <= v < 5.0.0"
}, },
"elm-version": "0.18.0 <= v < 0.19.0" "elm-version": "0.18.0 <= v < 0.19.0"
} }