Skip to content

Commit a436fb8

Browse files
committed
file upload support
1 parent 65614bb commit a436fb8

File tree

6 files changed

+38
-24
lines changed

6 files changed

+38
-24
lines changed

ghcjs/delivery-calculator/delivery-calculator.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 2.2
22
name: delivery-calculator
3-
version: 0.1.0.3
3+
version: 0.1.0.4
44
synopsis: Delivery Calculator
55
category: Web
66
build-type: Simple

ghcjs/delivery-calculator/trapeze.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
platforms:
22
android:
33
appName: Delivery Calculator
4-
versionCode: 3
5-
versionName: 0.1.0.3
4+
versionCode: 4
5+
versionName: 0.1.0.4
66
packageName: com.functora.delivery_calculator
77
manifest:
88
- file: AndroidManifest.xml

ghcjs/miso-functora/js/main.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,22 @@ export async function compressImage(quality, prevImage) {
4444

4545
export async function selectClipboard() {
4646
const { value } = await Clipboard.read();
47+
return await selectDataUrl(value);
48+
}
49+
50+
export async function selectFile(file) {
51+
const value = await new Promise((resolve, reject) => {
52+
var fr = new FileReader();
53+
fr.onload = () => {
54+
resolve(fr.result);
55+
};
56+
fr.onerror = reject;
57+
fr.readAsDataURL(file);
58+
});
59+
return await selectDataUrl(value);
60+
}
61+
62+
export async function selectDataUrl(value) {
4763
try {
4864
const { buffer: u8a, typeFull: mime } = dataUriToBuffer(value);
4965
let blob = new Blob([u8a], { type: mime });

ghcjs/miso-functora/js/main.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ghcjs/miso-functora/src/Functora/Miso/Jsm/Generic.hs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Functora.Miso.Jsm.Generic
1010
selectStorage,
1111
selectBarcode,
1212
selectClipboard,
13+
selectFile,
1314
genericPromise,
1415
printCurrentPage,
1516
saveFile,
@@ -166,6 +167,12 @@ selectClipboard after =
166167
$ after
167168
. fmap strip
168169

170+
selectFile :: JS.JSVal -> (Maybe Unicode -> JSM ()) -> JSM ()
171+
selectFile file after =
172+
genericPromise @[JS.JSVal] @Unicode "selectFile" [file]
173+
$ after
174+
. fmap strip
175+
169176
genericPromise ::
170177
forall args res.
171178
( JS.MakeArgs args,

ghcjs/miso-functora/src/Functora/Miso/Widgets/Field.hs

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import qualified Functora.Miso.Widgets.Dialog as Dialog
2525
import qualified Functora.Miso.Widgets.Icon as Icon
2626
import qualified Functora.Miso.Widgets.Qr as Qr
2727
import qualified Functora.Miso.Widgets.Select as Select
28-
import Language.Javascript.JSaddle ((!))
2928
import qualified Language.Javascript.JSaddle as JS
3029
import qualified Miso.String as MS
3130

@@ -305,7 +304,7 @@ field full@Full {fullArgs = args, fullParser = parser, fullViewer = viewer} opts
305304
. #fieldOutput
306305
%~ maybe id (const . id) (getOutput next)
307306
onInputFileAction =
308-
const . fromMaybe action (optsOnInputAction opts) . ImpureUpdate $ do
307+
const . fromMaybe action (optsOnInputAction opts) . EffectUpdate $ do
309308
el <-
310309
getElementById
311310
. either impureThrow ("file-" <>)
@@ -314,35 +313,27 @@ field full@Full {fullArgs = args, fullParser = parser, fullViewer = viewer} opts
314313
$ htmlUid uid
315314
elExist <- ghcjsPure $ JS.isTruthy el
316315
if not elExist
317-
then pure id
316+
then Jsm.popupText @Unicode "File does not exist!"
318317
else do
319-
file <-
320-
el JS.! ("files" :: Unicode) JS.!! 0
321-
link <-
322-
JS.global
323-
! ("URL" :: Unicode)
324-
^. JS.js1 ("createObjectURL" :: Unicode) file
325-
murl <-
326-
JS.fromJSVal link
327-
case murl of
328-
Nothing -> pure id
329-
Just (url :: Unicode) -> do
318+
file <- el JS.! ("files" :: Unicode) JS.!! 0
319+
Jsm.selectFile file $ \case
320+
Nothing -> Jsm.popupText @Unicode "File is not selected!"
321+
Just url -> argsEmitter args . PureUpdate $ do
330322
let next =
331323
st
332324
& cloneTraversal optic
333325
. #fieldInput
334326
. #uniqueValue
335327
.~ url
336-
pure
337-
$ ( cloneTraversal optic
328+
in ( cloneTraversal optic
338329
. #fieldInput
339330
. #uniqueValue
340331
.~ url
341332
)
342-
. ( cloneTraversal optic
343-
. #fieldOutput
344-
%~ maybe id (const . id) (getOutput next)
345-
)
333+
. ( cloneTraversal optic
334+
. #fieldOutput
335+
%~ maybe id (const . id) (getOutput next)
336+
)
346337

347338
ratioField ::
348339
Args model action Rational Unique ->

0 commit comments

Comments
 (0)