Skip to content
This repository was archived by the owner on Nov 20, 2025. It is now read-only.

Commit 5c90f5d

Browse files
Breaking up the sandbox module
1 parent 4d1722b commit 5c90f5d

File tree

11 files changed

+243
-212
lines changed

11 files changed

+243
-212
lines changed

build.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ set -e
44

55
./mill clean
66
./mill __.compile
7-
./mill -j2 __.test
87
./mill -j2 __.fastLinkJS
8+
./mill -j2 __.test
9+
./mill -j2 __.checkFormat
10+
./mill -j1 __.fix --check
911
./mill __.publishLocal
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package example
2+
3+
import tyrian.*
4+
import tyrian.Html.*
5+
6+
object Counter:
7+
8+
opaque type Model = Int
9+
10+
def init: Model = 0
11+
12+
enum Msg:
13+
case Increment, Decrement
14+
15+
def view(model: Model): Html[Msg] =
16+
div(
17+
button(onClick(Msg.Decrement))(text("-")),
18+
div(text(model.toString)),
19+
button(onClick(Msg.Increment))(text("+"))
20+
)
21+
22+
def update(msg: Msg, model: Model): Model =
23+
msg match
24+
case Msg.Increment => model + 1
25+
case Msg.Decrement => model - 1

sandbox/src-js/example/Fruit.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package example
2+
3+
final case class Fruit(name: String, available: Boolean)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package example
2+
3+
import tyrian.http.*
4+
5+
final case class HttpDetails(
6+
method: Method,
7+
url: Option[String],
8+
body: String,
9+
response: Option[Response],
10+
error: Option[String],
11+
timeout: Double,
12+
credentials: RequestCredentials,
13+
headers: List[(String, String)],
14+
cache: RequestCache
15+
)
16+
17+
object HttpDetails:
18+
val initial: HttpDetails =
19+
HttpDetails(
20+
Method.Get,
21+
Option("http://httpbin.org/get"),
22+
"",
23+
None,
24+
None,
25+
10000,
26+
RequestCredentials.SameOrigin,
27+
List(),
28+
RequestCache.Default
29+
)

sandbox/src-js/example/Model.scala

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package example
2+
3+
import cats.effect.IO
4+
import tyrian.websocket.*
5+
6+
import scala.scalajs.js
7+
8+
final case class Model(
9+
page: Page,
10+
echoSocket: Option[WebSocket[IO]],
11+
socketUrl: String,
12+
field: String,
13+
components: List[Counter.Model],
14+
log: List[String],
15+
error: Option[String],
16+
tmpSaveData: String,
17+
saveData: Option[String],
18+
currentTime: js.Date,
19+
http: HttpDetails,
20+
time: Time,
21+
mousePosition: (Int, Int),
22+
flavour: Option[String],
23+
fruit: List[Fruit],
24+
fruitInput: String,
25+
loadedImage: Option[String],
26+
loadedText: Option[String],
27+
loadedBytes: Option[IArray[Byte]],
28+
imageLoadingUrl: String,
29+
imageLoadingError: Option[String]
30+
)
31+
32+
object Model:
33+
// val echoServer = "ws://ws.ifelse.io" // public echo server
34+
val echoServer = "ws://localhost:8080/wsecho"
35+
36+
val init: Model =
37+
Model(
38+
Page.Page1,
39+
None,
40+
echoServer,
41+
"",
42+
Nil,
43+
Nil,
44+
None,
45+
"",
46+
None,
47+
new js.Date(),
48+
HttpDetails.initial,
49+
Time(0.0d, 0.0d),
50+
(0, 0),
51+
None,
52+
Nil,
53+
"",
54+
None,
55+
None,
56+
None,
57+
"https://openmoji.org/php/download_asset.php?type=emoji&emoji_hexcode=1F9A6&emoji_variant=color",
58+
None
59+
)
60+
61+
// We're only saving/loading the input field contents as an example
62+
def encode(model: Model): String = model.field
63+
def decode: Option[String] => Either[String, Model] =
64+
case None => Left("No snapshot found")
65+
case Some(data) =>
66+
Right(Model.init.copy(field = data))

sandbox/src-js/example/Msg.scala

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package example
2+
3+
import org.scalajs.dom
4+
import tyrian.cmds.ImageLoader
5+
import tyrian.http.Response
6+
7+
import scala.scalajs.js
8+
9+
enum Msg:
10+
case NewContent(content: String)
11+
case Insert
12+
case Remove
13+
case Modify(i: Int, msg: Counter.Msg)
14+
case FromSocket(message: String)
15+
case ToSocket(message: String)
16+
case FocusOnInputField
17+
case Log(msg: String)
18+
case WebSocketStatus(status: WSStatus)
19+
case Clear
20+
case StageSaveData(content: String)
21+
case Save(key: String, value: String)
22+
case Load(key: String)
23+
case ClearStorage(key: String)
24+
case DataLoaded(data: String)
25+
case NavigateTo(page: Page)
26+
case NavigateToUrl(href: String)
27+
case JumpToHomePage
28+
case OverwriteModel(model: Model)
29+
case TakeSnapshot
30+
case NewTime(time: js.Date)
31+
case MakeHttpRequest
32+
case GotHttpResult(response: Response)
33+
case GotHttpError(message: String)
34+
case UpdateHttpDetails(newUrl: String)
35+
case UpdateHttpBody(body: String)
36+
case UpdateHttpMethod(method: String)
37+
case UpdateHttpCredentials(credentials: String)
38+
case UpdateHttpTimeout(timeout: String)
39+
case UpdateHeaderKey(headerIndex: Int, key: String)
40+
case UpdateHeaderValue(headerIndex: Int, value: String)
41+
case UpdateHeaderAdd
42+
case UpdateHeaderRemove(headerIndex: Int)
43+
case UpdateHttpCache(cache: String)
44+
case FrameTick(runningTime: Double)
45+
case MouseMove(to: (Int, Int))
46+
case NewFlavour(name: String)
47+
case AddFruit
48+
case UpdateFruitInput(input: String)
49+
case ToggleFruitAvailability(name: String)
50+
case SelectImageFile
51+
case ReadImageFile(file: dom.File)
52+
case FileImageRead(fileData: String)
53+
case SelectTextFile
54+
case ReadTextFile(file: dom.File)
55+
case FileTextRead(fileData: String)
56+
case SelectBytesFile
57+
case ReadBytesFile(file: dom.File)
58+
case FileBytesRead(fileData: IArray[Byte])
59+
case LoadImage
60+
case UpdateImageUrl(url: String)
61+
case ImageLoaded(result: ImageLoader.Result)
62+
case NoOp

sandbox/src-js/example/Page.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package example
2+
3+
enum Page:
4+
case Page1, Page2, Page3, Page4, Page5, Page6, Page7
5+
6+
def toNavLabel: String =
7+
this match
8+
case Page1 => "Input fields"
9+
case Page2 => "Counters"
10+
case Page3 => "WebSockets"
11+
case Page4 => "Clock"
12+
case Page5 => "Http"
13+
case Page6 => "Form"
14+
case Page7 => "File Select"
15+
16+
def toUrlPath: String =
17+
this match
18+
case Page1 => "/page1"
19+
case Page2 => "/page2"
20+
case Page3 => "/page3"
21+
case Page4 => "/page4"
22+
case Page5 => "/page5"
23+
case Page6 => "/page6"
24+
case Page7 => "/page7"

0 commit comments

Comments
 (0)