@@ -77,7 +77,8 @@ defmodule Phoenix.LiveView.UploadConfig do
7777 :errors ,
7878 :auto_upload? ,
7979 :progress_event ,
80- :writer
80+ :writer ,
81+ :validator
8182 ] }
8283
8384 defstruct name: nil ,
@@ -99,7 +100,8 @@ defmodule Phoenix.LiveView.UploadConfig do
99100 errors: [ ] ,
100101 auto_upload?: false ,
101102 progress_event: nil ,
102- writer: nil
103+ writer: nil ,
104+ validator: nil
103105
104106 @ type t :: % __MODULE__ {
105107 name: atom ( ) | String . t ( ) ,
@@ -124,6 +126,7 @@ defmodule Phoenix.LiveView.UploadConfig do
124126 auto_upload?: boolean ( ) ,
125127 writer: ( name :: atom ( ) | String . t ( ) , UploadEntry . t ( ) , Phoenix.LiveView.Socket . t ( ) ->
126128 { module ( ) , term ( ) } ) ,
129+ validator: ( UploadEntry . t ( ) -> :ok | { :error , atom ( ) } ) | nil ,
127130 progress_event:
128131 ( name :: atom ( ) | String . t ( ) , UploadEntry . t ( ) , Phoenix.LiveView.Socket . t ( ) ->
129132 { :noreply , Phoenix.LiveView.Socket . t ( ) } )
@@ -294,6 +297,24 @@ defmodule Phoenix.LiveView.UploadConfig do
294297 fn _name , _entry , _socket -> { Phoenix.LiveView.UploadTmpFileWriter , [ ] } end
295298 end
296299
300+ validator =
301+ case Keyword . fetch ( opts , :validator ) do
302+ { :ok , func } when is_function ( func , 1 ) ->
303+ func
304+
305+ { :ok , other } ->
306+ raise ArgumentError , """
307+ invalid :validator value provided to allow_upload.
308+
309+ Only a 1-arity anonymous function is supported. Got:
310+
311+ #{ inspect ( other ) }
312+ """
313+
314+ :error ->
315+ fn _entry -> :ok end
316+ end
317+
297318 % UploadConfig {
298319 ref: random_ref ,
299320 name: name ,
@@ -309,6 +330,7 @@ defmodule Phoenix.LiveView.UploadConfig do
309330 chunk_timeout: chunk_timeout ,
310331 progress_event: progress_event ,
311332 writer: writer ,
333+ validator: validator ,
312334 auto_upload?: Keyword . get ( opts , :auto_upload , false ) ,
313335 allowed?: true
314336 }
@@ -558,6 +580,7 @@ defmodule Phoenix.LiveView.UploadConfig do
558580 { :ok , entry }
559581 |> validate_max_file_size ( conf )
560582 |> validate_accepted ( conf )
583+ |> call_validator ( conf )
561584 |> case do
562585 { :ok , entry } ->
563586 { :ok , put_valid_entry ( conf , entry ) }
@@ -632,6 +655,15 @@ defmodule Phoenix.LiveView.UploadConfig do
632655 end
633656 end
634657
658+ defp call_validator ( { :ok , entry } , % UploadConfig { validator: validator_fun } ) do
659+ case validator_fun . ( entry ) do
660+ { :error , reason } -> { :error , reason }
661+ _ -> { :ok , entry }
662+ end
663+ end
664+
665+ defp call_validator ( { :error , _ } = error , _conf ) , do: error
666+
635667 defp recalculate_computed_fields ( % UploadConfig { } = conf ) do
636668 recalculate_errors ( conf )
637669 end
0 commit comments