diff --git a/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala b/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala index 653bc51..54fea2d 100644 --- a/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala +++ b/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala @@ -6,6 +6,7 @@ import scala.concurrent.Future import sttp.client3.SttpBackend import sttp.capabilities.WebSockets +import scala.concurrent.ExecutionContext trait CustomTapirPlatformSpecific extends SttpClientInterpreter: self: CustomTapir => @@ -19,4 +20,14 @@ backend: Backend, wsToPipe: WebSocketToPipe[Any] ): I => Future[O] = - toClientThrowErrors(endpoint, baseUri.toUri, backend) + val req = toRequestThrowErrors(endpoint, baseUri.toUri) + (i: I) => { + val resp = backend.responseMonad.map(backend.send(req(i).followRedirects(false)))(_.body) + resp.onComplete { + case scala.util.Failure(e: RuntimeException) if e.getMessage == "Unexpected redirect" => + // Reload window on redirect, as it means that we need to log in again + org.scalajs.dom.window.location.reload(true) + case _ => () + }(using ExecutionContext.global) + resp + } diff --git a/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala b/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala index 653bc51..54fea2d 100644 --- a/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala +++ b/tapir/js/src/main/scala/fiftyforms/tapir/CustomTapirPlatformSpecific.scala @@ -6,6 +6,7 @@ import scala.concurrent.Future import sttp.client3.SttpBackend import sttp.capabilities.WebSockets +import scala.concurrent.ExecutionContext trait CustomTapirPlatformSpecific extends SttpClientInterpreter: self: CustomTapir => @@ -19,4 +20,14 @@ backend: Backend, wsToPipe: WebSocketToPipe[Any] ): I => Future[O] = - toClientThrowErrors(endpoint, baseUri.toUri, backend) + val req = toRequestThrowErrors(endpoint, baseUri.toUri) + (i: I) => { + val resp = backend.responseMonad.map(backend.send(req(i).followRedirects(false)))(_.body) + resp.onComplete { + case scala.util.Failure(e: RuntimeException) if e.getMessage == "Unexpected redirect" => + // Reload window on redirect, as it means that we need to log in again + org.scalajs.dom.window.location.reload(true) + case _ => () + }(using ExecutionContext.global) + resp + } diff --git a/ui/src/ui/UIString.scala b/ui/src/ui/UIString.scala index cda544d..64c8f0f 100644 --- a/ui/src/ui/UIString.scala +++ b/ui/src/ui/UIString.scala @@ -11,9 +11,12 @@ object UIString: def apply(s: String): UIString = s -extension (ui: UIString) inline def toNode: TextNode = TextNode(ui) + extension (ui: UIString) inline def toNode: TextNode = TextNode(ui) -extension (s: String) inline def ui: UIString = UIString(s) + extension (s: String) inline def ui: UIString = UIString(s) -given Conversion[UIString, TextNode] with - def apply(ui: UIString): TextNode = ui.toNode + given Conversion[UIString, TextNode] with + def apply(ui: UIString): TextNode = ui.toNode + + given Conversion[UIString, String] with + inline def apply(ui: UIString): String = ui