feat: removed boilerplate

This commit is contained in:
Nick 2024-12-07 15:43:26 -06:00
parent cb51b17c08
commit a462c01f88
14 changed files with 277 additions and 378 deletions

30
frontend/src/Auth.elm Executable file
View file

@ -0,0 +1,30 @@
module Auth exposing (User, onPageLoad, viewLoadingPage)
import Auth.Action
import Dict
import Route exposing (Route)
import Route.Path
import Shared
import View exposing (View)
type alias User =
{}
{-| Called before an auth-only page is loaded.
-}
onPageLoad : Shared.Model -> Route () -> Auth.Action.Action User
onPageLoad shared route =
Auth.Action.pushRoute
{ path = Route.Path.NotFound_
, query = Dict.empty
, hash = Nothing
}
{-| Renders whenever `Auth.Action.showLoadingPage` is returned from `onPageLoad`.
-}
viewLoadingPage : Shared.Model -> Route () -> View Never
viewLoadingPage shared route =
View.fromString "Loading..."

View file

@ -3,10 +3,9 @@ module Config.Identity exposing (..)
type alias PageInput =
{ pageHome : String
, pageRoot : String
, pageContact : String
, pageDebate : String
, pageDodgers : String
, pageCucks : String
, pageGibberish : String
, pageHyperBlog : String
, pageInterviews : String
@ -18,10 +17,9 @@ type alias PageInput =
pageNames : PageInput
pageNames =
{ pageRoot = "home"
, pageHome = "uRN"
{ pageHome = "Home"
, pageServices = "services"
, pageDodgers = "cuckList"
, pageCucks = "cuckList"
, pageDebate = "arguments"
, pageGibberish = "gibberish"
, pageHyperBlog = "hyperBlog"
@ -30,63 +28,3 @@ pageNames =
, pageContact = "contact"
, pageDonate = "donate"
}
createPageName : String -> String
createPageName pageName =
pageNames.pageHome ++ " :: " ++ pageName
rootName : String
rootName =
createPageName pageNames.pageRoot
homeName : String
homeName =
createPageName pageNames.pageHome
contactName : String
contactName =
createPageName pageNames.pageContact
debateName : String
debateName =
createPageName pageNames.pageDebate
dodgersName : String
dodgersName =
createPageName pageNames.pageDodgers
gibberishName : String
gibberishName =
createPageName pageNames.pageGibberish
hyperBlogName : String
hyperBlogName =
createPageName pageNames.pageHyperBlog
interviewsName : String
interviewsName =
createPageName pageNames.pageInterviews
nutriDexName : String
nutriDexName =
createPageName pageNames.pageNutriDex
servicesName : String
servicesName =
createPageName pageNames.pageServices
donateName : String
donateName =
createPageName pageNames.pageDonate

194
frontend/src/Effect.elm Normal file
View file

@ -0,0 +1,194 @@
module Effect exposing
( Effect
, none, batch
, sendCmd, sendMsg
, pushRoute, replaceRoute, loadExternalUrl
, map, toCmd
)
{-|
@docs Effect
@docs none, batch
@docs sendCmd, sendMsg
@docs pushRoute, replaceRoute, loadExternalUrl
@docs map, toCmd
-}
import Browser.Navigation
import Dict exposing (Dict)
import Route exposing (Route)
import Route.Path
import Shared.Model
import Shared.Msg
import Task
import Url exposing (Url)
type Effect msg
= -- BASICS
None
| Batch (List (Effect msg))
| SendCmd (Cmd msg)
-- ROUTING
| PushUrl String
| ReplaceUrl String
| LoadExternalUrl String
-- SHARED
| SendSharedMsg Shared.Msg.Msg
-- BASICS
{-| Don't send any effect.
-}
none : Effect msg
none =
None
{-| Send multiple effects at once.
-}
batch : List (Effect msg) -> Effect msg
batch =
Batch
{-| Send a normal `Cmd msg` as an effect, something like `Http.get` or `Random.generate`.
-}
sendCmd : Cmd msg -> Effect msg
sendCmd =
SendCmd
{-| Send a message as an effect. Useful when emitting events from UI components.
-}
sendMsg : msg -> Effect msg
sendMsg msg =
Task.succeed msg
|> Task.perform identity
|> SendCmd
-- ROUTING
{-| Set the new route, and make the back button go back to the current route.
-}
pushRoute :
{ path : Route.Path.Path
, query : Dict String String
, hash : Maybe String
}
-> Effect msg
pushRoute route =
PushUrl (Route.toString route)
{-| Set given path as route (without any query params or hash), and make the back button go back to the current route.
-}
pushPath :
Route.Path.Path
-> Effect msg
pushPath path =
PushUrl (Route.toString { path = path, query = Dict.empty, hash = Nothing })
{-| Set the new route, but replace the previous one, so clicking the back
button **won't** go back to the previous route.
-}
replaceRoute :
{ path : Route.Path.Path
, query : Dict String String
, hash : Maybe String
}
-> Effect msg
replaceRoute route =
ReplaceUrl (Route.toString route)
{-| Set given path as route (without any query params or hash), but replace the previous route,
so clicking the back button **won't** go back to the previous route
-}
replacePath :
Route.Path.Path
-> Effect msg
replacePath path =
ReplaceUrl (Route.toString { path = path, query = Dict.empty, hash = Nothing })
{-| Redirect users to a new URL, somewhere external your web application.
-}
loadExternalUrl : String -> Effect msg
loadExternalUrl =
LoadExternalUrl
-- INTERNALS
{-| Elm Land depends on this function to connect pages and layouts
together into the overall app.
-}
map : (msg1 -> msg2) -> Effect msg1 -> Effect msg2
map fn effect =
case effect of
None ->
None
Batch list ->
Batch (List.map (map fn) list)
SendCmd cmd ->
SendCmd (Cmd.map fn cmd)
PushUrl url ->
PushUrl url
ReplaceUrl url ->
ReplaceUrl url
LoadExternalUrl url ->
LoadExternalUrl url
SendSharedMsg sharedMsg ->
SendSharedMsg sharedMsg
{-| Elm Land depends on this function to perform your effects.
-}
toCmd :
{ key : Browser.Navigation.Key
, url : Url
, shared : Shared.Model.Model
, fromSharedMsg : Shared.Msg.Msg -> msg
, batch : List msg -> msg
, toCmd : msg -> Cmd msg
}
-> Effect msg
-> Cmd msg
toCmd options effect =
case effect of
None ->
Cmd.none
Batch list ->
Cmd.batch (List.map (toCmd options) list)
SendCmd cmd ->
cmd
PushUrl url ->
Browser.Navigation.pushUrl options.key url
ReplaceUrl url ->
Browser.Navigation.replaceUrl options.key url
LoadExternalUrl url ->
Browser.Navigation.load url
SendSharedMsg sharedMsg ->
Task.succeed sharedMsg
|> Task.perform options.fromSharedMsg

View file

@ -88,7 +88,7 @@ view :
}
-> View contentMsg
view { content, model, toContentMsg, props } =
{ title = content.title
{ title = "uRN :: " ++ content.title
, attributes = [ F.family [ spartanFont ] ]
, element =
row
@ -158,13 +158,13 @@ view { content, model, toContentMsg, props } =
, F.size 17
, spacing 8
]
(buttonMaker pageNames.pageRoot
:: List.map buttonMaker
(homeButtonMaker
:: List.map pagesButtonMaker
[ pageNames.pageServices
, pageNames.pageHyperBlog
, pageNames.pageDebate
, pageNames.pageGibberish
, pageNames.pageDodgers
, pageNames.pageCucks
, pageNames.pageNutriDex
, pageNames.pageInterviews
, pageNames.pageDonate
@ -242,10 +242,10 @@ iconList =
]
buttonMaker : String -> Element msg
buttonMaker name =
buttonMaker : String -> String -> Element msg
buttonMaker name url =
row
[]
[ spacing 10 ]
[ column [ E.width <| px 36 ]
[ E.image
[ alignLeft
@ -253,14 +253,14 @@ buttonMaker name =
, E.width <| px 30
]
{ src = "navbar/" ++ String.toLower name ++ ".png"
, description = ""
, description = name ++ " icon"
}
]
, column
[ alignBottom ]
[ link
[]
{ url = localhostUrl ++ String.toLower name
{ url = url
, label =
el
[ mouseOver [ F.color colourTheme.textLightOrange ]
@ -272,3 +272,13 @@ buttonMaker name =
}
]
]
homeButtonMaker : Element msg
homeButtonMaker =
buttonMaker "home" localhostUrl
pagesButtonMaker : String -> Element msg
pagesButtonMaker name =
buttonMaker name (localhostUrl ++ String.toLower name)

View file

@ -88,7 +88,7 @@ page shared route =
toLayout : Model -> Layouts.Layout Msg
toLayout model =
Layouts.Navbar { }
Layouts.Navbar {}
@ -143,7 +143,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = debateName
{ title = pageNames.pageDebate
, attributes = []
, element = debateContainer shared.device
}
@ -158,28 +158,7 @@ debateList : Device -> Element msg
debateList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -190,25 +169,10 @@ debateList device =
( Phone, Portrait ) ->
List.map argumentMakerMobile
( Phone, Landscape ) ->
List.map argumentMakerMobile
( Tablet, Portrait ) ->
List.map argumentMakerMobile
( Tablet, Landscape ) ->
List.map argumentMakerMobile
( Desktop, Portrait ) ->
List.map argumentMaker
( Desktop, Landscape ) ->
List.map argumentMaker
( BigDesktop, Portrait ) ->
List.map argumentMaker
( BigDesktop, Landscape ) ->
_ ->
List.map argumentMaker
)
[ argumentApoBCVD

View file

@ -35,7 +35,7 @@ page shared route =
toLayout : Model -> Layouts.Layout Msg
toLayout model =
Layouts.Navbar { }
Layouts.Navbar {}
@ -87,7 +87,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = contactName
{ title = pageNames.pageContact
, attributes = []
, element = contactContainer shared.device
}
@ -103,27 +103,6 @@ contactList device =
column pageListDesktop <|
List.concat
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
[ [ instructionMaker ] ]
( Phone, Landscape ) ->
[ [ instructionMaker ] ]
( Tablet, Portrait ) ->
[ [ instructionMaker ] ]
( Tablet, Landscape ) ->
[ [ instructionMaker ] ]
( Desktop, Portrait ) ->
[ [ instructionMaker ] ]
( Desktop, Landscape ) ->
[ [ instructionMaker ] ]
( BigDesktop, Portrait ) ->
[ [ instructionMaker ] ]
( BigDesktop, Landscape ) ->
_ ->
[ [ instructionMaker ] ]
)

View file

@ -99,7 +99,7 @@ page shared route =
toLayout : Model -> Layouts.Layout Msg
toLayout model =
Layouts.Navbar { }
Layouts.Navbar {}
@ -151,7 +151,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = dodgersName
{ title = pageNames.pageCucks
, attributes = []
, element = dodgersContainer shared.device
}
@ -166,28 +166,7 @@ dodgersList : Device -> Element msg
dodgersList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -198,25 +177,10 @@ dodgersList device =
( Phone, Portrait ) ->
List.map cuckMakerMobile
( Phone, Landscape ) ->
List.map cuckMakerMobile
( Tablet, Portrait ) ->
List.map cuckMakerMobile
( Tablet, Landscape ) ->
List.map cuckMakerMobile
( Desktop, Portrait ) ->
List.map cuckMaker
( Desktop, Landscape ) ->
List.map cuckMaker
( BigDesktop, Portrait ) ->
List.map cuckMaker
( BigDesktop, Landscape ) ->
_ ->
List.map cuckMaker
)
[ cuckAdamSinger

View file

@ -96,7 +96,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = donateName
{ title = pageNames.pageDonate
, attributes = []
, element = donateContainer shared.device
}
@ -111,28 +111,7 @@ donateList : Device -> Element msg
donateList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -143,25 +122,10 @@ donateList device =
( Phone, Portrait ) ->
List.map donateMakerMobile
( Phone, Landscape ) ->
List.map donateMakerMobile
( Tablet, Portrait ) ->
List.map donateMakerMobile
( Tablet, Landscape ) ->
List.map donateMakerMobile
( Desktop, Portrait ) ->
List.map donateMaker
( Desktop, Landscape ) ->
List.map donateMaker
( BigDesktop, Portrait ) ->
List.map donateMaker
( BigDesktop, Landscape ) ->
_ ->
List.map donateMaker
)
[ donateLiberaPay

View file

@ -45,7 +45,7 @@ page shared route =
toLayout : Model -> Layouts.Layout Msg
toLayout model =
Layouts.Navbar { }
Layouts.Navbar {}
@ -100,7 +100,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = gibberishName
{ title = pageNames.pageGibberish
, attributes = []
, element = gibberishContainer shared.device
}
@ -115,28 +115,7 @@ gibberishList : Device -> Element msg
gibberishList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -147,25 +126,10 @@ gibberishList device =
( Phone, Portrait ) ->
List.map gibberishMakerMobile
( Phone, Landscape ) ->
List.map gibberishMakerMobile
( Tablet, Portrait ) ->
List.map gibberishMakerMobile
( Tablet, Landscape ) ->
List.map gibberishMakerMobile
( Desktop, Portrait ) ->
List.map gibberishMaker
( Desktop, Landscape ) ->
List.map gibberishMaker
( BigDesktop, Portrait ) ->
List.map gibberishMaker
( BigDesktop, Landscape ) ->
_ ->
List.map gibberishMaker
)
[ epistemologyGibberish

View file

@ -85,7 +85,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = ""
{ title = pageNames.pageHome
, attributes = []
, element = homeContainer shared.device
}

View file

@ -82,7 +82,7 @@ subscriptions model =
view : Model -> View Msg
view model =
{ title = hyperBlogName
{ title = pageNames.pageHyperBlog
, attributes = []
, element = none
}

View file

@ -44,7 +44,7 @@ page shared route =
toLayout : Model -> Layouts.Layout Msg
toLayout model =
Layouts.Navbar { }
Layouts.Navbar {}
@ -96,7 +96,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = interviewsName
{ title = pageNames.pageInterviews
, attributes = []
, element = interviewContainer shared.device
}
@ -111,28 +111,7 @@ interviewList : Device -> Element msg
interviewList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -143,25 +122,10 @@ interviewList device =
( Phone, Portrait ) ->
List.map interviewMakerMobile
( Phone, Landscape ) ->
List.map interviewMakerMobile
( Tablet, Portrait ) ->
List.map interviewMakerMobile
( Tablet, Landscape ) ->
List.map interviewMakerMobile
( Desktop, Portrait ) ->
List.map interviewMaker
( Desktop, Landscape ) ->
List.map interviewMaker
( BigDesktop, Portrait ) ->
List.map interviewMaker
( BigDesktop, Landscape ) ->
_ ->
List.map interviewMaker
)
[ sigmaNutritionRadio

View file

@ -39,7 +39,7 @@ page shared route =
toLayout : Model -> Layouts.Layout Msg
toLayout model =
Layouts.Navbar { }
Layouts.Navbar {}
@ -91,7 +91,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = nutriDexName
{ title = pageNames.pageNutriDex
, attributes = []
, element = nutriDexContainer shared.device
}
@ -106,28 +106,7 @@ nutriDexList : Device -> Element msg
nutriDexList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -136,25 +115,10 @@ nutriDexList device =
( Phone, Portrait ) ->
List.map nutriDexMakerMobile
( Phone, Landscape ) ->
List.map nutriDexMakerMobile
( Tablet, Portrait ) ->
List.map nutriDexMakerMobile
( Tablet, Landscape ) ->
List.map nutriDexMakerMobile
( Desktop, Portrait ) ->
List.map nutriDexMaker
( Desktop, Landscape ) ->
List.map nutriDexMaker
( BigDesktop, Portrait ) ->
List.map nutriDexMaker
( BigDesktop, Landscape ) ->
_ ->
List.map nutriDexMaker
)
[ productNutriDex ]

View file

@ -89,7 +89,7 @@ subscriptions model =
view : Shared.Model -> Model -> View Msg
view shared model =
{ title = servicesName
{ title = pageNames.pageServices
, attributes = []
, element = servicesContainer shared.device
}
@ -104,28 +104,7 @@ servicesList : Device -> Element msg
servicesList device =
column
(case ( device.class, device.orientation ) of
( Phone, Portrait ) ->
pageListDesktop
( Phone, Landscape ) ->
pageListDesktop
( Tablet, Portrait ) ->
pageListDesktop
( Tablet, Landscape ) ->
pageListDesktop
( Desktop, Portrait ) ->
pageListDesktop
( Desktop, Landscape ) ->
pageListDesktop
( BigDesktop, Portrait ) ->
pageListDesktop
( BigDesktop, Landscape ) ->
_ ->
pageListDesktop
)
<|
@ -136,25 +115,10 @@ servicesList device =
( Phone, Portrait ) ->
List.map serviceMakerMobile
( Phone, Landscape ) ->
List.map serviceMakerMobile
( Tablet, Portrait ) ->
List.map serviceMakerMobile
( Tablet, Landscape ) ->
List.map serviceMakerMobile
( Desktop, Portrait ) ->
List.map serviceMaker
( Desktop, Landscape ) ->
List.map serviceMaker
( BigDesktop, Portrait ) ->
List.map serviceMaker
( BigDesktop, Landscape ) ->
_ ->
List.map serviceMaker
)
[ servicesDebateAnalysis