module Page.ListCollection ( Model, initialModel, Action, updateModel, viewModel, ) where import Api import Data.Aeson qualified as A import Data.Aeson.KeyMap qualified as AM import Form qualified as F import Miso import Miso.String (toMisoString) import Schema data Model = Model { collection :: String, input :: A.Value, schema :: Schema, posts :: [A.Value] } deriving (Show, Eq) initialModel :: String -> JSM (Either String Model) initialModel collection = do schema' <- fetchSchema posts' <- fetchPosts pure do schema <- schema' posts <- posts' pure $ Model {input = A.Object AM.empty, ..} data Action = NoOp | FormChanged A.Value | FormSubmitted A.Value deriving (Eq, Show) updateModel :: Action -> Model -> Effect Action Model updateModel NoOp m = noEff m updateModel (FormChanged input) m = noEff m {input} updateModel (FormSubmitted output) m = m <# do const NoOp <$> consoleLog (toMisoString (A.encode output)) viewModel :: Model -> View Action viewModel m = div_ [] $ [ viewSchema m.schema, viewPosts m.posts, viewForm m.input m.schema, viewInput m.input ] viewForm :: A.Value -> Schema -> View Action viewForm input = fmap (either FormChanged FormSubmitted) . flip F.runForm input . schemaForm viewInput :: A.Value -> View Action viewInput input = pre_ [] [text (toMisoString (A.encode input))] viewPosts :: [A.Value] -> View Action viewPosts posts = ol_ [] (viewPost <$> posts) where viewPost post = pre_ [] [text (toMisoString (A.encode post))]