elm-frontti/src/Message.elm

DOWNLOAD
port module Message exposing (..)

import Http
import Html
import Html.Attributes
import Json.Encode
import Browser
import Time
import Page as P
import Article
import Browser.Navigation as Nav
import Settings
import Url
import Title
import Feeds
import Image exposing (Image, ReferencingPost)
import Logs
import Initial

import File exposing (File)
import UUID exposing (UUID)
import Stack exposing (..)
import Dict exposing (Dict)
import Regex 
    
type ViewState
    = PageView P.Page
    | PostView Article.Article
    | Loading 
    | ShowError String
    | PostEditorList (List Title.Title)                     -- list all the posts in db
    | PostEditor
    | MediaList                     -- list all the image blobs in db
    | TaggedPostsView (List Article.Article)
    | SettingsEditor
    | Feeds (List Feeds.Feed) Bool -- <- show_archived?
                                   -- v- the second List will be parsed as List Regex later
    | Logs (List Logs.Log) (List Logs.Group) String
    | UserSettings
      -- oldpwd 
      String
      -- newpwd 
      String
      -- the view's user we're editing instead of the LoginState's user who is logged in here 
      (Maybe LoginUser)
    | InitialSetup
      Initial.InitialFormData
                                                                                               
      

-- a simplified version of ViewState type for the main.elm's tabcomponent 
type TabState
    = Blog
    | RssFeeds
    | ManagePosts
    | ManageMedia
    | SettingsTab 
    | PostEditTab

viewstate_to_tabstate vs =
    case vs of
        PageView _ -> Blog
        PostView _ -> Blog
        Loading -> Blog
        ShowError _ -> Blog
        PostEditorList _ -> ManagePosts
        PostEditor -> PostEditTab
        MediaList -> ManageMedia
        TaggedPostsView _ -> Blog
        SettingsEditor -> SettingsTab
        Feeds _ _ -> RssFeeds
        Logs _ _ _ -> Blog
        UserSettings _ _ _ -> Blog
        InitialSetup _ -> Blog 

tabstate_to_str tb =
    case tb of
        Blog -> "Blog"
        RssFeeds -> "RssFeeds"
        ManagePosts -> "ManagePosts"
        ManageMedia -> "ManageMedia"
        SettingsTab  -> "SettingsTab"
        PostEditTab -> "PostEditTab"
                       
str_to_tabstate str =
    case str of
        "Blog" -> Blog
        "RssFeeds" -> RssFeeds
        "ManagePosts" -> ManagePosts
        "ManageMedia" -> ManageMedia
        "SettingsTab"  -> SettingsTab
        "PostEditTab" -> PostEditTab
        _ -> Blog

type alias User =
    { username : String
    , nickname : String
    , img_location : String
    }

type LoginState
    = LoggedIn LoginUser
    | LoggingIn String String
    | LoginFailed
    | LoggedOut      


type alias LoginUser =
    { nickname : String
    , username : String
    , img_location : String
    , primary_group_name : String
    , permissions : List String
    , id: Int                   --unique and immutable key, needed because UserEditor.editor lets user change all the other values
    }

type alias MediaListState =
    { selected_ids_for_removal : List UUID
    , referencing_posts : Dict String (List ReferencingPost)}

type alias PostEditorSettings =
    { article : Article.Article
    , selected_tag : String
    , show_preview : Bool
    , previewing_previously : Maybe Article.Article}

type FeedReaderState
    = PerFeed
    | SingleFeed
    | FeedManager 
      
str_to_readerState str =
    case str of
        "PerFeed" -> Just PerFeed
        "SingleFeed" -> Just SingleFeed
        "FeedManager" -> Just FeedManager
        _ -> Nothing
             
type alias Model =
    { view_state : ViewState
    , settings : Maybe Settings.Settings
    , showImageModal : Bool
    , draggingImages : Bool
    , loadedImages : List Image
    , medialist_state : Maybe MediaListState
    , loginState : LoginState
    , key : Nav.Key
    , url : Url.Url
    , postEditorSettings: Maybe PostEditorSettings
    , zone : Time.Zone
    , titles : List Article.Title
    , searchedPosts : List Article.PreviousArticle
    , new_feed: Maybe Feeds.NewFeed
    , feedReaderState: FeedReaderState
    , feedMetadata: Maybe Feeds.FeedMetadata
    , ringLogAlarm: Bool}
    
