diff --git a/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactDialog.kt b/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactDialog.kt
index c66906e7ae9096d63fbd4613fb542979ef4e8a06..2537cc8bca1550548ec86384157fe67d6e619bcc 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactDialog.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/contact/add/remote/AddContactDialog.kt
@@ -19,13 +19,52 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import org.briarproject.briar.desktop.utils.PreviewUtils.preview
 import org.briarproject.briar.desktop.viewmodel.viewModel
 
-@OptIn(ExperimentalMaterialApi::class)
+fun main() = preview(
+    "visible" to true,
+    "remote link" to "",
+    "local link" to "briar://ady23gvb2r76afe5zhxh5kvnh4b22zrcnxibn63tfknrdcwrw7zrs",
+    "alias" to "Alice",
+) {
+    if (getBooleanParameter("visible")) {
+        AddContactDialog(
+            onClose = { setBooleanParameter("visible", false) },
+            remoteHandshakeLink = getStringParameter("remote link"),
+            setRemoteHandshakeLink = { link -> setStringParameter("remote link", link) },
+            alias = getStringParameter("alias"),
+            setAddContactAlias = { alias -> setStringParameter("alias", alias) },
+            handshakeLink = getStringParameter("local link"),
+            onSubmitAddContactDialog = {}
+        )
+    }
+}
+
 @Composable
 fun AddContactDialog(
     onClose: () -> Unit,
     viewModel: AddContactViewModel = viewModel(),
+) = AddContactDialog(
+    onClose = onClose,
+    viewModel.remoteHandshakeLink.value,
+    viewModel::setRemoteHandshakeLink,
+    viewModel.alias.value,
+    viewModel::setAddContactAlias,
+    viewModel.handshakeLink.value,
+    viewModel::onSubmitAddContactDialog,
+)
+
+@OptIn(ExperimentalMaterialApi::class)
+@Composable
+fun AddContactDialog(
+    onClose: () -> Unit,
+    remoteHandshakeLink: String,
+    setRemoteHandshakeLink: (String) -> Unit,
+    alias: String,
+    setAddContactAlias: (String) -> Unit,
+    handshakeLink: String,
+    onSubmitAddContactDialog: () -> Unit,
 ) {
     AlertDialog(
         onDismissRequest = onClose,
@@ -44,8 +83,8 @@ fun AddContactDialog(
                         Modifier.width(128.dp).align(Alignment.CenterVertically),
                     )
                     TextField(
-                        viewModel.remoteHandshakeLink.value,
-                        viewModel::setRemoteHandshakeLink,
+                        remoteHandshakeLink,
+                        setRemoteHandshakeLink,
                         modifier = Modifier.fillMaxWidth()
                     )
                 }
@@ -55,8 +94,8 @@ fun AddContactDialog(
                         Modifier.width(128.dp).align(Alignment.CenterVertically),
                     )
                     TextField(
-                        viewModel.alias.value,
-                        viewModel::setAddContactAlias,
+                        alias,
+                        setAddContactAlias,
                         modifier = Modifier.fillMaxWidth()
                     )
                 }
@@ -66,7 +105,7 @@ fun AddContactDialog(
                         modifier = Modifier.width(128.dp).align(Alignment.CenterVertically),
                     )
                     TextField(
-                        viewModel.handshakeLink.value,
+                        handshakeLink,
                         onValueChange = {},
                         modifier = Modifier.fillMaxWidth()
                     )
@@ -74,7 +113,7 @@ fun AddContactDialog(
             }
         },
         confirmButton = {
-            Button(onClick = { viewModel.onSubmitAddContactDialog(); onClose() }) {
+            Button(onClick = { onSubmitAddContactDialog(); onClose() }) {
                 Text("Add")
             }
         },
diff --git a/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewUtils.kt b/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewUtils.kt
index d03fd2bc25692a112236c9fbbf7efd4ea3ca0723..2af666641ee99b47d5684ad439af973ad828128e 100644
--- a/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewUtils.kt
+++ b/src/main/kotlin/org/briarproject/briar/desktop/utils/PreviewUtils.kt
@@ -34,7 +34,7 @@ object PreviewUtils {
     class PreviewScope {
         private val random = Random(0)
 
-        val parameters = mutableMapOf<String, State<Any>>()
+        val parameters = mutableMapOf<String, MutableState<Any>>()
 
         private inline fun <reified T> getDatatype(name: String): T {
             val state = parameters[name] ?: throw IllegalArgumentException("No parameter found with name '$name'")
@@ -42,14 +42,28 @@ object PreviewUtils {
             return state.value as T
         }
 
+        private inline fun <reified T> setDatatype(name: String, value: T) {
+            val state = parameters[name] ?: throw IllegalArgumentException("No parameter found with name '$name'")
+            if (state.value !is T) throw IllegalArgumentException("Parameter '$name' is not of type ${T::class.simpleName}")
+            state.value = value!!
+        }
+
         fun getStringParameter(name: String) = getDatatype<String>(name)
 
+        fun setStringParameter(name: String, value: String) = setDatatype(name, value)
+
         fun getBooleanParameter(name: String) = getDatatype<Boolean>(name)
 
+        fun setBooleanParameter(name: String, value: Boolean) = setDatatype(name, value)
+
         fun getIntParameter(name: String) = getDatatype<Int>(name)
 
+        fun setIntParameter(name: String, value: Int) = setDatatype(name, value)
+
         fun getLongParameter(name: String) = getDatatype<Long>(name)
 
+        fun setLongParameter(name: String, value: Long) = setDatatype(name, value)
+
         @Composable
         fun getRandomId() =
             remember { random.nextBytes(UniqueId.LENGTH) }
@@ -68,7 +82,7 @@ object PreviewUtils {
             editField(value)
         }
 
-        parameters[name] = value
+        parameters[name] = value as MutableState<Any>
     }
 
     @Composable