[@@@ocaml.warning "-26-27-33"]
open Melange_json.Primitives
open React
module Aria = ReactAria
let button_class_inline =
"group inline-flex flex-row items-center px-1.5 py-1 -mx-0.75 -my-1 \
rounded-lg focus-visible:outline-none hover:bg-mist-20/40 \
active:bg-mist-20/40"
let button_class_default =
"group w-64 flex flex-row items-center gap-x-1 px-2 py-1.5 -mx-2 rounded-lg \
focus-visible:outline-none hover:bg-mist-20/40 active:bg-mist-20/40"
let value_class_inline =
"text-mana-100 font-serif inline-flex items-center gap-x-1"
let value_class_default = "text-mana-100 font-serif flex items-center gap-x-1"
type actor =
{did: string; handle: string; avatar_data_uri: string option [@default None]}
[@@deriving json]
let fallback handle avatar inline =
let button_class =
if inline then button_class_inline else button_class_default
in
let value_class =
if inline then value_class_inline else value_class_default
in
let[@react.component] make ~current_user ~logged_in_users ~add_account_url
?(name = "did") ?(inline = false) ?onChange () =
let handleAccountSwitch =
[%browser_only
fun newDid ->
if newDid <> current_user.did then (
let body =
Fetch.BodyInit.make
( Webapi.Url.URLSearchParams.makeWithArray [|("did", newDid)|]
|> Webapi.Url.URLSearchParams.toString )
in
let _ =
Fetch.fetchWithInit "/account/switch"
(Fetch.RequestInit.make ~method_:Fetch.Post
~headers:
(Fetch.HeadersInit.makeWithArray
[|("Content-Type", "application/x-www-form-urlencoded")|] )
~body () )
|> Js.Promise.then_ (fun response ->
if Fetch.Response.ok response then (
ignore ([%mel.raw {| window.location.reload() |}] : unit) ;
Js.Promise.resolve () )
else Js.Promise.resolve () )
|> Js.Promise.catch (fun _ -> Js.Promise.resolve ())
in
() ;
match onChange with Some f -> f newDid | None -> () )
else ()]
in
let button_class =
if inline then button_class_inline else button_class_default
in
let value_class =
if inline then value_class_inline else value_class_default
in
[%browser_only
fun () ->
( List.map
(fun (user : actor) ->
( match user.avatar_data_uri with
| Some src ->
| None ->
null )
(string user.handle)
)
logged_in_users
|> Array.of_list |> array )
(string "add account")
]