앱 위젯추가 팝업 수정

This commit is contained in:
Macbook
2026-06-15 16:30:44 +09:00
parent 1eaecbb586
commit 63a40c9c75
4 changed files with 223 additions and 50 deletions
@@ -24,8 +24,8 @@ interface Props {
onUpdateGridFr: (rowFr: number[], colFr: number[]) => void;
/** Tauri OS 창 — 네이티브 타이틀·리사이즈 사용, 내부 플로팅 크롬 숨김 */
nativeShell?: boolean;
/** 위젯 선택 팝업 열림/닫힘 (네이티브 창 크기 조절) */
onPickerOpenChange?: (open: boolean) => void;
/** 위젯 선택 팝업 열림/닫힘 (네이티브 창 크기 조절 — 완료 후 picker 표시) */
onPickerOpenChange?: (open: boolean) => void | Promise<void>;
}
const FloatingWidgetWindow: React.FC<Props> = ({
@@ -40,16 +40,29 @@ const FloatingWidgetWindow: React.FC<Props> = ({
onPickerOpenChange,
}) => {
const [pickSlotId, setPickSlotId] = useState<string | null>(null);
const [pickerOpening, setPickerOpening] = useState(false);
const openPicker = useCallback((slotId: string) => {
const openPicker = useCallback(async (slotId: string) => {
if (nativeShell && onPickerOpenChange) {
setPickerOpening(true);
try {
await onPickerOpenChange(true);
await new Promise<void>(resolve => {
requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
});
} finally {
setPickerOpening(false);
}
}
setPickSlotId(slotId);
onPickerOpenChange?.(true);
}, [onPickerOpenChange]);
}, [nativeShell, onPickerOpenChange]);
const closePicker = useCallback(() => {
const closePicker = useCallback(async () => {
setPickSlotId(null);
onPickerOpenChange?.(false);
}, [onPickerOpenChange]);
if (nativeShell && onPickerOpenChange) {
await onPickerOpenChange(false);
}
}, [nativeShell, onPickerOpenChange]);
const bodyWrapRef = useRef<HTMLDivElement>(null);
const bodyRef = useRef<HTMLDivElement>(null);
const [bodySize, setBodySize] = useState({ width: 0, height: 0 });
@@ -143,8 +156,7 @@ const FloatingWidgetWindow: React.FC<Props> = ({
const applyWidgetType = useCallback((widgetType: string) => {
if (!pickSlotId) return;
updateSlot(pickSlotId, s => ({ ...s, widgetType, config: {} }));
closePicker();
}, [pickSlotId, updateSlot, closePicker]);
}, [pickSlotId, updateSlot]);
const clearWidget = useCallback((slotId: string) => {
updateSlot(slotId, s => ({ ...s, widgetType: null, config: {} }));
@@ -246,7 +258,7 @@ const FloatingWidgetWindow: React.FC<Props> = ({
<WidgetSlotView
slot={slot}
zoneId="center"
onPickWidget={openPicker}
onPickWidget={id => { void openPicker(id); }}
onClearWidget={id => clearWidget(id)}
/>
</div>
@@ -301,13 +313,18 @@ const FloatingWidgetWindow: React.FC<Props> = ({
)}
</div>
<WidgetPickerModal
open={pickSlotId != null}
category="all"
nativeCompact={nativeShell}
onClose={closePicker}
onSelect={applyWidgetType}
/>
{(pickerOpening || pickSlotId != null) && (
<WidgetPickerModal
open={pickSlotId != null}
category="all"
nativeCompact={nativeShell}
onClose={() => { void closePicker(); }}
onSelect={applyWidgetType}
/>
)}
{pickerOpening && pickSlotId == null && nativeShell && (
<div className="wd-picker-native-loading" aria-live="polite"> </div>
)}
</>
);