Skip to content

Commit

Permalink
Merge pull request #5 from AngelMunoz:nore-refactors
Browse files Browse the repository at this point in the history
Refactor Notes code from elmish
  • Loading branch information
AngelMunoz committed Nov 26, 2023
2 parents f04c408 + b1ac53d commit 1124d7b
Show file tree
Hide file tree
Showing 9 changed files with 373 additions and 227 deletions.
17 changes: 14 additions & 3 deletions src/Mandadin.Client/Components/TrackListItems.fs
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
namespace Mandadin.Client.Components.TrackListItems

open System
open System.Threading.Tasks
open Microsoft.AspNetCore.Components

open IcedTasks

open Bolero
open Bolero.Html
open Mandadin.Client


type NewItemForm() =
inherit Component()
let mutable objectName = ""
Expand All @@ -15,15 +19,21 @@ type NewItemForm() =
member val HideDone: bool = false with get, set

[<Parameter>]
member val OnSubmit: string -> unit = ignore with get, set
member val OnSubmit: string -> Task =
fun _ -> Task.CompletedTask with get, set

[<Parameter>]
member val OnHideDoneChange: bool -> unit = ignore with get, set

override self.Render() =
form {
attr.``class`` "row flex-spaces background-muted border notes-form"
on.submit (fun _ -> self.OnSubmit objectName)

on.task.submit (fun _ ->
taskUnit {
do! self.OnSubmit objectName
objectName <- ""
})

fieldset {
attr.``class`` "form-group"
Expand Down Expand Up @@ -123,7 +133,8 @@ type TrackListComponents =
let content =
state.Items |> TrackListItems.Stringify

share.Share(state.TrackListId, content) |> ignore)
share.ShareTracklistItem(state.TrackListId, content)
|> ignore)

Icon.Get Share
}
Expand Down
117 changes: 116 additions & 1 deletion src/Mandadin.Client/Services.fs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,28 @@ module Share =
loggerFactory.CreateLogger<IShareService>()

{ new IShareService with
member _.Share
member _.FromClipboard() =
valueTask {
logger.LogDebug("Getting content from clipboard...")

try
let! content =
jsRuntime.InvokeAsync<string>(
"Mandadin.Clipboard.ReadTextFromClipboard",
[||]
)

return content
with exn ->
logger.LogError(
"Failed to get content from clipboard: {exn}",
exn
)

return ""
}

member _.ShareTracklistItem
(
listId: string,
content: string
Expand All @@ -39,6 +60,20 @@ module Share =
)
}

member _.ShareNote(content: string) : Threading.Tasks.ValueTask =
valueTaskUnit {
logger.LogDebug(
"Sharing Content: '{content}'...",
content.Substring(0, 20)
)

do!
jsRuntime.InvokeVoidAsync(
"Mandadin.Share.ShareContent",
[| "Nota..." :> obj; content |]
)
}

member _.ToClipboard(content: string) : Threading.Tasks.ValueTask =
valueTaskUnit {
logger.LogDebug(
Expand All @@ -53,6 +88,86 @@ module Share =
)
} }

module Notes =
open System.Threading.Tasks

let inline factory (services: IServiceProvider) : INoteService =
let jsRuntime =
services.GetService<IJSRuntime>()

let loggerFactory =
services.GetService<ILoggerFactory>()

let logger =
loggerFactory.CreateLogger<INoteService>()


{ new INoteService with
member _.CreateNote(content: string) =
valueTask {
logger.LogDebug("Creating note...")

try
let! note =
jsRuntime.InvokeAsync<Note>(
"Mandadin.Database.CreateNote",
[| content :> obj |]
)

return ValueSome note
with exn ->
logger.LogError("Failed to create note: {exn}", exn)

return ValueNone
}

member _.DeleteNote(note: Note) =
valueTaskUnit {
logger.LogDebug("Deleting note: {note}", note)

return!
jsRuntime.InvokeVoidAsync(
"Mandadin.Database.DeleteNote",
[| note.Id :> obj; note.Rev |]
)
}

member _.UpdateNote(content, note) =
valueTask {
logger.LogDebug("Updating note: {note}", note)

try
let! updated =
jsRuntime.InvokeAsync<Note>(
"Mandadin.Database.UpdateNote",
[| { note with Content = content } :> obj |]
)

return ValueSome updated
with exn ->
logger.LogError("Failed to update note: {exn}", exn)

return ValueNone
}

member _.GetNotes() =
valueTask {
logger.LogDebug("Getting notes...")

try
let! notes =
jsRuntime.InvokeAsync<list<Note>>(
"Mandadin.Database.FindNotes",
[||]
)

return notes
with exn ->
logger.LogError("Failed to get notes: {exn}", exn)

return List.empty
} }

module ListItems =


Expand Down
4 changes: 3 additions & 1 deletion src/Mandadin.Client/Startup.fs
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,18 @@ module Program =
else
LogLevel.Debug

builder.Logging.SetMinimumLevel(level) |> ignore

builder.Logging.AddFilter(
"Microsoft.AspNetCore.Components.RenderTree.*",
LogLevel.Warning
)
|> ignore

builder.Logging.SetMinimumLevel(level) |> ignore

builder.Services
.AddSingleton<ITrackListItemService>(Services.ListItems.factory)
.AddSingleton<INoteService>(Services.Notes.factory)
.AddSingleton<IShareService>(Services.Share.factory)
|> ignore

Expand Down
13 changes: 12 additions & 1 deletion src/Mandadin.Client/Types.fs
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,20 @@ type ITrackListItemService =
abstract UpdateItem: item: TrackListItem -> ValueTask<TrackListItem>
abstract DeleteItem: item: TrackListItem -> ValueTask

type INoteService =
abstract GetNotes: unit -> ValueTask<list<Note>>
abstract CreateNote: content: string -> ValueTask<ValueOption<Note>>

abstract UpdateNote:
content: string * note: Note -> ValueTask<ValueOption<Note>>

abstract DeleteNote: note: Note -> ValueTask

type IShareService =
abstract Share: listId: string * content: string -> ValueTask
abstract ShareTracklistItem: listId: string * content: string -> ValueTask
abstract ShareNote: content: string -> ValueTask
abstract ToClipboard: content: string -> ValueTask
abstract FromClipboard: unit -> ValueTask<string>


[<RequireQualifiedAccess>]
Expand Down
Loading

0 comments on commit 1124d7b

Please sign in to comment.