module Habits exposing (render)
import Browser
import Html exposing (..)
import Html.Attributes exposing (..)
import Html.Events exposing (..)
import Set
import State
import Time exposing (Weekday(..))
import UI
morning : List State.Habit
morning =
List.map
(\( duration, x ) ->
{ label = x
, habitType = State.Morning
, minutesDuration = duration
}
)
[ ( 1, "Make bed" )
, ( 2, "Brush teeth" )
, ( 10, "Shower" )
, ( 1, "Do push-ups" )
, ( 10, "Meditate" )
]
evening : List State.Habit
evening =
List.map
(\( duration, x ) ->
{ label = x
, habitType = State.Evening
, minutesDuration = duration
}
)
[ ( 30, "Read" )
, ( 1, "Record in State.Habit Journal" )
]
monday : List ( Int, String )
monday =
[ ( 90, "Bikram Yoga @ 17:00" )
]
tuesday : List ( Int, String )
tuesday =
[ ( 90, "Bikram Yoga @ 18:00" )
]
wednesday : List ( Int, String )
wednesday =
[ ( 5, "Shave" )
, ( 90, "Bikram Yoga @ 17:00" )
]
thursday : List ( Int, String )
thursday =
[]
friday : List ( Int, String )
friday =
[ ( 60, "Bikram Yoga @ 17:00" )
, ( 3, "Take-out trash" )
, ( 60, "Shop for groceries" )
]
saturday : List ( Int, String )
saturday =
[ ( 60, "Warm Yin Yoga @ 15:00" )
]
sunday : List ( Int, String )
sunday =
[ ( 1, "Shampoo" )
, ( 5, "Shave" )
, ( 1, "Trim nails" )
, ( 1, "Combine trash cans" )
, ( 10, "Mop tile and wood floors" )
, ( 10, "Laundry" )
, ( 5, "Vacuum bedroom" )
, ( 5, "Dust surfaces" )
, ( 5, "Clean mirrors" )
, ( 5, "Clean desk" )
]
payday : List State.Habit
payday =
List.map
(\( duration, x ) ->
{ label = x
, habitType = State.Payday
, minutesDuration = duration
}
)
[ ( 1, "Ensure \"Emergency\" fund has a balance of 1000 GBP" )
, ( 1, "Open \"finances_2020\" Google Sheet" )
, ( 1, "Settle up with Mimi on TransferWise" )
, ( 1, "Adjust GBP:USD exchange rate" )
, ( 1, "Adjust \"Stocks (after tax)\" to reflect amount Google sent" )
, ( 1, "Add remaining cash to \"Carryover (cash)\"" )
, ( 1, "Adjust \"Paycheck\" to reflect amount Google sent" )
, ( 5, "In the \"International Xfer\" table, send \"Xfer amount\" from Monzo to USAA" )
, ( 10, "Go to an ATM and extract the amount in \"ATM withdrawal\"" )
, ( 0, "Await the TransferWise transaction to complete and pay MyFedLoan in USD" )
]
firstOfTheMonth : List State.Habit
firstOfTheMonth =
List.map
(\( duration, x ) ->
{ label = x
, habitType = State.FirstOfTheMonth
, minutesDuration = duration
}
)
[ ( 10, "Create habit template in journal" )
, ( 30, "Assess previous month's performance" )
, ( 5, "Register for Bikram Yoga classes" )
]
firstOfTheYear : List State.Habit
firstOfTheYear =
List.map
(\( duration, x ) ->
{ label = x
, habitType = State.FirstOfTheYear
, minutesDuration = duration
}
)
[ ( 60, "Write a post mortem for the previous year" )
]
weekdayName : Weekday -> String
weekdayName weekday =
case weekday of
Mon ->
"Monday"
Tue ->
"Tuesday"
Wed ->
"Wednesday"
Thu ->
"Thursday"
Fri ->
"Friday"
Sat ->
"Saturday"
Sun ->
"Sunday"
habitsFor : Weekday -> List State.Habit
habitsFor weekday =
let
toHabit =
List.map
(\( duration, x ) ->
{ label = x
, habitType = State.DayOfWeek
, minutesDuration = duration
}
)
in
case weekday of
Mon ->
toHabit monday
Tue ->
toHabit tuesday
Wed ->
toHabit wednesday
Thu ->
toHabit thursday
Fri ->
toHabit friday
Sat ->
toHabit saturday
Sun ->
tailwind : List ( String, Bool ) -> Attribute msg
tailwind classes =
classes
|> List.filter (\( k, v ) -> v)
|> List.map (\( k, v ) -> k)
|> String.join " "
|> class
toHabit sunday
render : State.Model -> Html State.Msg
render { today, visibleDayOfWeek, completed } =
case visibleDayOfWeek of
Nothing ->
p [] [ text "Unable to display habits because we do not know what day of the week it is." ]
Just weekday ->
div
[ class "container mx-auto py-6 px-6"
, tailwind [ ( "pt-20", today /= visibleDayOfWeek ) ]
]
[ header []
[ if today /= visibleDayOfWeek then
div [ class "text-center w-full bg-blue-600 text-white fixed top-0 left-0 px-3 py-4" ]
[ p [ class "py-2 inline pr-5" ]
[ text "As you are not viewing today's habits, the UI is in read-only mode" ]
, UI.button
[ class "bg-blue-200 px-4 py-2 rounded text-blue-600 text-xs font-bold"
, onClick State.ViewToday
]
[ text "View Today's Habits" ]
]
else
text ""
, div [ class "flex center" ]
[ UI.button
[ class "w-1/4 text-gray-500"
, onClick State.ViewPrevious
]
[ text "‹ previous" ]
, h1 [ class "font-bold text-blue-500 text-3xl text-center w-full" ]
[ text (weekdayName weekday) ]
, UI.button
[ class "w-1/4 text-gray-500"
, onClick State.ViewNext
]
[ text "next ›" ]
]
]
, ul [ class "pt-6" ]
(weekday
|> habitsFor
|> List.indexedMap
(\i x ->
li [ class "text-xl list-disc ml-6" ]
[ if today == visibleDayOfWeek then
UI.button
[ class "py-5 px-3"
, tailwind
[ ( "line-through", Set.member i completed )
, ( "text-gray-400", Set.member i completed )
]
, onClick (State.ToggleHabit i)
]
[ text x ]
else
UI.button
[ class "py-5 px-3 cursor-not-allowed"
, onClick State.DoNothing
]
[ text x ]
]
)
)
, footer [ class "text-sm text-center text-gray-500 fixed bottom-0 left-0 w-full py-4" ]
[ p [] [ text "This app is brought to you by William Carroll." ]
, p [] [ text "Client: Elm; Server: n/a" ]
]
]