From 80cb497de53c16fe1fa2156c8d9a460dec9dfd0f Mon Sep 17 00:00:00 2001 From: Matthias Le Brun Date: Sat, 3 May 2025 16:26:47 +0200 Subject: [PATCH] proposal: make FormData more usable to get values this **kinda** goes against the zero-cost philosophy, but I don't see a world where users would not have to reimplement those. --- src/ReactDOM.bs.js | 39 ++++++++++++++++++++++++++++++++++++++- src/ReactDOM.res | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/ReactDOM.bs.js b/src/ReactDOM.bs.js index 06f42ca..fa51640 100644 --- a/src/ReactDOM.bs.js +++ b/src/ReactDOM.bs.js @@ -1,6 +1,7 @@ // Generated by ReScript, PLEASE EDIT WITH CARE 'use strict'; +var Caml_option = require("rescript/lib/js/caml_option.js"); var Root = {}; @@ -8,7 +9,43 @@ var Client = { Root: Root }; -var $$FormData = {}; +function getString(formData, name) { + var value = formData.get(name); + if (!(value == null) && typeof value === "string") { + return Caml_option.some(value); + } + +} + +function getFile(formData, name) { + var value = formData.get(name); + if (!(value == null) && typeof value !== "string") { + return Caml_option.some(value); + } + +} + +function getAll(t, string) { + return t.getAll(string).map(function (value) { + if (typeof value === "string") { + return { + TAG: "String", + _0: value + }; + } else { + return { + TAG: "File", + _0: value + }; + } + }); +} + +var $$FormData = { + getString: getString, + getFile: getFile, + getAll: getAll +}; var Ref = {}; diff --git a/src/ReactDOM.res b/src/ReactDOM.res index 160bb55..fbd564b 100644 --- a/src/ReactDOM.res +++ b/src/ReactDOM.res @@ -28,14 +28,43 @@ module Client = { // Very rudimentary form data bindings module FormData = { type t - type value + type file + + type formValue = + | String(string) + | File(file) @new external make: unit => t = "FormData" @send external append: (t, string, ~filename: string=?) => unit = "append" @send external delete: (t, string) => unit = "delete" - @send external get: (t, string) => option = "get" - @send external getAll: (t, string) => array = "getAll" + @return(nullable) @send external getUnsafe: (t, string) => option<'a> = "get" + @send external getAllUnsafe: (t, string) => array<'a> = "getAll" + + let getString = (formData, name) => { + switch formData->getUnsafe(name) { + | Some(value) => Js.typeof(value) === "string" ? Some(value) : None + | _ => None + } + } + + external _asFile: 'a => file = "%identity" + + let getFile = (formData, name) => { + switch formData->getUnsafe(name) { + | Some(value) => Js.typeof(value) === "string" ? None : Some(value->_asFile) + | _ => None + } + } + + let getAll = (t, string) => { + t + ->getAllUnsafe(string) + ->Js.Array2.map(value => { + Js.typeof(value) === "string" ? String(value) : File(value->_asFile) + }) + } + @send external set: (string, string) => unit = "set" @send external has: string => bool = "has" // @send external keys: t => Iterator.t = "keys";