From dd5292555a5ad21bdbdd54dafbe0548797756981 Mon Sep 17 00:00:00 2001 From: Zach Gollwitzer Date: Thu, 15 May 2025 08:18:12 -0400 Subject: [PATCH] Plaid item UI broadcasts for sync --- app/models/account.rb | 12 ++++++++++++ app/models/account/syncer.rb | 6 ++++++ app/models/concerns/syncable.rb | 2 +- app/models/plaid_item/syncer.rb | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/models/account.rb b/app/models/account.rb index ee2fc963..8c74b83e 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -61,6 +61,18 @@ class Account < ApplicationRecord end end + def syncing? + self_syncing = syncs.incomplete.any? + + # Since Plaid Items sync as a "group", if the item is syncing, even if the account + # sync hasn't yet started (i.e. we're still fetching the Plaid data), show it as syncing in UI. + if linked? + plaid_account&.plaid_item&.syncing? || self_syncing + else + self_syncing + end + end + def institution_domain url_string = plaid_account&.plaid_item&.institution_url return nil unless url_string.present? diff --git a/app/models/account/syncer.rb b/app/models/account/syncer.rb index e21e25a1..5554370b 100644 --- a/app/models/account/syncer.rb +++ b/app/models/account/syncer.rb @@ -14,6 +14,12 @@ class Account::Syncer account.family.auto_match_transfers! account.broadcast_refresh SyncCompleteEvent.new(account.family, accounts: [ account ]).broadcast + account.broadcast_replace_to( + account.family, + target: "account_#{account.id}", + partial: "accounts/account", + locals: { account: account } + ) end private diff --git a/app/models/concerns/syncable.rb b/app/models/concerns/syncable.rb index 33668458..3d4ec844 100644 --- a/app/models/concerns/syncable.rb +++ b/app/models/concerns/syncable.rb @@ -6,7 +6,7 @@ module Syncable end def syncing? - syncs.incomplete.any? + raise NotImplementedError, "Subclasses must implement the syncing? method" end def sync_later(parent_sync: nil, window_start_date: nil, window_end_date: nil) diff --git a/app/models/plaid_item/syncer.rb b/app/models/plaid_item/syncer.rb index 51c3f32f..8baeed42 100644 --- a/app/models/plaid_item/syncer.rb +++ b/app/models/plaid_item/syncer.rb @@ -25,6 +25,12 @@ class PlaidItem::Syncer def perform_post_sync plaid_item.auto_match_categories! SyncCompleteEvent.new(plaid_item.family, accounts: plaid_item.accounts).broadcast + plaid_item.broadcast_replace_to( + plaid_item.family, + target: "plaid_item_#{plaid_item.id}", + partial: "plaid_items/plaid_item", + locals: { plaid_item: plaid_item } + ) end private