|
| 1 | +module ReadPrintFileContentsConcur.Main where |
| 2 | + |
| 3 | +import Prelude |
| 4 | + |
| 5 | +import Concur.Core (Widget) |
| 6 | +import Concur.React (HTML) |
| 7 | +import Concur.React.DOM as D |
| 8 | +import Concur.React.Props as P |
| 9 | +import Concur.React.Run (runWidgetInDom) |
| 10 | +import Data.Maybe (Maybe(..), maybe) |
| 11 | +import Effect (Effect) |
| 12 | +import Effect.Aff.Class (liftAff) |
| 13 | +import Effect.Class (liftEffect) |
| 14 | +import Web.File.File (toBlob) |
| 15 | +import Web.File.FileList (FileList, item) |
| 16 | +import Web.File.FileReader.Aff (readAsText) |
| 17 | +import Web.HTML.HTMLInputElement (files, fromEventTarget) |
| 18 | +import React.SyntheticEvent (target, SyntheticEvent_, NativeEventTarget) |
| 19 | +import Unsafe.Coerce (unsafeCoerce) |
| 20 | +import Web.Event.Internal.Types (EventTarget) |
| 21 | + |
| 22 | +fileList :: EventTarget -> Effect (Maybe FileList) |
| 23 | +fileList tar = case fromEventTarget tar of |
| 24 | + Just elem -> files elem |
| 25 | + _ -> pure Nothing |
| 26 | + |
| 27 | +getContent :: forall t |
| 28 | + . Widget HTML (SyntheticEvent_ ( target :: NativeEventTarget |
| 29 | + | t |
| 30 | + ) |
| 31 | + ) -> Widget HTML String |
| 32 | +getContent ev = do |
| 33 | + nativeTarget <- liftEffect =<< target <$> ev |
| 34 | + mfs <- liftEffect $ fileList $ unsafeCoerce nativeTarget |
| 35 | + liftAff $ maybe (pure "") |
| 36 | + readAsText |
| 37 | + $ (Just <<< toBlob) =<< item 0 =<< mfs |
| 38 | + |
| 39 | +textFileToScreenWidget ∷ Widget HTML String |
| 40 | +textFileToScreenWidget = do |
| 41 | + content <- getContent $ D.input [ P._type "file" |
| 42 | + , P.onChange |
| 43 | + ] |
| 44 | + D.pre' [D.text content] |
| 45 | + |
| 46 | +main :: Effect Unit |
| 47 | +main = do |
| 48 | + runWidgetInDom "app" textFileToScreenWidget |
| 49 | + |
0 commit comments