From 97922340d9b8799c3da84ea495281ea10f217d4e Mon Sep 17 00:00:00 2001
From: eikek <eike.kettner@posteo.de>
Date: Sun, 3 Oct 2021 01:32:56 +0200
Subject: [PATCH] Share page skeleton

---
 modules/webapp/src/main/elm/App/Data.elm      |  8 ++++
 modules/webapp/src/main/elm/App/Update.elm    | 25 +++++++++++
 modules/webapp/src/main/elm/App/View2.elm     | 41 +++++++++++++++----
 modules/webapp/src/main/elm/Data/Flags.elm    | 20 +++++++++
 modules/webapp/src/main/elm/Messages.elm      |  4 ++
 .../src/main/elm/Messages/Page/Share.elm      | 22 ++++++++++
 modules/webapp/src/main/elm/Page.elm          | 25 +++++++++++
 .../webapp/src/main/elm/Page/Share/Data.elm   | 32 +++++++++++++++
 .../webapp/src/main/elm/Page/Share/Update.elm | 23 +++++++++++
 .../webapp/src/main/elm/Page/Share/View.elm   | 38 +++++++++++++++++
 10 files changed, 231 insertions(+), 7 deletions(-)
 create mode 100644 modules/webapp/src/main/elm/Messages/Page/Share.elm
 create mode 100644 modules/webapp/src/main/elm/Page/Share/Data.elm
 create mode 100644 modules/webapp/src/main/elm/Page/Share/Update.elm
 create mode 100644 modules/webapp/src/main/elm/Page/Share/View.elm

diff --git a/modules/webapp/src/main/elm/App/Data.elm b/modules/webapp/src/main/elm/App/Data.elm
index 055eb456..36713a54 100644
--- a/modules/webapp/src/main/elm/App/Data.elm
+++ b/modules/webapp/src/main/elm/App/Data.elm
@@ -32,6 +32,7 @@ import Page.ManageData.Data
 import Page.NewInvite.Data
 import Page.Queue.Data
 import Page.Register.Data
+import Page.Share.Data
 import Page.Upload.Data
 import Page.UserSettings.Data
 import Url exposing (Url)
@@ -52,6 +53,7 @@ type alias Model =
     , uploadModel : Page.Upload.Data.Model
     , newInviteModel : Page.NewInvite.Data.Model
     , itemDetailModel : Page.ItemDetail.Data.Model
+    , shareModel : Page.Share.Data.Model
     , navMenuOpen : Bool
     , userMenuOpen : Bool
     , subs : Sub Msg
@@ -85,6 +87,9 @@ init key url flags_ settings =
         ( loginm, loginc ) =
             Page.Login.Data.init flags (Page.loginPageReferrer page)
 
+        ( shm, shc ) =
+            Page.Share.Data.init (Page.shareId page) flags
+
         homeViewMode =
             if settings.searchMenuVisible then
                 Page.Home.Data.SearchView
@@ -106,6 +111,7 @@ init key url flags_ settings =
       , uploadModel = Page.Upload.Data.emptyModel
       , newInviteModel = Page.NewInvite.Data.emptyModel
       , itemDetailModel = Page.ItemDetail.Data.emptyModel
+      , shareModel = shm
       , navMenuOpen = False
       , userMenuOpen = False
       , subs = Sub.none
@@ -120,6 +126,7 @@ init key url flags_ settings =
         , Cmd.map ManageDataMsg mdc
         , Cmd.map CollSettingsMsg csc
         , Cmd.map LoginMsg loginc
+        , Cmd.map ShareMsg shc
         ]
     )
 
@@ -162,6 +169,7 @@ type Msg
     | UploadMsg Page.Upload.Data.Msg
     | NewInviteMsg Page.NewInvite.Data.Msg
     | ItemDetailMsg Page.ItemDetail.Data.Msg
+    | ShareMsg Page.Share.Data.Msg
     | Logout
     | LogoutResp (Result Http.Error ())
     | SessionCheckResp (Result Http.Error AuthResult)
diff --git a/modules/webapp/src/main/elm/App/Update.elm b/modules/webapp/src/main/elm/App/Update.elm
index bd760a70..5408c581 100644
--- a/modules/webapp/src/main/elm/App/Update.elm
+++ b/modules/webapp/src/main/elm/App/Update.elm
@@ -34,6 +34,8 @@ import Page.Queue.Data
 import Page.Queue.Update
 import Page.Register.Data
 import Page.Register.Update
