From 30731aa2e41f5df72bb65d489c8d446847ee1dfa Mon Sep 17 00:00:00 2001
From: Kaito
Date: Sun, 17 May 2026 01:10:22 +0700
Subject: [PATCH] feat(settings): add company token copy action
---
.../settings/company-settings-form.tsx | 61 +++++++++++++++++--
1 file changed, 57 insertions(+), 4 deletions(-)
diff --git a/apps/web/app/dashboard/settings/company-settings-form.tsx b/apps/web/app/dashboard/settings/company-settings-form.tsx
index f76cfd4..a75f872 100644
--- a/apps/web/app/dashboard/settings/company-settings-form.tsx
+++ b/apps/web/app/dashboard/settings/company-settings-form.tsx
@@ -38,6 +38,7 @@ export function CompanySettingsForm({ company }: CompanySettingsFormProps) {
const router = useRouter()
const queryClient = useQueryClient()
const [deleteConfirmation, setDeleteConfirmation] = useState("")
+ const [copyStatus, setCopyStatus] = useState<"idle" | "copied" | "error">("idle")
const updateMutation = useMutation({
mutationFn: (payload: { name: string; description: string }) =>
updateCompanyAction(company.id, payload).then((result) => {
@@ -76,8 +77,37 @@ export function CompanySettingsForm({ company }: CompanySettingsFormProps) {
return result
}),
+ onSuccess: () => {
+ setCopyStatus("idle")
+ },
})
+ async function copyToken(token: string) {
+ try {
+ if (navigator.clipboard?.writeText) {
+ await navigator.clipboard.writeText(token)
+ } else {
+ const textArea = document.createElement("textarea")
+ textArea.value = token
+ textArea.setAttribute("readonly", "")
+ textArea.style.position = "fixed"
+ textArea.style.opacity = "0"
+ document.body.appendChild(textArea)
+ textArea.select()
+ const copied = document.execCommand("copy")
+ document.body.removeChild(textArea)
+
+ if (!copied) {
+ throw new Error("Copy command failed")
+ }
+ }
+
+ setCopyStatus("copied")
+ } catch {
+ setCopyStatus("error")
+ }
+ }
+
function updateCompany(formData: FormData) {
updateMutation.mutate({
name: String(formData.get("name") ?? ""),
@@ -130,10 +160,33 @@ export function CompanySettingsForm({ company }: CompanySettingsFormProps) {
{tokenMutation.data?.token ? (
-
- New company bearer token · copy now
-
-
{tokenMutation.data.token}
+
+
+
+ New company bearer token · copy now
+
+
{tokenMutation.data.token}
+
+
+
+ {copyStatus === "copied" ? (
+
+ Token copied to clipboard.
+
+ ) : null}
+ {copyStatus === "error" ? (
+
+ Could not copy automatically. Select and copy the token manually.
+
+ ) : null}
This token cannot be viewed again. Update `.openclaw/agentbridge/.env` or any other
external agent configuration that uses the old token.