) => void }) {
const { user } = useAuth()
const router = useRouter()
const { closeUnifiedSettings } = useUnifiedSettings()
const [name, setName] = useState('')
const [slug, setSlug] = useState('')
const [loading, setLoading] = useState(true)
- const [saving, setSaving] = useState(false)
const [showDeleteConfirm, setShowDeleteConfirm] = useState(false)
const [deleteText, setDeleteText] = useState('')
const [deleting, setDeleting] = useState(false)
+ const initialRef = useRef('')
+ const hasInitialized = useRef(false)
useEffect(() => {
if (!user?.org_id) return
@@ -28,23 +29,36 @@ export default function WorkspaceGeneralTab() {
.then(org => {
setName(org.name || '')
setSlug(org.slug || '')
+ if (!hasInitialized.current) {
+ initialRef.current = JSON.stringify({ name: org.name || '', slug: org.slug || '' })
+ hasInitialized.current = true
+ }
})
.catch(() => {})
.finally(() => setLoading(false))
}, [user?.org_id])
- const handleSave = async () => {
+ // Track dirty state
+ useEffect(() => {
+ if (!initialRef.current) return
+ onDirtyChange?.(JSON.stringify({ name, slug }) !== initialRef.current)
+ }, [name, slug, onDirtyChange])
+
+ const handleSave = useCallback(async () => {
if (!user?.org_id) return
- setSaving(true)
try {
await updateOrganization(user.org_id, name, slug)
+ initialRef.current = JSON.stringify({ name, slug })
+ onDirtyChange?.(false)
toast.success('Organization updated')
} catch (err) {
toast.error(getAuthErrorMessage(err as Error) || 'Failed to update organization')
- } finally {
- setSaving(false)
}
- }
+ }, [user?.org_id, name, slug, onDirtyChange])
+
+ useEffect(() => {
+ onRegisterSave?.(handleSave)
+ }, [handleSave, onRegisterSave])
const handleDelete = async () => {
if (!user?.org_id || deleteText !== 'DELETE') return
@@ -91,12 +105,6 @@ export default function WorkspaceGeneralTab() {
-
-
-
-
{/* Danger Zone */}
Danger Zone