+import Page.Share.Data
+import Page.Share.Update
 import Page.Upload.Data
 import Page.Upload.Update
 import Page.UserSettings.Data
@@ -114,6 +116,9 @@ updateWithSub msg model =
         HomeMsg lm ->
             updateHome lm model
 
+        ShareMsg lm ->
+            updateShare lm model
+
         LoginMsg lm ->
             updateLogin lm model
 
@@ -313,6 +318,23 @@ applyClientSettings model settings =
         { model | uiSettings = settings }
 
 
+updateShare : Page.Share.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
+updateShare lmsg model =
+    case Page.shareId model.page of
+        Just id ->
+            let
+                result =
+                    Page.Share.Update.update model.flags id lmsg model.shareModel
+            in
+            ( { model | shareModel = result.model }
+            , Cmd.map ShareMsg result.cmd
+            , Sub.map ShareMsg result.sub
+            )
+
+        Nothing ->
+            ( model, Cmd.none, Sub.none )
+
+
 updateItemDetail : Page.ItemDetail.Data.Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
 updateItemDetail lmsg model =
     let
@@ -568,3 +590,6 @@ initPage model_ page =
                 , updateQueue Page.Queue.Data.StopRefresh
                 ]
                 model
+
+        SharePage _ ->
+            ( model, Cmd.none, Sub.none )
diff --git a/modules/webapp/src/main/elm/App/View2.elm b/modules/webapp/src/main/elm/App/View2.elm
index d2b277b7..d80be6e3 100644
--- a/modules/webapp/src/main/elm/App/View2.elm
+++ b/modules/webapp/src/main/elm/App/View2.elm
@@ -27,6 +27,7 @@ import Page.ManageData.View2 as ManageData
 import Page.NewInvite.View2 as NewInvite
 import Page.Queue.View2 as Queue
 import Page.Register.View2 as Register
+import Page.Share.View as Share
 import Page.Upload.View2 as Upload
 import Page.UserSettings.View2 as UserSettings
 import Styles as S
@@ -41,13 +42,9 @@ view model =
 
 topNavbar : Model -> Html Msg
 topNavbar model =
-    case model.flags.account of
+    case Data.Flags.getAccount model.flags of
         Just acc ->
-            if acc.success then
-                topNavUser acc model
-
-            else
-                topNavAnon model
+            topNavUser acc model
 
         Nothing ->
             topNavAnon model
@@ -86,7 +83,16 @@ topNavAnon model =
         [ id "top-nav"
         , class styleTopNav
         ]
