@@ -412,14 +412,6 @@ module App =
413 let private log msg = eprintfn $"[skrepka] {msg}"
413 let private log msg = eprintfn $"[skrepka] {msg}"
415− let private asyncCmd (op: Async<Msg>) : Cmd<Msg> =
416− Cmd.ofEffect (fun dispatch ->
423 let private serializeEnvelope =
415 let private serializeEnvelope =
425 | Envelope.TextMessage(id, body) ->
417 | Envelope.TextMessage(id, body) ->
@@ -503,28 +495,20 @@ module App =
503 let mapCmd cmdMsg =
495 let mapCmd cmdMsg =
504 match cmdMsg with
496 match cmdMsg with
505 | CmdConnect(url, identity) ->
497 | CmdConnect(url, identity) ->
506− asyncCmd (
498+ Cmd.OfAsync.either
509− let! token = authenticate url identity
499+ (fun (url, id) -> authenticate url id)
510− return AuthOk token
501+ AuthOk
512− return AuthErr ex.Message
502+ (fun ex -> AuthErr ex.Message)
516 | CmdSend(session, recipientHex, envelope) ->
504 | CmdSend(session, recipientHex, envelope) ->
517− Cmd.ofEffect (fun dispatch ->
505+ Cmd.OfAsync.attempt
518− async {
506+ (fun (s, r, e) -> sendEnvelope s r e)
520− do! sendEnvelope session recipientHex envelope
507+ (session, recipientHex, envelope)
522− dispatch (SendFailed ex.Message)
508+ (fun ex -> SendFailed ex.Message)
526 | CmdPoll(session, cursor) ->
510 | CmdPoll(session, cursor) ->
527− asyncCmd (
511+ Cmd.ofEffect (fun dispatch ->
529 log $"poll start cursor={cursor}"
513 log $"poll start cursor={cursor}"
@@ -597,17 +581,17 @@ module App =
597 | Some e -> $" [{e}]"
581 | Some e -> $" [{e}]"
598 | None -> "")
582 | None -> "")
600− return PollResult(events, status, response.Cursor)
584+ dispatch (PollResult(events, status, response.Cursor))
602 | :? TimeoutException ->
586 | :? TimeoutException ->
603 log "poll timeout"
587 log "poll timeout"
604− return PollResult([], "polling...", cursor)
588+ dispatch (PollResult([], "polling...", cursor))
606 log $"poll error: {ex.Message}"
590 log $"poll error: {ex.Message}"
607 do! Async.Sleep 3000
591 do! Async.Sleep 3000
608− return PollResult([], $"poll error: {ex.Message}", cursor)
592+ dispatch (PollResult([], $"poll error: {ex.Message}", cursor))
610− )
594+ |> Async.Start)
612 | CmdCopyToClipboard text ->
596 | CmdCopyToClipboard text ->
613 Cmd.ofEffect (fun _ ->
597 Cmd.ofEffect (fun _ ->
@@ -615,13 +599,15 @@ module App =
615 |> ignore)
599 |> ignore)
617 | CmdLoadState ->
601 | CmdLoadState ->
618− asyncCmd (
602+ Cmd.OfAsync.perform
620− match! Store.loadIdentity () with
605+ match! Store.loadIdentity () with
621− | Some id -> return StateLoaded(Some id, Store.loadData (), Store.loadProfile ())
606+ | Some id -> return (Some id, Store.loadData (), Store.loadProfile ())
622− | None -> return StateLoaded(None, None, None)
607+ | None -> return (None, None, None)
626 | CmdSaveIdentity identity -> Cmd.ofEffect (fun _ -> Store.saveIdentity identity |> Async.Start)
612 | CmdSaveIdentity identity -> Cmd.ofEffect (fun _ -> Store.saveIdentity identity |> Async.Start)
@@ -669,6 +655,7 @@ module App =
669 Label("End-to-end encrypted messaging").font(size = 16.).centerTextHorizontal ()
655 Label("End-to-end encrypted messaging").font(size = 16.).centerTextHorizontal ()
658+ button "Next" GenIdentity
672 Button("Generate Identity", GenIdentity).centerHorizontal ()
659 Button("Generate Identity", GenIdentity).centerHorizontal ()
674 .padding(30.)
661 .padding(30.)