From 6f6f0c9940207d26aa491b0d5453f7a7ca097d28 Mon Sep 17 00:00:00 2001 From: Felix Dietze Date: Wed, 1 May 2019 22:47:15 +0200 Subject: [PATCH] direct share --- .../src/main/scala/parsers/UrlConfigParsing.scala | 14 +++++++++++--- webApp/src/main/scala/state/ViewConfig.scala | 14 ++++++++++++-- .../src/main/scala/views/SharedViewElements.scala | 5 +---- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/webApp/src/main/scala/parsers/UrlConfigParsing.scala b/webApp/src/main/scala/parsers/UrlConfigParsing.scala index 4626d462c..673a49cd4 100644 --- a/webApp/src/main/scala/parsers/UrlConfigParsing.scala +++ b/webApp/src/main/scala/parsers/UrlConfigParsing.scala @@ -2,7 +2,7 @@ package wust.webApp.parsers import cats.data.NonEmptyList import wust.graph.Page -import wust.ids.{Cuid, NodeId, View, ViewOperator} +import wust.ids._ import wust.webApp.state._ import kantan.regex._ import kantan.regex.implicits._ @@ -10,6 +10,7 @@ import kantan.regex.generic._ import wust.api.Authentication import scala.scalajs.js +import scala.util.Try private object ParsingHelpers { def decodeSeq[A](list: Seq[DecodeResult[A]]): DecodeResult[Seq[A]] = @@ -143,8 +144,15 @@ object UrlConfigParser { result match { case Right(cfg) => searchOptions.fold(cfg) { searchOptions => //Keep in sync with site.webmanifest where mapping of share url is defined - (searchOptions.get("share-title"), searchOptions.get("share-text"), searchOptions.get("share-url")) match { - case (Some(title), text, urlOption) => cfg.copy(shareOptions = Some(ShareOptions(title = title, text = text.getOrElse(""), url = urlOption.getOrElse("")))) + ( + searchOptions.get("share-title"), + searchOptions.get("share-text"), + searchOptions.get("share-url"), + searchOptions.get("share-node-role").flatMap(NodeRole.fromString), + searchOptions.get("share-parent-id").flatMap(s => Try(Cuid.fromBase58(s)).toOption.map(NodeId(_))) + ) match { + case (Some(title), text, urlOption, Some(nodeRole), Some(parentId)) => cfg.copy(shareOptions = Some(ShareOptions.Direct(title = title, text = text.getOrElse(""), url = urlOption.getOrElse(""), nodeRole = nodeRole, parentId = parentId))) + case (Some(title), text, urlOption, _, _) => cfg.copy(shareOptions = Some(ShareOptions.PreFill(title = title, text = text.getOrElse(""), url = urlOption.getOrElse("")))) case _ => cfg } } diff --git a/webApp/src/main/scala/state/ViewConfig.scala b/webApp/src/main/scala/state/ViewConfig.scala index d3600ac56..e7f1d5fd5 100644 --- a/webApp/src/main/scala/state/ViewConfig.scala +++ b/webApp/src/main/scala/state/ViewConfig.scala @@ -2,7 +2,7 @@ package wust.webApp.state import wust.api.Authentication import wust.graph._ -import wust.ids.View +import wust.ids.{NodeId, NodeRole, View} import wust.webApp.parsers.{UrlConfigParser, UrlConfigWriter} // ViewConfig and UrlConfig are the configurations driving our application ui. @@ -15,7 +15,17 @@ import wust.webApp.parsers.{UrlConfigParser, UrlConfigWriter} //TODO: get rid of pagechange, currently needed to know whether we should get a new graph on page change or not. // we only know whether we need this when changing the page. But it feels like mixing data and commands. -case class ShareOptions(title: String, text: String, url: String) +sealed trait ShareOptions { + def title: String + def text: String + def url: String + + def content = List(title, text, url).filter(_.nonEmpty).mkString(" - ") +} +object ShareOptions { + case class PreFill(title: String, text: String, url: String) extends ShareOptions + case class Direct(title: String, text: String, url: String, nodeRole: NodeRole, parentId: NodeId) extends ShareOptions +} case class PageChange(page: Page, needsGet: Boolean = true) case class UrlConfig(view: Option[View], pageChange: PageChange, redirectTo: Option[View], shareOptions: Option[ShareOptions], invitation: Option[Authentication.Token]) { diff --git a/webApp/src/main/scala/views/SharedViewElements.scala b/webApp/src/main/scala/views/SharedViewElements.scala index b8e967655..55fef314c 100644 --- a/webApp/src/main/scala/views/SharedViewElements.scala +++ b/webApp/src/main/scala/views/SharedViewElements.scala @@ -67,10 +67,7 @@ object SharedViewElements { showMarkdownHelp: Boolean = false )(implicit ctx: Ctx.Owner): VNode = { val initialValue = if(preFillByShareApi) Rx { - state.urlConfig().shareOptions.fold("") { share => - val elements = List(share.title, share.text, share.url).filter(_.nonEmpty) - elements.mkString(" - ") - } + state.urlConfig().shareOptions.fold("")(_.content) }.toObservable.dropWhile(_.isEmpty) else Observable.empty // drop starting sequence of empty values. only interested once share api defined. val autoResizer = new TextAreaAutoResizer