-        [ headerNavItem model
+        [ B.genericButton
+            { label = ""
+            , icon = "fa fa-bars"
+            , handler = onClick ToggleSidebar
+            , disabled = not (Page.hasSidebar model.page)
+            , attrs = [ href "#" ]
+            , baseStyle = "font-bold inline-flex items-center px-4 py-2"
+            , activeStyle = "hover:bg-blue-200 dark:hover:bg-bluegray-800 w-12"
+            }
+        , headerNavItem model
         , div [ class "flex flex-grow justify-end" ]
             [ langMenu model
             , a
@@ -157,6 +163,9 @@ mainContent model =
 
             ItemDetailPage id ->
                 viewItemDetail texts id model
+
+            SharePage id ->
+                viewShare texts id model
         )
 
 
@@ -411,6 +420,24 @@ dropdownMenu =
     " absolute right-0 bg-white dark:bg-bluegray-800 border dark:border-bluegray-700 dark:text-bluegray-300 shadow-lg opacity-1 transition duration-200 min-w-max "
 
 
+viewShare : Messages -> String -> Model -> List (Html Msg)
+viewShare texts shareId model =
+    [ Html.map ShareMsg
+        (Share.viewSidebar texts.share
+            model.sidebarVisible
+            model.flags
+            model.uiSettings
+            model.shareModel
+        )
+    , Html.map ShareMsg
+        (Share.viewContent texts.share
+            model.flags
+            model.uiSettings
+            model.shareModel
+        )
+    ]
+
+
 viewHome : Messages -> Model -> List (Html Msg)
 viewHome texts model =
     [ Html.map HomeMsg
diff --git a/modules/webapp/src/main/elm/Data/Flags.elm b/modules/webapp/src/main/elm/Data/Flags.elm
index ea23b52f..e605bd50 100644
--- a/modules/webapp/src/main/elm/Data/Flags.elm
+++ b/modules/webapp/src/main/elm/Data/Flags.elm
@@ -9,7 +9,9 @@ module Data.Flags exposing
     ( Config
     , Flags
     , accountString
+    , getAccount
     , getToken
+    , isAuthenticated
     , withAccount
     , withoutAccount
     )
@@ -43,6 +45,24 @@ type alias Flags =
     }
 
 
+isAuthenticated : Flags -> Bool
+isAuthenticated flags =
+    getAccount flags /= Nothing
+
+
+getAccount : Flags -> Maybe AuthResult
+getAccount flags =
+    Maybe.andThen
+        (\ar ->
+            if ar.success then
+                Just ar
+
+            else
+                Nothing
+        )
+        flags.account
+
+
 getToken : Flags -> Maybe String
 getToken flags =
     flags.account
diff --git a/modules/webapp/src/main/elm/Messages.elm b/modules/webapp/src/main/elm/Messages.elm
index a0671289..9809f1b4 100644
--- a/modules/webapp/src/main/elm/Messages.elm
+++ b/modules/webapp/src/main/elm/Messages.elm
@@ -21,6 +21,7 @@ import Messages.Page.ManageData
 import Messages.Page.NewInvite
 import Messages.Page.Queue
 import Messages.Page.Register
+import Messages.Page.Share
 import Messages.Page.Upload
 import Messages.Page.UserSettings
 import Messages.UiLanguage exposing (UiLanguage(..))
@@ -44,6 +45,7 @@ type alias Messages =
     , userSettings : Messages.Page.UserSettings.Texts
     , manageData : Messages.Page.ManageData.Texts
     , home : Messages.Page.Home.Texts
+    , share : Messages.Page.Share.Texts
     }
 
 
@@ -109,6 +111,7 @@ gb =
     , userSettings = Messages.Page.UserSettings.gb
     , manageData = Messages.Page.ManageData.gb
     , home = Messages.Page.Home.gb
+    , share = Messages.Page.Share.gb
     }
 
 
@@ -129,4 +132,5 @@ de =
     , userSettings = Messages.Page.UserSettings.de
     , manageData = Messages.Page.ManageData.de
     , home = Messages.Page.Home.de
+    , share = Messages.Page.Share.de
     }
diff --git a/modules/webapp/src/main/elm/Messages/Page/Share.elm b/modules/webapp/src/main/elm/Messages/Page/Share.elm
new file mode 100644
index 00000000..b6044543
--- /dev/null
+++ b/modules/webapp/src/main/elm/Messages/Page/Share.elm
@@ -0,0 +1,22 @@
+{-
+   Copyright 2020 Eike K. & Contributors
+
+   SPDX-License-Identifier: AGPL-3.0-or-later
+-}
+
+
+module Messages.Page.Share exposing (..)
+
+
+type alias Texts =
+    {}
+
+
+gb : Texts
+gb =
+    {}
+
+
+de : Texts
+de =
+    {}
diff --git a/modules/webapp/src/main/elm/Page.elm b/modules/webapp/src/main/elm/Page.elm
index 92ff29d9..667fe7aa 100644
--- a/modules/webapp/src/main/elm/Page.elm
+++ b/modules/webapp/src/main/elm/Page.elm
@@ -21,6 +21,7 @@ module Page exposing
     , pageName
     , pageToString
     , set
+    , shareId
     , uploadId
     )
 
@@ -59,6 +60,7 @@ type Page
     | UploadPage (Maybe String)
     | NewInvitePage
     | ItemDetailPage String
+    | SharePage String
 
 
 isSecured : Page -> Bool
@@ -94,6 +96,9 @@ isSecured page =
         ItemDetailPage _ ->
             True
 
+        SharePage _ ->
+            False
+
 
 {-| Currently, all secured pages have a sidebar, except UploadPage.
 -}
@@ -103,6 +108,9 @@ hasSidebar page =
         UploadPage _ ->
             False
 
+        SharePage _ ->
+            True
+
         _ ->
             isSecured page
 
@@ -160,6 +168,9 @@ pageName page =
         ItemDetailPage _ ->
             "Item"
 
+        SharePage _ ->
+            "Share"
+
 
 loginPageReferrer : Page -> LoginData
 loginPageReferrer page =
@@ -171,6 +182,16 @@ loginPageReferrer page =
             emptyLoginData
 
 
