{-# LANGUAGE OverloadedStrings, TypeFamilies, ScopedTypeVariables, TemplateHaskell #-}
module Main (main) where
import Data.Time
import React.Flux
import React.Flux.Addons.Intl
import GHCJS.Types (JSRef)
import Data.Aeson ((.=))
import TestClient
--------------------------------------------------------------------------------
--- Intl
--------------------------------------------------------------------------------
foreign import javascript unsafe
"{'with_trans': 'message from translation {abc}'}"
js_translations :: JSRef
intlSpec :: ReactView ()
intlSpec = defineView "intl" $ \() ->
intlProvider_ "en-US" (Just js_translations) Nothing $
view intlSpecBody () mempty
intlSpecBody :: ReactView ()
intlSpecBody = defineView "intl body" $ \() -> div_ ["id" $= "intl-spec"] $
ul_ $ do
li_ ["id" $= "f-number"] $
formattedNumber_ [ "value" @= (0.9 :: Double), "style" $= "percent" ]
li_ ["id" $= "f-int"] $ int_ 100000
li_ ["id" $= "f-double"] $ double_ 40000.2
li_ ["id" $= "f-number-prop"] $
input_ [formattedNumberProp "placeholder" (123456 :: Int) []]
let moon = fromGregorian 1969 7 20
fullDayF = DayFormat { weekdayF = Just "long", eraF = Just "short", yearF = Just "2-digit", monthF = Just "long", dayF = Just "2-digit" }
li_ ["id" $= "f-shortday"] $ day_ shortDate moon
li_ ["id" $= "f-fullday"] $ day_ fullDayF moon
li_ ["id" $= "f-date"] $ formattedDate_ (Left moon)
[ "weekday" $= "short", "month" $= "short", "day" $= "numeric", "year" $= "2-digit" ]
li_ ["id" $= "f-date-prop"] $
input_ [formattedDateProp "placeholder" (Left moon) []]
let step = UTCTime moon (2*60*60 + 56*60) -- 1969-7-20 02:56 UTC
fullT = (fullDayF, TimeFormat { hourF = Just "numeric", minuteF = Just "2-digit", secondF = Just "numeric", timeZoneNameF = Just "long" })
li_ ["id" $= "f-shorttime"] $ utcTime_ shortDateTime step
li_ ["id" $= "f-fulltime"] $ utcTime_ fullT step
li_ ["id" $= "f-time"] $ formattedDate_ (Right step)
[ "year" $= "2-digit", "month" $= "short", "day" $= "numeric"
, "hour" $= "numeric", "minute" $= "2-digit", "second" $= "numeric"
, "timeZoneName" $= "short"
, "timeZone" $= "Pacific/Tahiti"
]
li_ ["id" $= "f-time-prop"] $
input_ [formattedDateProp "placeholder" (Right step)
[ "year" .= ("2-digit" :: String)
, "month" .= ("short" :: String)
, "day" .= ("2-digit" :: String)
, "hour" .= ("numeric" :: String)
, "timeZone" .= ("Pacific/Tahiti" :: String)
]
]
{-
li_ ["id" $= "f-relative"] $ relativeTo_ step
li_ ["id" $= "f-relative-days"] $ formattedRelative_ step [ "units" $= "day" ]
-}
li_ ["id" $= "f-plural"] $ plural_ [ "value" @= (100 :: Int), "one" $= "plural one", "other" $= "plural other"]
li_ ["id" $= "f-plural-prop"] $
input_ [pluralProp "placeholder" (100 :: Int) ["one" .= ("plural one" :: String), "other" .= ("plural other" :: String)]]
li_ ["id" $= "f-msg"] $
$(message "photos" "{name} took {numPhotos, plural, =0 {no photos} =1 {one photo} other {# photos}} {takenAgo}.")
[ "name" $= "Neil Armstrong"
, "numPhotos" @= (100 :: Int)
, elementProperty "takenAgo" $ span_ ["id" $= "takenAgoSpan"] "years ago"
]
li_ ["id" $= "f-msg-prop"] $
input_ [ $(messageProp "placeholder" "photosprop" "{name} took {numPhotos, plural, =0 {no photos} =1 {one photo} other {# photos}}")
[ "name" .= ("Neil Armstrong" :: String)
, "numPhotos" .= (100 :: Int)
]
]
li_ ["id" $= "f-msg-with-trans"] $
$(message "with_trans" "this is not used {abc}") ["abc" $= "xxx"]
li_ ["id" $= "f-msg-with-descr"] $
$(message' "photos2" "How many photos?" "{name} took {numPhotos, plural, =0 {no photos} =1 {one photo} other {# photos}}.")
[ "name" $= "Neil Armstrong"
, "numPhotos" @= (0 :: Int)
]
li_ ["id" $= "f-msg-prop-with-descr"] $
input_ [$(messageProp' "placeholder" "photosprop2" "How many photos?" "{name} took {numPhotos, number} photos")
[ "name" .= ("Neil Armstrong" :: String)
, "numPhotos" .= (0 :: Int)
]
]
li_ ["id" $= "f-html-msg"] $
$(htmlMsg "html1" "{num} is the answer to life, the universe, and everything")
[ "num" @= (42 :: Int) ]
li_ ["id" $= "f-html-msg-with-descr"] $
$(htmlMsg' "html2" "Hitchhiker's Guide" "{num} is the answer to life, the universe, and everything")
[ "num" @= (42 :: Int) ]
--------------------------------------------------------------------------------
--- Main
--------------------------------------------------------------------------------
-- | Test a lifecycle view with all lifecycle methods nothing
app :: ReactView ()
app = defineView "main app" $ \() -> do
view testClient () mempty
view intlSpec () mempty
main :: IO ()
main = reactRender "app" app ()
writeIntlMessages (intlFormatJson "test/client/msgs/jsonmsgs.json")
writeIntlMessages (intlFormatJsonWithoutDescription "test/client/msgs/jsonnodescr.json")
writeIntlMessages (intlFormatAndroidXML "test/client/msgs/android.xml")