@@ -3,7 +3,7 @@ defmodule ExRssWeb.FeedLive.Index do
3
3
4
4
use ExRssWeb , :live_view
5
5
6
- alias ExRss . { Entry , Feed , Repo , User }
6
+ alias ExRss . { Entry , Feed , Repo , User , FeedRemover }
7
7
8
8
def mount (
9
9
_params ,
@@ -165,6 +165,53 @@ defmodule ExRssWeb.FeedLive.Index do
165
165
update_feed_position ( feed_id , nil , socket )
166
166
end
167
167
168
+ def handle_event ( "remove_feed" , % { "feed-id" => feed_id } , socket ) do
169
+ current_user = Repo . get! ( User , socket . assigns . current_user . id )
170
+
171
+ multi =
172
+ FeedRemover . remove_feed ( current_user , % { "id" => feed_id } )
173
+
174
+ case Repo . transaction ( multi ) do
175
+ { :ok , % { feed: _ } } ->
176
+ feeds_of_current_user = current_user |> Ecto . assoc ( :feeds )
177
+
178
+ feeds_with_counts =
179
+ from (
180
+ f in feeds_of_current_user ,
181
+ join: e in Entry ,
182
+ on: f . id == e . feed_id ,
183
+ group_by: f . id ,
184
+ order_by: [ desc_nulls_last: f . position ] ,
185
+ select: % {
186
+ f
187
+ | unread_entries_count: filter ( count ( e . id ) , e . read == false ) ,
188
+ read_entries_count: filter ( count ( e . id ) , e . read == true ) ,
189
+ has_error: f . retries > 0
190
+ }
191
+ )
192
+
193
+ feeds =
194
+ feeds_with_counts
195
+ |> Repo . all ( )
196
+ |> Repo . preload (
197
+ entries: from ( e in Entry , where: e . read == false , order_by: [ desc: e . posted_at ] )
198
+ )
199
+
200
+ oldest_unread_entry =
201
+ User . oldest_unread_entry ( socket . assigns . current_user . id )
202
+
203
+ socket =
204
+ socket
205
+ |> assign ( :oldest_unread_entry , oldest_unread_entry )
206
+ |> stream ( :feeds , feeds , reset: true )
207
+
208
+ { :noreply , socket }
209
+
210
+ _ ->
211
+ { :noreply , socket }
212
+ end
213
+ end
214
+
168
215
def update_feed_position ( feed_id , position , socket ) do
169
216
changeset =
170
217
Repo . get! ( User , socket . assigns . current_user . id )
0 commit comments