+shareId : Page -> Maybe String
+shareId page =
+    case page of
+        SharePage id ->
+            Just id
+
+        _ ->
+            Nothing
+
+
 uploadId : Page -> Maybe String
 uploadId page =
     case page of
@@ -224,6 +245,9 @@ pageToString page =
         ItemDetailPage id ->
             "/app/item/" ++ id
 
+        SharePage id ->
+            "/app/share/" ++ id
+
 
 pageFromString : String -> Maybe Page
 pageFromString str =
@@ -280,6 +304,7 @@ parser =
         , Parser.map (UploadPage Nothing) (s pathPrefix </> s "upload")
         , Parser.map NewInvitePage (s pathPrefix </> s "newinvite")
         , Parser.map ItemDetailPage (s pathPrefix </> s "item" </> string)
+        , Parser.map SharePage (s pathPrefix </> s "share" </> string)
         ]
 
 
diff --git a/modules/webapp/src/main/elm/Page/Share/Data.elm b/modules/webapp/src/main/elm/Page/Share/Data.elm
new file mode 100644
index 00000000..a0aa5f76
--- /dev/null
+++ b/modules/webapp/src/main/elm/Page/Share/Data.elm
@@ -0,0 +1,32 @@
+{-
+   Copyright 2020 Eike K. & Contributors
+
+   SPDX-License-Identifier: AGPL-3.0-or-later
+-}
+
+
+module Page.Share.Data exposing (Model, Msg, init)
+
+import Data.Flags exposing (Flags)
+
+
+type alias Model =
+    {}
+
+
+init : Maybe String -> Flags -> ( Model, Cmd Msg )
+init shareId flags =
+    case shareId of
+        Just id ->
+            let
+                _ =
+                    Debug.log "share" id
+            in
+            ( {}, Cmd.none )
+
+        Nothing ->
+            ( {}, Cmd.none )
+
+
+type Msg
+    = Msg
diff --git a/modules/webapp/src/main/elm/Page/Share/Update.elm b/modules/webapp/src/main/elm/Page/Share/Update.elm
new file mode 100644
index 00000000..0f1dadbb
--- /dev/null
+++ b/modules/webapp/src/main/elm/Page/Share/Update.elm
@@ -0,0 +1,23 @@
+{-
+   Copyright 2020 Eike K. & Contributors
+
+   SPDX-License-Identifier: AGPL-3.0-or-later
+-}
+
+
+module Page.Share.Update exposing (UpdateResult, update)
+
+import Data.Flags exposing (Flags)
+import Page.Share.Data exposing (..)
+
+
+type alias UpdateResult =
+    { model : Model
+    , cmd : Cmd Msg
+    , sub : Sub Msg
+    }
+
+
+update : Flags -> String -> Msg -> Model -> UpdateResult
+update flags shareId msg model =
+    UpdateResult model Cmd.none Sub.none
diff --git a/modules/webapp/src/main/elm/Page/Share/View.elm b/modules/webapp/src/main/elm/Page/Share/View.elm
new file mode 100644
index 00000000..0d5cf016
--- /dev/null
+++ b/modules/webapp/src/main/elm/Page/Share/View.elm
@@ -0,0 +1,38 @@
+{-
+   Copyright 2020 Eike K. & Contributors
+
+   SPDX-License-Identifier: AGPL-3.0-or-later
+-}
+
+
+module Page.Share.View exposing (viewContent, viewSidebar)
+
+import Data.Flags exposing (Flags)
+import Data.UiSettings exposing (UiSettings)
+import Html exposing (..)
+import Html.Attributes exposing (..)
+import Messages.Page.Share exposing (Texts)
+import Page.Share.Data exposing (..)
+import Styles as S
+
+
+viewSidebar : Texts -> Bool -> Flags -> UiSettings -> Model -> Html Msg
+viewSidebar _ visible _ _ _ =
+    div
+        [ id "sidebar"
+        , classList [ ( "hidden", not visible ) ]
+        ]
+        [ text "sidebar" ]
+
+
+viewContent : Texts -> Flags -> UiSettings -> Model -> Html Msg
+viewContent texts flags _ model =
+    div
+        [ id "content"
+        , class "h-full flex flex-col"
+        , class S.content
+        ]
+        [ h1 [ class S.header1 ]
+            [ text "Share Page!"
+            ]
+        ]