open Brr type file = { file : File.t ; content : Jstr.t } type t = file option (** Read the content from the file *) let file_loader : file option Note.E.send -> File.t -> unit = fun event file -> let blob = File.as_blob file in Fut.await (Blob.text blob) (Result.iter (fun content -> event (Some {file; content}) )) let create : unit -> t Note.signal * Brr.El.t = fun () -> let add_file_event, add_file_sender = Note.E.create () in let i = El.input () ~at:[ At.type' (Jstr.v "file") ; (At.v (Jstr.v "accept")) (Jstr.v ".json") ] in (* The event return a list of files. We are only interested by a single on, and keep only the first from the list. *) let on_change files = file_loader add_file_sender (List.hd files) in Ev.listen Ev.change (fun _e -> on_change (El.Input.files i)) (El.as_target i); let state = Note.S.hold None add_file_event in ( state , i )