File.purs 2.72 KB
Newer Older
1 2 3
module Gargantext.Components.Nodes.File where

import Data.Argonaut (class DecodeJson, decodeJson, (.:))
4
import Data.Maybe (Maybe(..))
5
import Effect.Aff (Aff)
6 7 8 9
import Reactix as R
import Reactix.DOM.HTML as H

import Gargantext.Prelude
10
import Gargantext.Ends (toUrl)
11 12
import Gargantext.Hooks.Loader (useLoader)
import Gargantext.Routes (SessionRoute(..))
James Laver's avatar
James Laver committed
13 14
import Gargantext.Sessions (Session, get, sessionId)
import Gargantext.Types (NodeType(..), NodeID)
15 16
import Gargantext.Utils.Reactix as R2

James Laver's avatar
James Laver committed
17 18
here :: R2.Here
here = R2.here "Gargantext.Components.Nodes.File"
19

James Laver's avatar
James Laver committed
20 21 22
newtype HyperdataFile =
  HyperdataFile
  { mime :: String
23 24 25 26 27 28
  , name :: String
  , path :: String
  }

instance decodeHyperdataFile :: DecodeJson HyperdataFile where
  decodeJson json = do
James Laver's avatar
James Laver committed
29
    obj  <- decodeJson json
30 31 32
    mime <- obj .: "mime"
    name <- obj .: "name"
    path <- obj .: "path"
James Laver's avatar
James Laver committed
33
    pure $ HyperdataFile { mime, name, path }
34

James Laver's avatar
James Laver committed
35 36 37 38
newtype File =
  File
  { id        :: Int
  , date      :: String
39
  , hyperdata :: HyperdataFile
James Laver's avatar
James Laver committed
40
  , name      :: String
41 42 43 44
  }

instance decodeFile :: DecodeJson File where
  decodeJson json = do
James Laver's avatar
James Laver committed
45 46 47 48 49 50
    obj       <- decodeJson json
    id        <- obj .: "id"
    date      <- obj .: "date"
    name      <- obj .: "name"
    hyperdata <- (obj .: "hyperdata") >>= decodeJson
    pure $ File { id, date, hyperdata, name }
51

James Laver's avatar
James Laver committed
52
type FileLayoutProps = ( nodeId :: NodeID, session :: R.Context Session )
53

James Laver's avatar
James Laver committed
54
fileLayout :: R2.Leaf FileLayoutProps
55 56 57
fileLayout props = R.createElement fileLayoutCpt props []

fileLayoutCpt :: R.Component FileLayoutProps
James Laver's avatar
James Laver committed
58 59 60 61 62 63 64 65 66 67 68 69 70
fileLayoutCpt = here.component "fileLayout" cpt where
  cpt { nodeId, session } _ = R.useContext session >>= cp where
    cp s = useLoader nodeId (loadFile s) onLoad where
      onLoad loaded = fileLayoutLoaded { loaded, nodeId, session: s } where
        key = show (sessionId s) <> "-" <> show nodeId

loadFile :: Session -> NodeID -> Aff File
loadFile session nodeId = get session $ NodeAPI Node (Just nodeId) ""

type FileLayoutLoadedProps =
  ( loaded  :: File
  , nodeId  :: Int
  , session :: Session
71 72 73 74 75 76
  )

fileLayoutLoaded :: Record FileLayoutLoadedProps -> R.Element
fileLayoutLoaded props = R.createElement fileLayoutLoadedCpt props []

fileLayoutLoadedCpt :: R.Component FileLayoutLoadedProps
James Laver's avatar
James Laver committed
77 78 79 80 81 82 83 84 85 86
fileLayoutLoadedCpt = here.component "fileLayoutLoaded" cpt where
  cpt { loaded: File { hyperdata: HyperdataFile hyperdata }, nodeId, session } _ = do
    R.useEffect' $ here.log hyperdata
    pure $
      H.div { className: "col-md-12" }
      [ H.div { className: "row" } [ H.h2 {} [ H.text hyperdata.name ] ]
      , H.div { className: "row" }
        [ H.div { className: "btn btn-primary" }
          [ H.a { href, target: "_blank" } [ H.text "Download" ]]]] where
      href = toUrl session ("node/" <> show nodeId <> "/file/download")