From 7ae250dd4c3530b84b1b7a4ac85d41f9beaa614d Mon Sep 17 00:00:00 2001 From: vimtor Date: Thu, 14 May 2026 16:59:27 +0200 Subject: [PATCH] replace custom modal with kobalte and prevent scroll jump --- .../console/app/src/component/go-referral.tsx | 24 +++++++++++-- packages/console/app/src/component/modal.tsx | 36 ++++++++++++++----- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/packages/console/app/src/component/go-referral.tsx b/packages/console/app/src/component/go-referral.tsx index b4b12bc90c..632ae85a36 100644 --- a/packages/console/app/src/component/go-referral.tsx +++ b/packages/console/app/src/component/go-referral.tsx @@ -1,5 +1,5 @@ -import { action, createAsync, json, query, useAction, useSubmission } from "@solidjs/router" -import { createMemo, createSignal, For, Show } from "solid-js" +import { action, json, query, useAction, useSubmission } from "@solidjs/router" +import { createEffect, createMemo, createSignal, For, onCleanup, Show } from "solid-js" import { getRequestEvent } from "solid-js/web" import { Referral } from "@opencode-ai/console-core/referral.js" import { Database, and, eq, isNull } from "@opencode-ai/console-core/drizzle/index.js" @@ -212,9 +212,27 @@ export function GoReferralSection(props: { workspaceID: string; summary: GoRefer const apply = useAction(applyGoReferralReward) const submission = useSubmission(applyGoReferralReward) const [selected, setSelected] = createSignal() - const preview = createAsync(() => queryGoReferralUsagePreview(props.workspaceID, selected()?.id)) + const [preview, setPreview] = createSignal() const appliedCount = createMemo(() => props.summary.rewards.filter((reward) => reward.timeApplied).length) + createEffect(() => { + const reward = selected() + if (!reward) { + setPreview(undefined) + return + } + + const request = { cancelled: false } + setPreview(undefined) + queryGoReferralUsagePreview(props.workspaceID, reward.id).then((result) => { + if (request.cancelled) return + setPreview(result) + }) + onCleanup(() => { + request.cancelled = true + }) + }) + async function onApply() { const reward = selected() if (!reward) return diff --git a/packages/console/app/src/component/modal.tsx b/packages/console/app/src/component/modal.tsx index d6dc8a3de5..37325a6f3a 100644 --- a/packages/console/app/src/component/modal.tsx +++ b/packages/console/app/src/component/modal.tsx @@ -1,3 +1,4 @@ +import { Dialog as Kobalte } from "@kobalte/core/dialog" import { JSX, Show } from "solid-js" import "./modal.css" @@ -11,14 +12,33 @@ interface ModalProps { export function Modal(props: ModalProps) { return ( -
-
e.stopPropagation()}> - -

{props.title}

-
- {props.children} -
-
+ { + if (!open) props.onClose() + }} + > + + + e.stopPropagation()} + onOpenAutoFocus={(e) => { + e.preventDefault() + const target = e.currentTarget as HTMLElement | null + target?.focus({ preventScroll: true }) + }} + > + + {props.title} + + {props.children} + + + +
) }