fix(desktop): Windows 위젯 추가 팝업 즉시 표시
창 크기 조절 완료를 기다리지 않고 picker를 먼저 열고, body portal· resize 타임아웃으로 WebView2에서 팝업이 뜨지 않던 문제를 해결합니다. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+32
-26
@@ -139,33 +139,39 @@ const WidgetApp: React.FC = () => {
|
||||
|
||||
const handlePickerOpenChange = useCallback(async (open: boolean): Promise<void> => {
|
||||
const win = getCurrentWindow();
|
||||
if (open) {
|
||||
const size = await win.innerSize();
|
||||
sizeBeforePickerRef.current = { width: size.width, height: size.height };
|
||||
const maxW = Math.max(480, window.screen.availWidth - 48);
|
||||
const maxH = Math.max(520, window.screen.availHeight - 48);
|
||||
const w = Math.min(NATIVE_WIDGET_PICKER_WINDOW.width, maxW);
|
||||
const h = Math.min(NATIVE_WIDGET_PICKER_WINDOW.height, maxH);
|
||||
await win.setSize(new LogicalSize(w, h));
|
||||
await win.center();
|
||||
await new Promise<void>(resolve => {
|
||||
let settled = false;
|
||||
const finish = () => {
|
||||
if (settled) return;
|
||||
settled = true;
|
||||
unlisten?.();
|
||||
resolve();
|
||||
};
|
||||
let unlisten: (() => void) | undefined;
|
||||
void win.onResized(finish).then(fn => { unlisten = fn; });
|
||||
window.setTimeout(finish, 150);
|
||||
});
|
||||
return;
|
||||
try {
|
||||
if (open) {
|
||||
const size = await win.innerSize();
|
||||
sizeBeforePickerRef.current = { width: size.width, height: size.height };
|
||||
const maxW = Math.max(480, window.screen.availWidth - 48);
|
||||
const maxH = Math.max(520, window.screen.availHeight - 48);
|
||||
const w = Math.min(NATIVE_WIDGET_PICKER_WINDOW.width, maxW);
|
||||
const h = Math.min(NATIVE_WIDGET_PICKER_WINDOW.height, maxH);
|
||||
await win.setSize(new LogicalSize(w, h));
|
||||
await win.center();
|
||||
await Promise.race([
|
||||
new Promise<void>(resolve => {
|
||||
let settled = false;
|
||||
const finish = () => {
|
||||
if (settled) return;
|
||||
settled = true;
|
||||
unlisten?.();
|
||||
resolve();
|
||||
};
|
||||
let unlisten: (() => void) | undefined;
|
||||
void win.onResized(finish).then(fn => { unlisten = fn; });
|
||||
}),
|
||||
new Promise<void>(resolve => { window.setTimeout(resolve, 400); }),
|
||||
]);
|
||||
return;
|
||||
}
|
||||
const prev = sizeBeforePickerRef.current;
|
||||
if (!prev) return;
|
||||
sizeBeforePickerRef.current = null;
|
||||
await win.setSize(new LogicalSize(prev.width, prev.height));
|
||||
} catch (err) {
|
||||
console.warn('[widget-main] picker window resize failed', err);
|
||||
}
|
||||
const prev = sizeBeforePickerRef.current;
|
||||
if (!prev) return;
|
||||
sizeBeforePickerRef.current = null;
|
||||
await win.setSize(new LogicalSize(prev.width, prev.height));
|
||||
}, []);
|
||||
|
||||
if (!instance) {
|
||||
|
||||
Reference in New Issue
Block a user