diff --git a/apps/dashboard/src/components/data-table/user-table.tsx b/apps/dashboard/src/components/data-table/user-table.tsx
index 9b641b103..e6ac78a17 100644
--- a/apps/dashboard/src/components/data-table/user-table.tsx
+++ b/apps/dashboard/src/components/data-table/user-table.tsx
@@ -1,7 +1,7 @@
'use client';
import { ServerUser } from '@stackframe/stack';
import { standardProviders } from "@stackframe/stack-shared/dist/interface/clientInterface";
-import { jsonStringSchema } from "@stackframe/stack-shared/dist/schema-fields";
+import { jsonStringOrEmptySchema, jsonStringSchema } from "@stackframe/stack-shared/dist/schema-fields";
import { ColumnDef, Row, Table } from "@tanstack/react-table";
import { useMemo, useState } from "react";
import * as yup from "yup";
@@ -55,8 +55,8 @@ const userEditFormSchema = yup.object({
primaryEmail: yup.string().email("Primary Email must be a valid email address"),
signedUpAt: yup.date().required(),
primaryEmailVerified: yup.boolean().required(),
- clientMetadata: jsonStringSchema,
- serverMetadata: jsonStringSchema,
+ clientMetadata: jsonStringOrEmptySchema.default("null"),
+ serverMetadata: jsonStringOrEmptySchema.default("null"),
});
function EditUserDialog(props: {
@@ -69,8 +69,8 @@ function EditUserDialog(props: {
primaryEmail: props.user.primaryEmail || undefined,
primaryEmailVerified: props.user.primaryEmailVerified,
signedUpAt: props.user.signedUpAt,
- clientMetadata: props.user.clientMetadata ? JSON.stringify(props.user.clientMetadata) : undefined,
- serverMetadata: props.user.serverMetadata ? JSON.stringify(props.user.serverMetadata) : undefined,
+ clientMetadata: props.user.clientMetadata == null ? "" : JSON.stringify(props.user.clientMetadata, null, 2),
+ serverMetadata: props.user.serverMetadata == null ? "" : JSON.stringify(props.user.serverMetadata, null, 2),
};
return
-
-
+
+
>
)}
onSubmit={async (values) => { await props.user.update({
diff --git a/apps/dashboard/src/components/form-fields.tsx b/apps/dashboard/src/components/form-fields.tsx
index 7b978b45d..fef3e920a 100644
--- a/apps/dashboard/src/components/form-fields.tsx
+++ b/apps/dashboard/src/components/form-fields.tsx
@@ -32,6 +32,7 @@ export function TextAreaField(props: {
control: Control,
name: Path,
label: React.ReactNode,
+ monospace?: boolean,
}) {
return (
(props: {
rows={props.rows}
placeholder={props.placeholder}
value={field.value ?? ""}
+ style={{
+ fontFamily: props.monospace ? "ui-monospace, monospace" : undefined,
+ }}
/>
diff --git a/packages/stack-shared/src/schema-fields.ts b/packages/stack-shared/src/schema-fields.ts
index ed92690b7..ee214cad3 100644
--- a/packages/stack-shared/src/schema-fields.ts
+++ b/packages/stack-shared/src/schema-fields.ts
@@ -94,6 +94,15 @@ export const jsonStringSchema = yupString().test("json", "Invalid JSON format",
return false;
}
});
+export const jsonStringOrEmptySchema = yupString().test("json", "Invalid JSON format", (value) => {
+ if (!value) return true;
+ try {
+ JSON.parse(value);
+ return true;
+ } catch (error) {
+ return false;
+ }
+});
export const emailSchema = yupString().email();
// Request auth