From 2bc1488bb14b0a5d7c1dfe89c0b5519f58ee5c6f Mon Sep 17 00:00:00 2001 From: tusharad Date: Mon, 9 Sep 2024 17:18:30 +0530 Subject: [PATCH] UI: WIP, added CSS in header component --- haskread-platform-be/src/Platform/API.hs | 2 + .../src/Platform/User/Thread/DB.hs | 20 +- .../src/Platform/User/Thread/Handler.hs | 12 +- haskread-platform-ui/spago.yaml | 3 +- haskread-platform-ui/src/Common/Types.purs | 15 +- haskread-platform-ui/src/Common/Utils.purs | 7 +- .../src/Component/Header.purs | 213 +++++++++++------- .../src/Component/Router.purs | 16 +- .../src/Page/ChangePassword.purs | 19 +- .../src/Page/CreateThread.purs | 23 +- haskread-platform-ui/src/Page/DeleteUser.purs | 19 +- haskread-platform-ui/src/Page/Home.purs | 13 +- haskread-platform-ui/src/Page/Login.purs | 19 +- haskread-platform-ui/src/Page/OTP.purs | 23 +- .../src/Page/UpdateThread.purs | 35 +-- 15 files changed, 260 insertions(+), 179 deletions(-) diff --git a/haskread-platform-be/src/Platform/API.hs b/haskread-platform-be/src/Platform/API.hs index 9ef70c8..675e92c 100644 --- a/haskread-platform-be/src/Platform/API.hs +++ b/haskread-platform-be/src/Platform/API.hs @@ -366,6 +366,8 @@ type FetchAllThreadsAPI = :> "v1" :> "thread" :> "all" + :> QueryParam "limit" Int + :> QueryParam "offset" Int :> Get '[JSON] FetchAllThreadsResponse type FetchThreadAPI = diff --git a/haskread-platform-be/src/Platform/User/Thread/DB.hs b/haskread-platform-be/src/Platform/User/Thread/DB.hs index e65cbfd..904374f 100644 --- a/haskread-platform-be/src/Platform/User/Thread/DB.hs +++ b/haskread-platform-be/src/Platform/User/Thread/DB.hs @@ -80,22 +80,22 @@ fetchThreadInfoByIDQ tID = do res <- executeAndDecode SelectQuery - (fetchThreadInfoExpr (Just $ whereThreadIdIs tID)) + (fetchThreadInfoExpr (Just $ whereThreadIdIs tID) Nothing Nothing) (annotateSqlMarshallerEmptyAnnotation threadInfoMarshaller) case res of [] -> pure Nothing (x : _) -> pure $ Just x -fetchThreadInfoQ :: (MonadOrville m) => m [ThreadInfo] -fetchThreadInfoQ = +fetchThreadInfoQ :: (MonadOrville m) => Int -> Int -> m [ThreadInfo] +fetchThreadInfoQ limit offset = executeAndDecode SelectQuery - (fetchThreadInfoExpr Nothing) + (fetchThreadInfoExpr Nothing (Just (limitExpr limit)) (Just (offsetExpr offset))) (annotateSqlMarshallerEmptyAnnotation threadInfoMarshaller) -fetchThreadInfoExpr :: Maybe WhereClause -> QueryExpr -fetchThreadInfoExpr wClause = - queryExpr selectClauseDefault selectedColumns (Just (fromTable wClause)) +fetchThreadInfoExpr :: Maybe WhereClause -> Maybe LimitExpr -> Maybe OffsetExpr -> QueryExpr +fetchThreadInfoExpr wClause lClause oClause = + queryExpr selectClauseDefault selectedColumns (Just (fromTable wClause lClause oClause)) where selectedColumns = selectColumns @@ -199,9 +199,11 @@ fetchThreadInfoExpr wClause = joinExpr leftJoinType voteCountTable (joinOnConstraint threadIDConstraint), joinExpr leftJoinType commentCountTable (joinOnConstraint commentConstraint) ] - fromTable wClause = + fromTable wClause lClause oClause = mkTableExpr (threadTableName `appendJoinFromItem` joinList) defaultClauses - { _whereClause = wClause + { _whereClause = wClause, + _limitExpr = lClause, + _offSetExpr = oClause } diff --git a/haskread-platform-be/src/Platform/User/Thread/Handler.hs b/haskread-platform-be/src/Platform/User/Thread/Handler.hs index a7958c3..8789a45 100644 --- a/haskread-platform-be/src/Platform/User/Thread/Handler.hs +++ b/haskread-platform-be/src/Platform/User/Thread/Handler.hs @@ -13,7 +13,7 @@ where import Control.Monad (void, when) import qualified Data.ByteString.Lazy.Char8 as BSL -import Data.Maybe (isNothing) +import Data.Maybe (isNothing,fromMaybe) import qualified Data.Text as T import Platform.Auth.Types import Platform.Common.AppM @@ -115,9 +115,13 @@ deleteThreadH (Authenticated UserInfo {..}) threadID = do Right _ -> return $ DeleteThreadResponse "Thread deleted successfully!" deleteThreadH _ _ = throw401Err "Please login first" -fetchAllThreadsH :: (MonadUnliftIO m) => AppM m FetchAllThreadsResponse -fetchAllThreadsH = do - threadInfoList <- queryWrapper fetchThreadInfoQ +fetchAllThreadsH :: + (MonadUnliftIO m) => + (Maybe Int) -> (Maybe Int) -> + AppM m FetchAllThreadsResponse +fetchAllThreadsH mLimit mOffSet = do + threadInfoList <- queryWrapper ( + fetchThreadInfoQ (fromMaybe 10 mLimit) (fromMaybe 0 mOffSet)) return $ FetchAllThreadsResponse (length threadInfoList) threadInfoList fetchThreadH :: (MonadUnliftIO m) => ThreadID -> AppM m ThreadInfo diff --git a/haskread-platform-ui/spago.yaml b/haskread-platform-ui/spago.yaml index e180330..c7c0640 100644 --- a/haskread-platform-ui/spago.yaml +++ b/haskread-platform-ui/spago.yaml @@ -27,4 +27,5 @@ workspace: registry: 57.1.0 extraPackages: bulma: - path: /home/user/Documents/github/purescript-bulma \ No newline at end of file + git: https://github.com/tusharad/purescript-bulma/ + ref: 8b1c922562cc158ae65b6ac376d83254bb460d89 \ No newline at end of file diff --git a/haskread-platform-ui/src/Common/Types.purs b/haskread-platform-ui/src/Common/Types.purs index 980fba4..0bbffd1 100644 --- a/haskread-platform-ui/src/Common/Types.purs +++ b/haskread-platform-ui/src/Common/Types.purs @@ -34,6 +34,7 @@ module Common.Types , updateThreadCodec , profileCodec , communitiesCodec + , Pagination(..) ) where @@ -50,7 +51,7 @@ import Data.Generic.Rep (class Generic) import Data.Maybe (Maybe) import Data.Newtype (class Newtype) import Data.Profunctor (wrapIso) -import Routing.Duplex (RouteDuplex', path, root, int, segment) +import Routing.Duplex (RouteDuplex', path, root, int, segment,optional, string) import Routing.Duplex.Generic (noArgs, sum) import Routing.Duplex.Generic as G import Routing.Duplex.Generic.Syntax ((/), (?)) @@ -104,7 +105,7 @@ type RequestOptions = } data MyRoute - = Home + = Home Pagination | Login | Register | OTP Int @@ -123,9 +124,17 @@ derive instance eqToken :: Eq Token instance showToken :: Show Token where show (Token _) = "TOKEN" +type Pagination = { + limit :: Maybe Int + , offset :: Maybe Int +} + myRoute :: RouteDuplex' MyRoute myRoute = root $ G.sum - { "Home": G.noArgs + { "Home": "Home" ? { + offset: optional <<< int + , limit: optional <<< int + } , "Login": path "login" G.noArgs , "Register": path "register" G.noArgs , "OTP": "otp" / (int segment) diff --git a/haskread-platform-ui/src/Common/Utils.purs b/haskread-platform-ui/src/Common/Utils.purs index 2991883..51ff742 100644 --- a/haskread-platform-ui/src/Common/Utils.purs +++ b/haskread-platform-ui/src/Common/Utils.purs @@ -347,4 +347,9 @@ getCommunities :: getCommunities = do let method = Get mJson <- mkRequest { endpoint: Community, method } - decode communitiesCodec mJson \ No newline at end of file + decode communitiesCodec mJson + +defaultPagination :: Pagination +defaultPagination = { limit : Just 10 + , offset : Just 0 + } \ No newline at end of file diff --git a/haskread-platform-ui/src/Component/Header.purs b/haskread-platform-ui/src/Component/Header.purs index 97e61fa..3cd3d4c 100644 --- a/haskread-platform-ui/src/Component/Header.purs +++ b/haskread-platform-ui/src/Component/Header.purs @@ -1,48 +1,54 @@ module Component.Header where import Prelude -import Data.Maybe (Maybe(..),fromMaybe,isJust) -import Common.Types (Profile,MyRoute(..)) -import Halogen.Store.Monad (class MonadStore) -import Capability.Resource (class Navigate,navigate) + +import Bulma.CSS.Spacing as B +import Bulma.Common as B +import Bulma.Components.Navbar as B +import Bulma.Form.General as B +import Bulma.Modifiers.Typography as B +import Bulma.Elements.Button as Button +import Bulma.Modifiers.Helpers as B +import Capability.Resource (class Navigate, navigate) +import Common.BulmaUtils as BU +import Common.Types (Profile, MyRoute(..)) +import Common.Utils (defaultPagination, whenElem) +import Data.Maybe (Maybe(..), fromMaybe, isJust) import Effect.Aff.Class (class MonadAff) -import Halogen.Store.Connect (connect) -import Halogen.Store.Select (selectEq) -import Store as Store import Halogen as H import Halogen.HTML as HH +import Halogen.HTML.Core as HC import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP +import Halogen.Store.Connect (connect) +import Halogen.Store.Monad (class MonadStore) +import Halogen.Store.Select (selectEq) +import Store as Store +import Undefined (undefined) import Web.Event.Event (Event) import Web.Event.Event as Event -import Common.Utils (whenElem) --- Bulma -import Bulma.Components.Navbar as B -import Bulma.Common as B -import Common.BulmaUtils as BU -import Bulma.Layout.Layout as B -import Bulma.CSS.Spacing as B - -type State = { - currentUser :: Maybe Profile - , searchError :: Maybe String - , searchInput :: String - } +type State = + { currentUser :: Maybe Profile + , searchError :: Maybe String + , searchInput :: String + } -data Action = Initialize - | GoToLogin - | GoToRegister - | HandleSearch Event - | GoToMyProfile - | SetSearchInput String +data Action + = Initialize + | GoToLogin + | GoToRegister + | HandleSearch Event + | GoToMyProfile + | SetSearchInput String + | GoToHome -component - :: forall query output m - .MonadAff m - => Navigate m - => MonadStore Store.Action Store.Store m - => H.Component query Unit output m +component + :: forall query output m + . MonadAff m + => Navigate m + => MonadStore Store.Action Store.Store m + => H.Component query Unit output m component = connect (selectEq _.currentUser) $ H.mkComponent { initialState , render @@ -52,66 +58,107 @@ component = connect (selectEq _.currentUser) $ H.mkComponent } } where - initialState { context : currentUser } = { - currentUser - , searchError : Nothing - , searchInput : "" - } + initialState { context: currentUser } = + { currentUser + , searchError: Nothing + , searchInput: "" + } - handleAction :: forall slots. Action -> H.HalogenM State Action slots output m Unit - handleAction = - case _ of - Initialize -> do - -- nothing here right now! - pure unit - GoToLogin -> navigate Login - GoToRegister -> navigate Register - GoToMyProfile -> navigate Home -- TODO: Add myProfile page and add here - SetSearchInput searchInput -> - H.modify_ _ { searchInput = searchInput } - HandleSearch event -> do - H.liftEffect $ Event.preventDefault event - { searchInput } <- H.get - -- TODO: Add Search page and API - navigate Home + handleAction :: forall slots. Action -> H.HalogenM State Action slots output m Unit + handleAction = + case _ of + Initialize -> do + -- nothing here right now! + pure unit + GoToLogin -> navigate Login + GoToRegister -> navigate Register + GoToMyProfile -> navigate $ Home defaultPagination -- TODO: Add myProfile page and add here + SetSearchInput searchInput -> + H.modify_ _ { searchInput = searchInput } + GoToHome -> navigate $ Home defaultPagination + HandleSearch event -> do + H.liftEffect $ Event.preventDefault event + -- _ <- H.get + -- TODO: Add Search page and API + navigate $ Home defaultPagination - render :: State -> H.ComponentHTML Action () m - render { currentUser,searchError,searchInput } = do - HH.nav [ - BU.classNames [ - B.navbar, - B.isFixedTop, - B.px6 - ] - ] [ - logoAndTitle, - searchBar searchError searchInput, - case currentUser of - Nothing -> loginRegisterButtons - Just currUser -> profileButton currUser - ] + render :: State -> H.ComponentHTML Action () m + render { currentUser, searchError, searchInput } = do + HH.nav + [ BU.classNames + [ B.navbar + , B.isFixedTop + , B.px6 + , B.hasShadow + ] + ] + [ logoAndTitle + , searchBar searchError searchInput + , loginSignupButtons currentUser + -- case currentUser of + -- Nothing -> loginRegisterButtons + -- Just currUser -> profileButton currUser + ] + + loginSignupButtons currUser = + HH.div [ HP.id "navbarBasicExample", BU.className B.navbarMenu ] + [ HH.div [ BU.className B.navbarEnd ] + [ HH.div [ BU.className B.navbarItem ] + [ HH.div [ BU.className Button.buttons ] + [ HH.a + [ HE.onClick \_ -> GoToLogin + , BU.classNames [ Button.button, B.isPrimary ] + ] + [ HH.text "Login" ] + ] + ] + ] + ] - logoAndTitle = HH.div_ [HH.h3_ [ HH.text "HaskRead" ]] + navbarBurger = HH.a + [ HP.attr (HC.AttrName "area-label") "Close" + , BU.className B.navbarBurger + , HP.attr (HC.AttrName "area-label") "menu" + , HP.attr (HC.AttrName "area-expanded") "false" + , HP.attr (HC.AttrName "data-target") "navbarBasicExample" + ] + [ HH.span [ HP.attr (HC.AttrName "area-hidden") "true" ] [] + , HH.span [ HP.attr (HC.AttrName "area-hidden") "true" ] [] + , HH.span [ HP.attr (HC.AttrName "area-hidden") "true" ] [] + , HH.span [ HP.attr (HC.AttrName "area-hidden") "true" ] [] + ] - searchBar searchError searchInput = HH.div_ [ - HH.form + logoAndTitle = HH.div [ BU.className B.navbarBrand ] + [ HH.a [ HE.onClick \_ -> GoToHome, BU.className B.navbarItem ] + [ HH.p [ BU.classNames [ B.hasWeight B.Bold ] ] [ HH.text "HaskRead" ] ] + , navbarBurger + ] + + searchBar searchError searchInput = HH.div + [ BU.className B.navbarItem ] + [ HH.div [ BU.classNames [ B.field, B.hasAddons ] ] + [ HH.form [ HE.onSubmit HandleSearch ] [ whenElem (isJust searchError) - (\_ -> HH.div_ [ HH.text (fromMaybe "" searchError) ]) - , HH.input [ - HP.placeholder "Search threads, community, users etc." - , HP.type_ HP.InputText - , HE.onValueInput SetSearchInput - , HP.value searchInput ] - , HH.button [ HP.type_ HP.ButtonSubmit ] [ HH.text "Search" ] + (\_ -> HH.div_ [ HH.text (fromMaybe "" searchError) ]) + , HH.div [ BU.className B.control ] + [ HH.input + [ HP.placeholder "Search threads, community, users etc." + , HP.type_ HP.InputText + , HE.onValueInput SetSearchInput + , HP.value searchInput + ] + ] + , HH.div [ BU.className B.control ] [ HH.button [ HP.type_ HP.ButtonSubmit ] [ HH.text "Search" ] ] ] + ] ] - loginRegisterButtons = HH.div_ [ - HH.button [ HE.onClick \_ -> GoToLogin ] [HH.text "Login"] - , HH.button [ HE.onClick \_ -> GoToRegister ] [HH.text "Register"] + loginRegisterButtons = HH.div_ + [ HH.button [ HE.onClick \_ -> GoToLogin ] [ HH.text "Login" ] + , HH.button [ HE.onClick \_ -> GoToRegister ] [ HH.text "Register" ] ] - profileButton currUser = HH.div_ [ - HH.button [ HE.onClick \_ -> GoToMyProfile ] [HH.text currUser.userName] + profileButton currUser = HH.div_ + [ HH.button [ HE.onClick \_ -> GoToMyProfile ] [ HH.text currUser.userName ] ] diff --git a/haskread-platform-ui/src/Component/Router.purs b/haskread-platform-ui/src/Component/Router.purs index ed9c8c2..a8111de 100644 --- a/haskread-platform-ui/src/Component/Router.purs +++ b/haskread-platform-ui/src/Component/Router.purs @@ -2,8 +2,13 @@ module Component.Router where import Prelude +import Bulma.Common as B +import Bulma.Components.Navbar as B +import Bulma.Layout.Layout as B import Capability.Resource (class ManageComments, class ManageCommunity, class ManageThreads, class ManageUser, class Navigate, navigate) -import Common.Types (myRoute, MyRoute(..), Profile) +import Common.BulmaUtils as BU +import Common.Types (myRoute, MyRoute(..), Profile, Pagination) +import Common.Utils (defaultPagination) import Data.Either (Either(..)) import Data.Foldable (elem) import Data.Maybe (Maybe(..), isNothing) @@ -28,11 +33,6 @@ import Routing.Duplex as RD import Routing.Hash (getHash) import Store as Store import Type.Proxy (Proxy(..)) --- Bulma -import Bulma.Components.Navbar as B -import Bulma.Common as B -import Common.BulmaUtils as BU -import Bulma.Layout.Layout as B data Action = Initialize @@ -90,7 +90,7 @@ component = connect (selectEq _.currentUser) $ H.mkComponent Initialize -> do url <- liftEffect getHash case RD.parse myRoute url of - Left e -> (log $ "err" <> show e) *> navigate Home + Left e -> (log $ "err" <> show e) *> navigate (Home defaultPagination) Right r -> navigate r Receive { context: currentUser } -> do H.modify_ _ { currentUser = currentUser } @@ -108,7 +108,7 @@ component = connect (selectEq _.currentUser) $ H.mkComponent HH.div [ BU.classNames [B.container,B.hasNavbarFixedTop] ] [ case route of Just r -> case r of - Home -> HH.slot_ (Proxy :: _ "home") unit Home.component unit + Home p -> HH.slot_ (Proxy :: _ "home") unit Home.component { pagination_ : p} Login -> HH.slot_ (Proxy :: _ "login") unit Login.component { redirect: true } Register -> HH.slot_ (Proxy :: _ "register") unit Register.component { redirect: true } diff --git a/haskread-platform-ui/src/Page/ChangePassword.purs b/haskread-platform-ui/src/Page/ChangePassword.purs index 4354472..0fad91b 100644 --- a/haskread-platform-ui/src/Page/ChangePassword.purs +++ b/haskread-platform-ui/src/Page/ChangePassword.purs @@ -1,19 +1,20 @@ module Page.ChangePassword where import Prelude -import Halogen as H -import Halogen.HTML as HH -import Effect.Aff.Class (class MonadAff) -import Data.Maybe (Maybe(..)) + import Capability.Resource (class ManageUser, changePassword, class Navigate, navigate) import Common.Types (MyRoute(..)) -import Common.Utils (whenElem) +import Common.Utils (defaultPagination, whenElem) +import Data.Either (Either(..), isLeft, fromLeft) +import Data.Maybe (Maybe(..)) +import Effect.Aff.Class (class MonadAff) +import Effect.Class.Console (log) +import Halogen as H +import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP -import Effect.Class.Console (log) -import Data.Either (Either(..), isLeft, fromLeft) -import Web.Event.Event as Event import Web.Event.Event (Event) +import Web.Event.Event as Event type State = { currentPassword :: String @@ -87,7 +88,7 @@ component = H.mkComponent changePassword changePasswordFields case mRes of Nothing -> pure unit - Just _ -> navigate Home + Just _ -> navigate (Home defaultPagination) render :: State -> H.ComponentHTML Action _ m render st = diff --git a/haskread-platform-ui/src/Page/CreateThread.purs b/haskread-platform-ui/src/Page/CreateThread.purs index 1659664..e02d5e2 100644 --- a/haskread-platform-ui/src/Page/CreateThread.purs +++ b/haskread-platform-ui/src/Page/CreateThread.purs @@ -1,21 +1,22 @@ module Page.CreateThread where import Prelude -import Halogen as H -import Halogen.HTML as HH -import Effect.Aff.Class (class MonadAff) + import Capability.Resource (class ManageThreads, createThread, class Navigate, navigate) import Common.Types (MyRoute(..)) -import Common.Utils (whenElem) +import Common.Utils (defaultPagination, whenElem) +import Data.Either (Either(..), isLeft, fromLeft) +import Data.Int (fromString) +import Data.Maybe (Maybe(..), isNothing, fromMaybe) +import Data.String (length) +import Effect.Aff.Class (class MonadAff) +import Effect.Class.Console (log) +import Halogen as H +import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP -import Effect.Class.Console (log) -import Data.Either (Either(..), isLeft, fromLeft) -import Web.Event.Event as Event import Web.Event.Event (Event) -import Data.String (length) -import Data.Maybe (Maybe(..), isNothing, fromMaybe) -import Data.Int (fromString) +import Web.Event.Event as Event type State = { threadTitle :: String @@ -89,7 +90,7 @@ component = H.mkComponent createThread createThreadFields case mRes of Nothing -> pure unit - Just _ -> navigate Home + Just _ -> navigate (Home defaultPagination) render :: State -> H.ComponentHTML Action _ m render st = diff --git a/haskread-platform-ui/src/Page/DeleteUser.purs b/haskread-platform-ui/src/Page/DeleteUser.purs index 55b4762..beb4850 100644 --- a/haskread-platform-ui/src/Page/DeleteUser.purs +++ b/haskread-platform-ui/src/Page/DeleteUser.purs @@ -1,19 +1,20 @@ module Page.DeleteUser where import Prelude -import Halogen as H -import Halogen.HTML as HH -import Effect.Aff.Class (class MonadAff) + import Capability.Resource (class ManageUser, deleteUser, class Navigate, navigate) import Common.Types (MyRoute(..)) -import Common.Utils (whenElem) +import Common.Utils (defaultPagination, whenElem) +import Data.Either (Either(..), isLeft, fromLeft) +import Data.Maybe (Maybe(..)) +import Effect.Aff.Class (class MonadAff) +import Effect.Class.Console (log) +import Halogen as H +import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP -import Effect.Class.Console (log) -import Data.Either (Either(..), isLeft, fromLeft) -import Web.Event.Event as Event import Web.Event.Event (Event) -import Data.Maybe (Maybe(..)) +import Web.Event.Event as Event type State = { password :: String @@ -78,7 +79,7 @@ component = H.mkComponent deleteUser deleteUserFields case mRes of Nothing -> pure unit - Just _ -> navigate Home + Just _ -> navigate (Home defaultPagination) render :: State -> H.ComponentHTML Action _ m render st = diff --git a/haskread-platform-ui/src/Page/Home.purs b/haskread-platform-ui/src/Page/Home.purs index 35c7d7b..9cfb948 100644 --- a/haskread-platform-ui/src/Page/Home.purs +++ b/haskread-platform-ui/src/Page/Home.purs @@ -4,7 +4,8 @@ import Prelude import Bulma.Elements.Button as B import Capability.Resource (class ManageThreads, getThreads, class Navigate, navigate, class ManageCommunity) -import Common.Types (PaginatedArray, Thread, Profile, MyRoute(..), ThreadInfo) +import Common.BulmaUtils as BU +import Common.Types (MyRoute(..), PaginatedArray, Profile, Thread, ThreadInfo, Pagination) import Common.Utils (stringToDate, toThreadInfo, safeHref) import Component.CommunityList as CommunityList import Component.Footer as Footer @@ -24,11 +25,15 @@ import Halogen.Store.Select (selectEq) import Network.RemoteData (RemoteData(..), fromMaybe) import Store as Store import Type.Proxy (Proxy(..)) -import Common.BulmaUtils as BU + +type Input = { + pagination_ :: Pagination +} type State = { threads :: RemoteData String (PaginatedArray ThreadInfo) , currentUser :: Maybe Profile + , pagination_ :: Pagination } data Action = Initialize | LoadThreads | GoToLogin @@ -43,7 +48,7 @@ component => MonadStore Store.Action Store.Store m => ManageThreads m => ManageCommunity m - => H.Component query Unit output m + => H.Component query Input output m component = connect (selectEq _.currentUser) $ H.mkComponent { initialState , render @@ -53,7 +58,7 @@ component = connect (selectEq _.currentUser) $ H.mkComponent } } where - initialState { context: currentUser } = { threads: NotAsked, currentUser } + initialState { context: currentUser,input: { pagination_ } } = { threads: NotAsked, currentUser,pagination_ } render :: State -> H.ComponentHTML Action ChildSlots m render state = HH.div_ diff --git a/haskread-platform-ui/src/Page/Login.purs b/haskread-platform-ui/src/Page/Login.purs index 98702e0..731f685 100644 --- a/haskread-platform-ui/src/Page/Login.purs +++ b/haskread-platform-ui/src/Page/Login.purs @@ -1,19 +1,20 @@ module Page.Login where import Prelude -import Halogen as H -import Halogen.HTML as HH -import Effect.Aff.Class (class MonadAff) -import Data.Maybe (Maybe(..)) + import Capability.Resource (class ManageUser, loginUser, class Navigate, navigate) import Common.Types (MyRoute(..)) -import Common.Utils (safeHref, whenElem) +import Common.Utils (defaultPagination, safeHref, whenElem) +import Data.Either (Either(..), isLeft) +import Data.Maybe (Maybe(..)) +import Effect.Aff.Class (class MonadAff) +import Effect.Class.Console (log) +import Halogen as H +import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP -import Web.Event.Event as Event import Web.Event.Event (Event) -import Data.Either (Either(..), isLeft) -import Effect.Class.Console (log) +import Web.Event.Event as Event type Input = { redirect :: Boolean } @@ -74,7 +75,7 @@ component = H.mkComponent loginUser loginFields case mRes of Nothing -> pure unit - Just _ -> navigate Home + Just _ -> navigate (Home defaultPagination) render :: State -> H.ComponentHTML Action () m render st = diff --git a/haskread-platform-ui/src/Page/OTP.purs b/haskread-platform-ui/src/Page/OTP.purs index 950d0f4..2a7d60a 100644 --- a/haskread-platform-ui/src/Page/OTP.purs +++ b/haskread-platform-ui/src/Page/OTP.purs @@ -1,21 +1,22 @@ module Page.OTP where import Prelude -import Halogen as H -import Halogen.HTML as HH -import Effect.Aff.Class (class MonadAff) -import Data.Maybe (Maybe(..), isNothing, fromMaybe) + import Capability.Resource (class ManageUser, verifyOtp, class Navigate, navigate) import Common.Types (MyRoute(..)) -import Common.Utils (safeHref, whenElem) +import Common.Utils (defaultPagination, safeHref, whenElem) +import Data.Either (Either(..), isLeft, hush) +import Data.Int (fromString) +import Data.Maybe (Maybe(..), isNothing, fromMaybe) +import Data.String (length) +import Effect.Aff.Class (class MonadAff) +import Effect.Class.Console (log) +import Halogen as H +import Halogen.HTML as HH import Halogen.HTML.Events as HE import Halogen.HTML.Properties as HP -import Web.Event.Event as Event import Web.Event.Event (Event) -import Data.Either (Either(..), isLeft, hush) -import Effect.Class.Console (log) -import Data.String (length) -import Data.Int (fromString) +import Web.Event.Event as Event type Input = { userID :: Int } @@ -75,7 +76,7 @@ component = H.mkComponent pure $ hush res case mRes of Nothing -> pure unit - Just _ -> navigate Home + Just _ -> navigate (Home defaultPagination) render :: State -> H.ComponentHTML Action () m render st = diff --git a/haskread-platform-ui/src/Page/UpdateThread.purs b/haskread-platform-ui/src/Page/UpdateThread.purs index 76843b1..b8f910c 100644 --- a/haskread-platform-ui/src/Page/UpdateThread.purs +++ b/haskread-platform-ui/src/Page/UpdateThread.purs @@ -1,27 +1,28 @@ module Page.UpdateThread where import Prelude -import Halogen as H -import Halogen.HTML as HH -import Effect.Aff.Class (class MonadAff) -import Data.Maybe (Maybe(..),isNothing) + import Capability.Resource (class ManageThreads, getThread, updateThread, class Navigate, navigate) import Common.Types (MyRoute(..), Thread, Profile) -import Network.RemoteData (RemoteData(..), fromMaybe) -import Common.Utils (whenElem) -import Halogen.HTML.Events as HE -import Halogen.HTML.Properties as HP -import Effect.Class.Console (log) +import Common.Utils (defaultPagination, whenElem) import Data.Either (Either(..), isLeft, fromLeft) -import Web.Event.Event as Event -import Web.Event.Event (Event) -import Data.String (length) -import Data.Maybe as Maybe import Data.Int (fromString) +import Data.Maybe (Maybe(..), isNothing) +import Data.Maybe as Maybe +import Data.String (length) +import Effect.Aff.Class (class MonadAff) +import Effect.Class.Console (log) +import Halogen as H +import Halogen.HTML as HH +import Halogen.HTML.Events as HE +import Halogen.HTML.Properties as HP import Halogen.Store.Connect (connect) +import Halogen.Store.Monad (class MonadStore) import Halogen.Store.Select (selectEq) +import Network.RemoteData (RemoteData(..), fromMaybe) import Store as Store -import Halogen.Store.Monad (class MonadStore) +import Web.Event.Event (Event) +import Web.Event.Event as Event type Input = { threadID :: Int } @@ -91,10 +92,10 @@ component = connect (selectEq _.currentUser) $ H.mkComponent -- check if user is owner of this thread or not. mCurrentUser <- H.gets _.currentUser case mCurrentUser of - Nothing -> navigate Home + Nothing -> navigate (Home defaultPagination) Just currUser -> do when (currUser.userID /= threadInfo.userIDForThreadInfo) - (navigate Home) + (navigate (Home defaultPagination)) H.modify_ _ { threadTitle = threadInfo.title , threadDescription = Maybe.fromMaybe "" threadInfo.description @@ -130,7 +131,7 @@ component = connect (selectEq _.currentUser) $ H.mkComponent updateThread updateThreadFields case mRes of Nothing -> pure unit - Just _ -> navigate Home + Just _ -> navigate (Home defaultPagination) render :: State -> H.ComponentHTML Action _ m render st =