@@ -106,7 +106,9 @@ defmodule KsefHubWeb.InvoiceLive.Show do
106106 payment_status: payment_status ,
107107 public_link: public_link ,
108108 invoice_payment_requests: invoice_payment_requests ,
109- html_preview: generate_preview ( invoice ) ,
109+ html_preview: nil ,
110+ preview_ref: nil ,
111+ preview_loading: false ,
110112 categories: Invoices . list_categories ( company . id ) ,
111113 editing: auto_edit && can_mutate ,
112114 edit_form: build_edit_form ( invoice ) ,
@@ -128,10 +130,27 @@ defmodule KsefHubWeb.InvoiceLive.Show do
128130 tag_confidence_threshold: InvoiceClassifier . tag_confidence_threshold ( )
129131 )
130132 |> stream ( :activity_log , activity_entries )
133+ |> start_preview_task ( invoice )
131134 |> refresh_tabs ( ) }
132135 end
133136 end
134137
138+ @ spec start_preview_task ( Phoenix.LiveView.Socket . t ( ) , Invoice . t ( ) ) ::
139+ Phoenix.LiveView.Socket . t ( )
140+ defp start_preview_task ( socket , % { xml_file: % { content: content } } = invoice )
141+ when is_binary ( content ) and content != "" do
142+ if connected? ( socket ) do
143+ task =
144+ Task.Supervisor . async_nolink ( KsefHub.TaskSupervisor , fn -> generate_preview ( invoice ) end )
145+
146+ assign ( socket , preview_ref: task . ref , preview_loading: true )
147+ else
148+ socket
149+ end
150+ end
151+
152+ defp start_preview_task ( socket , _invoice ) , do: socket
153+
135154 @ spec refresh_tabs ( Phoenix.LiveView.Socket . t ( ) ) :: Phoenix.LiveView.Socket . t ( )
136155 defp refresh_tabs ( socket ) , do: assign ( socket , :visible_tabs , visible_tabs ( socket . assigns ) )
137156
@@ -845,6 +864,16 @@ defmodule KsefHubWeb.InvoiceLive.Show do
845864 |> put_flash ( :error , "Re-extraction crashed. Please try again." ) }
846865 end
847866
867+ def handle_info ( { ref , html } , % { assigns: % { preview_ref: ref } } = socket ) when is_reference ( ref ) do
868+ Process . demonitor ( ref , [ :flush ] )
869+ { :noreply , assign ( socket , html_preview: html , preview_ref: nil , preview_loading: false ) }
870+ end
871+
872+ def handle_info ( { :DOWN , ref , :process , _pid , _reason } , % { assigns: % { preview_ref: ref } } = socket )
873+ when is_reference ( ref ) do
874+ { :noreply , assign ( socket , preview_ref: nil , preview_loading: false ) }
875+ end
876+
848877 def handle_info ( { :new_activity , audit_log } , socket ) do
849878 { :noreply ,
850879 socket
@@ -1270,6 +1299,12 @@ defmodule KsefHubWeb.InvoiceLive.Show do
12701299 < h2 class = "mb-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground " >
12711300 Preview
12721301 </ h2 >
1302+ < div
1303+ :if = { @ preview_loading }
1304+ class = "flex items-center justify-center flex-1 min-h-[600px] text-muted-foreground text-sm "
1305+ >
1306+ Loading preview…
1307+ </ div >
12731308 < div
12741309 :if = { @ html_preview }
12751310 class = "border border-border rounded-lg overflow-hidden flex-1 min-h-[600px] "
@@ -1283,7 +1318,7 @@ defmodule KsefHubWeb.InvoiceLive.Show do
12831318 </ iframe >
12841319 </ div >
12851320 < div
1286- :if = { ! @ html_preview && @ invoice . pdf_file }
1321+ :if = { ! @ preview_loading && ! @ html_preview && @ invoice . pdf_file }
12871322 class = "border border-border rounded-lg overflow-hidden flex-1 min-h-[600px] "
12881323 >
12891324 < iframe
@@ -1294,7 +1329,7 @@ defmodule KsefHubWeb.InvoiceLive.Show do
12941329 </ iframe >
12951330 </ div >
12961331 < p
1297- :if = { ! @ html_preview && ! @ invoice . pdf_file }
1332+ :if = { ! @ preview_loading && ! @ html_preview && ! @ invoice . pdf_file }
12981333 class = "text-muted-foreground text-sm "
12991334 >
13001335 No preview available. XML content may be missing.
0 commit comments