Skip to content

Commit da2da0c

Browse files
committed
Edit composables to align with their responsibilities
The order of the main content being displayed was from parsing -> rendering, which would lead to complexity when adding in tabbing functionality. Having the order be Renderer -> parsing -> rendering was more clear. This commit also introduces the idea of a "trace", where we have input a json array instead of a singular json
1 parent 6dea47e commit da2da0c

File tree

6 files changed

+1116
-41
lines changed

6 files changed

+1116
-41
lines changed

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/App.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import androidx.compose.foundation.layout.Box
44
import androidx.compose.runtime.Composable
55
import androidx.compose.runtime.LaunchedEffect
66
import androidx.compose.runtime.getValue
7+
import androidx.compose.runtime.mutableIntStateOf
8+
import androidx.compose.runtime.mutableIntStateOf
79
import androidx.compose.runtime.mutableStateOf
810
import androidx.compose.runtime.remember
911
import androidx.compose.runtime.setValue
1012
import androidx.compose.ui.Modifier
1113
import com.squareup.workflow1.traceviewer.model.WorkflowNode
1214
import com.squareup.workflow1.traceviewer.ui.InfoPanel
13-
import com.squareup.workflow1.traceviewer.utils.LoadWorkflowContent
15+
import com.squareup.workflow1.traceviewer.ui.RenderDiagram
1416
import com.squareup.workflow1.traceviewer.utils.SandboxBackground
1517
import com.squareup.workflow1.traceviewer.utils.UploadFile
1618
import io.github.vinceglb.filekit.PlatformFile
@@ -24,23 +26,28 @@ public fun App(
2426
) {
2527
var selectedFile by remember { mutableStateOf<PlatformFile?>(null) }
2628
var selectedNode by remember { mutableStateOf<WorkflowNode?>(null) }
29+
var snapshotIndex by remember { mutableIntStateOf(0) }
30+
2731
// Used when user selects a new file in [UploadFile]
2832
val resetSelectedNode = { selectedNode = null }
2933

3034
Box {
3135
// Main content
3236
if (selectedFile != null) {
3337
SandboxBackground {
34-
LoadWorkflowContent(selectedFile) {
35-
selectedNode = it
36-
}
38+
RenderDiagram(
39+
file = selectedFile,
40+
traceInd = snapshotIndex,
41+
onNodeSelect = { selectedNode = it }
42+
)
3743
}
3844
}
3945

46+
// Top trace selector row
47+
// TraceSelectRow { snapshotIndex.value = it }
48+
4049
// Left side information panel
41-
InfoPanel(
42-
selectedNode
43-
)
50+
InfoPanel(selectedNode)
4451

4552
// Bottom right upload button
4653
UploadFile(resetSelectedNode, { selectedFile = it })

workflow-trace-viewer/src/jvmMain/kotlin/com/squareup/workflow1/traceviewer/ui/WorkflowTree.kt

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.squareup.workflow1.traceviewer
1+
package com.squareup.workflow1.traceviewer.ui
22

33
import androidx.compose.foundation.border
44
import androidx.compose.foundation.clickable
@@ -14,18 +14,46 @@ import androidx.compose.runtime.getValue
1414
import androidx.compose.runtime.mutableStateOf
1515
import androidx.compose.runtime.remember
1616
import androidx.compose.runtime.setValue
17+
import androidx.compose.runtime.LaunchedEffect
1718
import androidx.compose.ui.Alignment
1819
import androidx.compose.ui.Modifier
1920
import androidx.compose.ui.graphics.Color
2021
import androidx.compose.ui.unit.dp
2122
import com.squareup.workflow1.traceviewer.model.WorkflowNode
23+
import com.squareup.workflow1.traceviewer.utils.fetchTrace
24+
import io.github.vinceglb.filekit.PlatformFile
25+
26+
/**
27+
* Access point for drawing the main content of the app. It will load the trace for given files and
28+
* tabs. This will also all errors related to errors parsing a given trace JSON file.
29+
*/
30+
@Composable
31+
public fun RenderDiagram(
32+
file: PlatformFile?,
33+
traceInd: Int,
34+
onNodeSelect: (WorkflowNode) -> Unit,
35+
) {
36+
var workflowNodes by remember { mutableStateOf<List<WorkflowNode>>(emptyList()) }
37+
var isLoading by remember { mutableStateOf(true) }
38+
39+
LaunchedEffect(file) {
40+
workflowNodes = fetchTrace(file)
41+
isLoading = false
42+
}
43+
44+
if (!isLoading) {
45+
DrawTree(workflowNodes[traceInd], onNodeSelect)
46+
}
47+
48+
// TODO: catch errors and display UI here
49+
}
2250

2351
/**
2452
* Since the workflow nodes present a tree structure, we utilize a recursive function to draw the tree
2553
* The Column holds a subtree of nodes, and the Row holds all the children of the current node
2654
*/
2755
@Composable
28-
public fun DrawWorkflowTree(
56+
private fun DrawTree(
2957
node: WorkflowNode,
3058
onNodeSelect: (WorkflowNode) -> Unit,
3159
modifier: Modifier = Modifier,
@@ -46,7 +74,7 @@ public fun DrawWorkflowTree(
4674
verticalAlignment = Alignment.Top
4775
) {
4876
node.children.forEach { childNode ->
49-
DrawWorkflowTree(childNode, onNodeSelect)
77+
DrawTree(childNode, onNodeSelect)
5078
}
5179
}
5280
}
@@ -60,13 +88,10 @@ private fun DrawNode(
6088
node: WorkflowNode,
6189
onNodeSelect: (WorkflowNode) -> Unit,
6290
) {
63-
var open by remember { mutableStateOf(false) }
6491
Box(
6592
modifier = Modifier
6693
.clickable {
67-
// open.value = !open.value
68-
69-
// selection will bubble back up to the main view to handle the selection
94+
// Selecting a node will bubble back up to the main view to handle the selection
7095
onNodeSelect(node)
7196
}
7297
.padding(10.dp)
Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,25 @@
11
package com.squareup.workflow1.traceviewer.utils
22

3-
import androidx.compose.material.Text
4-
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.LaunchedEffect
6-
import androidx.compose.runtime.mutableStateOf
7-
import androidx.compose.runtime.remember
83
import androidx.compose.ui.Modifier
4+
import com.squareup.moshi.JsonAdapter
95
import com.squareup.moshi.JsonDataException
106
import com.squareup.moshi.Moshi
7+
import com.squareup.moshi.Types
118
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
129
import com.squareup.workflow1.traceviewer.model.WorkflowNode
13-
import com.squareup.workflow1.traceviewer.ui.DrawWorkflowTree
1410
import io.github.vinceglb.filekit.PlatformFile
1511
import io.github.vinceglb.filekit.readString
1612
import java.io.IOException
1713

1814
/**
1915
* Parses the data from the given file and initiates the workflow tree
2016
*/
21-
@Composable
22-
public fun LoadWorkflowContent(
17+
public suspend fun fetchTrace(
2318
file: PlatformFile?,
24-
onNodeSelect: (WorkflowNode) -> Unit,
2519
modifier: Modifier = Modifier
26-
) {
27-
val jsonString = remember { mutableStateOf<String?>(null) }
28-
LaunchedEffect(file) {
29-
jsonString.value = file?.readString()
30-
}
31-
val root = jsonString.value?.let { fetchRoot(it) }
32-
33-
if (root != null) {
34-
DrawWorkflowTree(root, onNodeSelect)
35-
} else {
36-
Text("Empty data or failed to parse data") // TODO: proper handling of error
37-
}
20+
): List<WorkflowNode> {
21+
val jsonString = file?.readString()
22+
return jsonString?.let { parseTrace(it) } ?: emptyList()
3823
}
3924

4025
/**
@@ -43,15 +28,17 @@ public fun LoadWorkflowContent(
4328
* All the caught exceptions should be handled by the caller, and appropriate UI feedback should be
4429
* provided to user
4530
*/
46-
public fun fetchRoot(
31+
public fun parseTrace(
4732
json: String
48-
): WorkflowNode? {
33+
): List<WorkflowNode> {
4934
return try {
5035
val moshi = Moshi.Builder()
5136
.add(KotlinJsonAdapterFactory())
5237
.build()
53-
val workflowAdapter = moshi.adapter(WorkflowNode::class.java)
54-
val root = workflowAdapter.fromJson(json)
38+
39+
val workflowList = Types.newParameterizedType(List::class.java, WorkflowNode::class.java)
40+
val workflowAdapter: JsonAdapter<List<WorkflowNode>> = moshi.adapter(workflowList)
41+
val root = workflowAdapter.fromJson(json) ?: emptyList()
5542
root
5643
} catch (e: JsonDataException) {
5744
throw JsonDataException("Failed to parse JSON: ${e.message}", e)

workflow-trace-viewer/src/jvmMain/resources/workflow-20.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
[
12
{
23
"id": 1,
34
"name": "root",
@@ -102,4 +103,5 @@
102103
]
103104
}
104105
]
105-
}
106+
}
107+
]

workflow-trace-viewer/src/jvmMain/resources/workflow-300.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
[
12
{
23
"id": 1,
34
"name": "root",
@@ -2595,4 +2596,5 @@
25952596
]
25962597
}
25972598
]
2598-
}
2599+
}
2600+
]

0 commit comments

Comments
 (0)