type Msg
  = PageReceived (Result Http.Error P.Page)
  | PostReceived (Result Http.Error Article.Article)
  | SettingsReceived (Result Http.Error Settings.Settings)
  | TitlesReceived (Result Http.Error (List Article.Title))
  | EditableTitlesReceived (Result Http.Error (List Article.Title))
  | UrlChanged Url.Url
  | LinkClicked Browser.UrlRequest
  | LoginFocus
  | ChangeUsername String
  | ChangePassword String
  | DoLogIn
  | LoginSuccess (Result Http.Error LoginUser)
  | GotSession (Result Http.Error LoginUser)
  | OpenPostEditor Int
  | EditorPostReceived (Result Http.Error Article.Article)
  | PromptTag String
  | ReceivedTag String
  | AceStateUpdate String
  | SelectTag String
  | Alert String
  | DropTag String
  | SavePost Article.Article
  | HttpIgnoreResponse (Result Http.Error String)
  | HttpGoHome (Result Http.Error String)
  | GoHome
  | ChangeTitle String
  | RunAce String
  | GetListOfImages
  | GotListOfImages Bool (Result Http.Error (List Image.Image))
  | SelectedImage UUID
  | EditorDragEnter
  | EditorDragLeave
  | GotFiles (File.File -> Cmd Msg) File (List File) 
  | GotInputFiles (List File)
  | UploadedImage (Result Http.Error Image.PostImageResponse)
  | MarkImageForRemoval UUID
  | MarkAllImages (List UUID)
  | RemoveSelectedImages
  | HttpManagerGetListOfImages (Result Http.Error String)
  | GotReferencingPosts (Result Http.Error (List Image.ReferencingPost))
  | PushUrl String
  | AdjustTimeZone Time.Zone
  | GotTaggedPosts  (Result Http.Error (List Article.Article))
  | ToggleArticlePreview
  | GotOldPost (Result Http.Error Article.Article)
  | GenNewPost 
  | NewPostGenerated (Result Http.Error Int)
  | ToggleArticleUnlisted
  | ToggleArticleHidden
  | AdminSettingsReceived (Result Http.Error Settings.Settings)
  | SetTimeFormat String
  | SetBlogTitle String
  | SetPageSize String
  | SaveSettings
  | SettingsSaved (Result Http.Error ())
  | ShowPreviousPostsModal
  | ClosePreviousPostsModel
  | PreviouslySearchInput String
  | PreviouslySearchResult (Result Http.Error (List Article.PreviousArticle))
  | SelectPreviouslyPost Article.PreviousArticle
  | DropPreviously Article.PreviousArticle
  | SetPreviouslyLabel String
  | LoadPreviouslyPreview Article.PreviousArticle
  | PreviousPostReceived (Result Http.Error Article.Article)
  | ClosePreviousPostPreviewModal
  | FeedsReceived (Result Http.Error (List Feeds.Feed))
  | SetFeedUrl String 
  | SetFeedName String
  | AddFeed Feeds.NewFeed
  | FeedAdded (Result Http.Error ())
  | SelectTab String String
  | ReadFeedItem UUID UUID Bool
  | ShowArchivedFeedItems Bool
  | FeedItemReadResponse (Result Http.Error ())
  | DeleteFeed UUID
  | FeedDeleted (Result Http.Error ())
  | FeedMetaReceived (Result Http.Error Feeds.FeedMetadata)
  | SelectExcerpt UUID
  | CreateExcerptPost String UUID 
  | ExcerptCreated (String, String)
  | GotAdminLogs (Result Http.Error (List Logs.Log))
  | EditGroupRegexp String
  | SaveLogGroup String
  | DeleteLogGroup String
  | SetLogAlarmy Logs.ParsedGroup Bool
  | LogGroupsSaved (Result Http.Error ())
  | GotLogGroups (Result Http.Error (List Logs.Group))
  | GotTopbarLogAlarm (Result Http.Error Logs.TopbarAlarm)
  | SetDomain String
  | SetUsername String
  | SetNickname String
  | SetNewpwd String
  | SetOldpwd String
  | SubmitChangedUser String String LoginUser
  | UserSubmitResult (Result Http.Error ())
  | UploadedOwnProfilePic (Result Http.Error Image.PostImageResponse)
  | SetInitialUsername String
  | SetInitialNickname String
  | SetInitialPassword String
  | SetInitialDomain String
  | SetInitialBlog_Title String
  | SetInitialRss_Title String
  | SetInitialRss_Link String
  | SetInitialRss_Description String
  | SetInitialRss_Lang String
  | SetInitialRss_Email String
  | SaveInitialData Initial.InitialFormData
  | PostInitialSuccess (Result Http.Error ())

-- ports
port reallySetupAce : String -> Cmd msg
port addImgToAce : String -> Cmd msg
port alert : String -> Cmd msg

-- dumb shit that would deserve its own module
dangerouslySetInnerHTML: String -> Html.Attribute msg
dangerouslySetInnerHTML = Json.Encode.string >> Html.Attributes.property "dangerouslySetInnerHTML"