@impakers/debug 1.4.3 → 1.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.js CHANGED
@@ -1484,15 +1484,20 @@ function probeComponentSource(fiber) {
1484
1484
  return result;
1485
1485
  }
1486
1486
  function probeSourceWalk(fiber, maxDepth = 15) {
1487
+ const results = [];
1488
+ const seenFileNames = /* @__PURE__ */ new Set();
1487
1489
  let current = fiber;
1488
1490
  let depth = 0;
1489
1491
  while (current && depth < maxDepth) {
1490
1492
  const source = probeComponentSource(current);
1491
- if (source) return source;
1493
+ if (source && !seenFileNames.has(source.fileName)) {
1494
+ seenFileNames.add(source.fileName);
1495
+ results.push(source);
1496
+ }
1492
1497
  current = current.return;
1493
1498
  depth++;
1494
1499
  }
1495
- return null;
1500
+ return results;
1496
1501
  }
1497
1502
  function getSourceLocation(element) {
1498
1503
  const fiber = getFiberFromElement2(element);
@@ -1521,9 +1526,15 @@ function getSourceLocation(element) {
1521
1526
  isProduction: false
1522
1527
  };
1523
1528
  }
1524
- const probed = probeSourceWalk(fiber);
1525
- if (probed) {
1526
- return { found: true, source: probed, isReactApp: true, isProduction: false };
1529
+ const probedList = probeSourceWalk(fiber);
1530
+ if (probedList.length > 0) {
1531
+ return {
1532
+ found: true,
1533
+ source: probedList[0],
1534
+ sourceCandidates: probedList,
1535
+ isReactApp: true,
1536
+ isProduction: false
1537
+ };
1527
1538
  }
1528
1539
  return {
1529
1540
  found: false,
@@ -1557,6 +1568,89 @@ function findNearestComponentSource(element, maxAncestors = 10) {
1557
1568
  return getSourceLocation(element);
1558
1569
  }
1559
1570
 
1571
+ // src/utils/capture-element.ts
1572
+ async function captureElement(el, options = {}) {
1573
+ const { quality = 0.7, maxScale = 2 } = options;
1574
+ const rect = el.getBoundingClientRect();
1575
+ const scale = Math.min(window.devicePixelRatio, maxScale);
1576
+ const canvas = document.createElement("canvas");
1577
+ canvas.width = rect.width * scale;
1578
+ canvas.height = rect.height * scale;
1579
+ const ctx = canvas.getContext("2d");
1580
+ ctx.scale(scale, scale);
1581
+ const clone = el.cloneNode(true);
1582
+ inlineComputedStyles(el, clone);
1583
+ clone.style.margin = "0";
1584
+ clone.style.position = "static";
1585
+ const serializer = new XMLSerializer();
1586
+ const html = serializer.serializeToString(clone);
1587
+ const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${rect.width}" height="${rect.height}">
1588
+ <foreignObject width="100%" height="100%">
1589
+ <div xmlns="http://www.w3.org/1999/xhtml" style="width:${rect.width}px;height:${rect.height}px;overflow:hidden">${html}</div>
1590
+ </foreignObject>
1591
+ </svg>`;
1592
+ const blob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
1593
+ const url = URL.createObjectURL(blob);
1594
+ try {
1595
+ const img = await loadImage(url);
1596
+ ctx.drawImage(img, 0, 0, rect.width, rect.height);
1597
+ return canvas.toDataURL("image/jpeg", quality);
1598
+ } finally {
1599
+ URL.revokeObjectURL(url);
1600
+ }
1601
+ }
1602
+ async function captureFullPage(options = {}) {
1603
+ const { quality = 0.5, hideSelectors = [] } = options;
1604
+ const defaultSelectors = ["[data-impakers-debug]", "[data-annotation-popup]", "[data-annotation-marker]"];
1605
+ const allSelectors = [...defaultSelectors, ...hideSelectors];
1606
+ const hiddenEls = document.querySelectorAll(allSelectors.join(", "));
1607
+ try {
1608
+ hiddenEls.forEach((el) => el.style.visibility = "hidden");
1609
+ const html2canvas = (await import("html2canvas")).default;
1610
+ const canvas = await html2canvas(document.body, {
1611
+ useCORS: true,
1612
+ allowTaint: true,
1613
+ scale: 1,
1614
+ logging: false,
1615
+ width: window.innerWidth,
1616
+ height: window.innerHeight,
1617
+ onclone: (clonedDoc) => {
1618
+ const unsupported = /oklab|oklch|color-mix/i;
1619
+ clonedDoc.querySelectorAll("style").forEach((styleEl) => {
1620
+ if (unsupported.test(styleEl.textContent || "")) {
1621
+ styleEl.textContent = (styleEl.textContent || "").replace(
1622
+ /[^{};\n]+:\s*[^;{}]*(?:oklab|oklch|color-mix|lch|lab)\([^)]*(?:\([^)]*\))*[^)]*\)[^;{}]*/gi,
1623
+ ""
1624
+ );
1625
+ }
1626
+ });
1627
+ }
1628
+ });
1629
+ return canvas.toDataURL("image/jpeg", quality);
1630
+ } catch {
1631
+ return void 0;
1632
+ } finally {
1633
+ hiddenEls.forEach((el) => el.style.visibility = "");
1634
+ }
1635
+ }
1636
+ function loadImage(src) {
1637
+ return new Promise((resolve, reject) => {
1638
+ const img = new Image();
1639
+ img.onload = () => resolve(img);
1640
+ img.onerror = () => reject(new Error("\uC774\uBBF8\uC9C0 \uB85C\uB4DC \uC2E4\uD328"));
1641
+ img.src = src;
1642
+ });
1643
+ }
1644
+ function inlineComputedStyles(src, dst) {
1645
+ const cs = window.getComputedStyle(src);
1646
+ dst.style.cssText = cs.cssText;
1647
+ const srcChildren = src.children;
1648
+ const dstChildren = dst.children;
1649
+ for (let i = 0; i < srcChildren.length && i < dstChildren.length; i++) {
1650
+ inlineComputedStyles(srcChildren[i], dstChildren[i]);
1651
+ }
1652
+ }
1653
+
1560
1654
  // src/core/collector.ts
1561
1655
  var MAX_ERRORS = 20;
1562
1656
  var MAX_LOGS = 50;
@@ -2087,23 +2181,6 @@ async function uploadFile(endpoint, file, context, taskId) {
2087
2181
  }
2088
2182
  return res.json();
2089
2183
  }
2090
- async function updateTaskStatus(endpoint, taskId, status) {
2091
- const snapshots = snapshotCaches("feedbacks:");
2092
- mutateMatchingCaches(
2093
- "feedbacks:",
2094
- (items) => items.map((item) => item.id === taskId ? { ...item, status } : item)
2095
- );
2096
- try {
2097
- await apiFetch(`${endpoint}/${taskId}/status`, {
2098
- method: "PATCH",
2099
- body: JSON.stringify({ status })
2100
- });
2101
- revalidateCachedFeedbackLists(endpoint);
2102
- } catch (error) {
2103
- restoreSnapshots(snapshots);
2104
- throw error;
2105
- }
2106
- }
2107
2184
 
2108
2185
  // src/core/sourcemap-resolver.ts
2109
2186
  var import_trace_mapping = require("@jridgewell/trace-mapping");
@@ -2214,6 +2291,7 @@ var styles_module_default2 = classNames2;
2214
2291
 
2215
2292
  // src/components/annotation-marker/index.tsx
2216
2293
  var import_jsx_runtime3 = require("react/jsx-runtime");
2294
+ var IN_PROGRESS_MARKER_COLOR = "#3b82f6";
2217
2295
  var DONE_MARKER_COLOR = "#9ca3af";
2218
2296
  function AnnotationMarker({
2219
2297
  annotation,
@@ -2227,7 +2305,8 @@ function AnnotationMarker({
2227
2305
  }) {
2228
2306
  const animClass = !isAnimated ? styles_module_default2.enter : "";
2229
2307
  const isDone = annotation.status === "done" || annotation.status === "resolved";
2230
- const markerColor = isDone ? DONE_MARKER_COLOR : accentColor;
2308
+ const isInProgress = annotation.status === "in_progress";
2309
+ const markerColor = isDone ? DONE_MARKER_COLOR : isInProgress ? IN_PROGRESS_MARKER_COLOR : accentColor;
2231
2310
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
2232
2311
  "div",
2233
2312
  {
@@ -2330,8 +2409,7 @@ function CommentThread({
2330
2409
  top,
2331
2410
  bottom,
2332
2411
  onClose,
2333
- onReply,
2334
- onResolve
2412
+ onReply
2335
2413
  }) {
2336
2414
  const [replyText, setReplyText] = (0, import_react3.useState)("");
2337
2415
  const [exiting, setExiting] = (0, import_react3.useState)(false);
@@ -2425,14 +2503,7 @@ function CommentThread({
2425
2503
  cleanup();
2426
2504
  if (!targetEl) return;
2427
2505
  try {
2428
- const html2canvas = (await import("html2canvas")).default;
2429
- const canvas = await html2canvas(targetEl, {
2430
- useCORS: true,
2431
- allowTaint: true,
2432
- scale: Math.min(window.devicePixelRatio, 2),
2433
- logging: false
2434
- });
2435
- const base64 = canvas.toDataURL("image/jpeg", 0.7);
2506
+ const base64 = await captureElement(targetEl);
2436
2507
  setPendingImage(base64);
2437
2508
  } catch (err) {
2438
2509
  console.error("[@impakers/debug] DOM \uC2A4\uD06C\uB9B0\uC0F7 \uC2E4\uD328:", err);
@@ -2493,10 +2564,7 @@ function CommentThread({
2493
2564
  ] }),
2494
2565
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: styles_module_default3.title, children: feedbackTitle })
2495
2566
  ] }),
2496
- /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("div", { className: styles_module_default3.headerActions, children: [
2497
- onResolve && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { className: styles_module_default3.headerAction, onClick: () => onResolve(task.id), title: "\uC644\uB8CC \uCC98\uB9AC", type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("polyline", { points: "20 6 9 17 4 12" }) }) }),
2498
- /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { className: styles_module_default3.headerAction, onClick: handleClose, title: "\uB2EB\uAE30", type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) }) })
2499
- ] })
2567
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: styles_module_default3.headerActions, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("button", { className: styles_module_default3.headerAction, onClick: handleClose, title: "\uB2EB\uAE30", type: "button", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("path", { d: "M18 6L6 18M6 6l12 12" }) }) }) })
2500
2568
  ] }),
2501
2569
  task.comments.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
2502
2570
  /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: styles_module_default3.divider }),
@@ -2920,11 +2988,10 @@ function InboxPanel({
2920
2988
  endpoint,
2921
2989
  currentUserName,
2922
2990
  currentUserId,
2923
- onClose,
2924
- onStatusChange
2991
+ onClose
2925
2992
  }) {
2926
2993
  const [tab, setTab] = (0, import_react5.useState)("page");
2927
- const [statusFilter, setStatusFilter] = (0, import_react5.useState)("open");
2994
+ const [statusFilter, setStatusFilter] = (0, import_react5.useState)("todo");
2928
2995
  const [exiting, setExiting] = (0, import_react5.useState)(false);
2929
2996
  const [selectedItem, setSelectedItem] = (0, import_react5.useState)(null);
2930
2997
  const [comments, setComments] = (0, import_react5.useState)([]);
@@ -2999,17 +3066,11 @@ function InboxPanel({
2999
3066
  }
3000
3067
  if (e.key === "Escape") handleClose();
3001
3068
  }, [handleSendReply, handleClose]);
3002
- const handleToggleStatus = (0, import_react5.useCallback)((item, e) => {
3003
- e.stopPropagation();
3004
- const newStatus = item.status === "done" ? "todo" : "done";
3005
- onStatusChange?.(item.id, newStatus);
3006
- }, [onStatusChange]);
3007
3069
  const rawItems = tab === "page" ? pageItems : allItems;
3008
- const items = rawItems.filter(
3009
- (item) => statusFilter === "resolved" ? item.status === "done" : item.status !== "done"
3010
- );
3011
- const openCount = rawItems.filter((item) => item.status !== "done").length;
3012
- const resolvedCount = rawItems.filter((item) => item.status === "done").length;
3070
+ const items = rawItems.filter((item) => item.status === statusFilter);
3071
+ const todoCount = rawItems.filter((item) => item.status === "todo").length;
3072
+ const inProgressCount = rawItems.filter((item) => item.status === "in_progress").length;
3073
+ const doneCount = rawItems.filter((item) => item.status === "done").length;
3013
3074
  if (typeof document === "undefined") return null;
3014
3075
  return (0, import_react_dom.createPortal)(
3015
3076
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { "data-impakers-debug": "", children: [
@@ -3132,24 +3193,36 @@ function InboxPanel({
3132
3193
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3133
3194
  "button",
3134
3195
  {
3135
- className: `${styles_module_default5.filterChip} ${statusFilter === "open" ? styles_module_default5.active : ""}`,
3136
- onClick: () => setStatusFilter("open"),
3196
+ className: `${styles_module_default5.filterChip} ${statusFilter === "todo" ? styles_module_default5.active : ""}`,
3197
+ onClick: () => setStatusFilter("todo"),
3198
+ type: "button",
3199
+ children: [
3200
+ "\uC9C4\uD589\uC804",
3201
+ todoCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.filterCount, children: todoCount })
3202
+ ]
3203
+ }
3204
+ ),
3205
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3206
+ "button",
3207
+ {
3208
+ className: `${styles_module_default5.filterChip} ${statusFilter === "in_progress" ? styles_module_default5.active : ""}`,
3209
+ onClick: () => setStatusFilter("in_progress"),
3137
3210
  type: "button",
3138
3211
  children: [
3139
- "Open",
3140
- openCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.filterCount, children: openCount })
3212
+ "\uC9C4\uD589\uC911",
3213
+ inProgressCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.filterCount, children: inProgressCount })
3141
3214
  ]
3142
3215
  }
3143
3216
  ),
3144
3217
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
3145
3218
  "button",
3146
3219
  {
3147
- className: `${styles_module_default5.filterChip} ${statusFilter === "resolved" ? styles_module_default5.active : ""}`,
3148
- onClick: () => setStatusFilter("resolved"),
3220
+ className: `${styles_module_default5.filterChip} ${statusFilter === "done" ? styles_module_default5.active : ""}`,
3221
+ onClick: () => setStatusFilter("done"),
3149
3222
  type: "button",
3150
3223
  children: [
3151
- "Resolved",
3152
- resolvedCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.filterCount, children: resolvedCount })
3224
+ "\uC644\uB8CC",
3225
+ doneCount > 0 && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.filterCount, children: doneCount })
3153
3226
  ]
3154
3227
  }
3155
3228
  )
@@ -3163,17 +3236,7 @@ function InboxPanel({
3163
3236
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: styles_module_default5.cardInfo, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: styles_module_default5.cardMeta, children: [
3164
3237
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.cardAuthor, children: item.authorName }),
3165
3238
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: styles_module_default5.cardTime, children: timeAgo2(item.createdAt) })
3166
- ] }) }),
3167
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
3168
- "button",
3169
- {
3170
- className: `${styles_module_default5.checkBtn} ${item.status === "done" ? styles_module_default5.checked : ""}`,
3171
- onClick: (e) => handleToggleStatus(item, e),
3172
- type: "button",
3173
- title: item.status === "done" ? "\uBBF8\uC644\uB8CC\uB85C \uBCC0\uACBD" : "\uC644\uB8CC \uCC98\uB9AC",
3174
- children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("polyline", { points: "20 6 9 17 4 12" }) })
3175
- }
3176
- )
3239
+ ] }) })
3177
3240
  ] }),
3178
3241
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: styles_module_default5.cardTitle, children: item.title.replace(/^\[피드백\]\s*/, "") }),
3179
3242
  item.screenshot && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { className: styles_module_default5.cardScreenshot, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { src: item.screenshot, alt: "screenshot" }) }),
@@ -3359,6 +3422,17 @@ function detectSourceFile(element) {
3359
3422
  }
3360
3423
  return void 0;
3361
3424
  }
3425
+ function detectSourceFileCandidates(element) {
3426
+ const result = getSourceLocation(element);
3427
+ const loc = result.found ? result : findNearestComponentSource(element);
3428
+ if (loc.found && loc.sourceCandidates && loc.sourceCandidates.length > 0) {
3429
+ return loc.sourceCandidates.map((s) => formatSourceLocation(s, "path"));
3430
+ }
3431
+ if (loc.found && loc.source) {
3432
+ return [formatSourceLocation(loc.source, "path")];
3433
+ }
3434
+ return [];
3435
+ }
3362
3436
  var STORAGE_PREFIX = "impakers-debug-markers-";
3363
3437
  function getRouteKey() {
3364
3438
  return STORAGE_PREFIX + window.location.pathname;
@@ -3631,20 +3705,27 @@ function DebugWidget({ endpoint, getUser, onHide }) {
3631
3705
  targetElement: elementUnder
3632
3706
  });
3633
3707
  setHoverInfo(null);
3634
- const rawSource = detectSourceFile(elementUnder);
3635
- if (rawSource?.includes("/chunks/")) {
3636
- resolveSourceString(rawSource).then((resolved) => {
3637
- if (resolved) {
3638
- setPendingAnnotation(
3639
- (prev) => prev ? {
3640
- ...prev,
3641
- resolvedSource: `${resolved.source}:${resolved.line}`,
3642
- resolvedName: resolved.name ?? void 0
3643
- } : prev
3644
- );
3708
+ const candidates = detectSourceFileCandidates(elementUnder);
3709
+ const chunkCandidates = candidates.filter((c) => c.includes("/chunks/"));
3710
+ if (chunkCandidates.length > 0) {
3711
+ (async () => {
3712
+ for (const candidate of chunkCandidates) {
3713
+ try {
3714
+ const resolved = await resolveSourceString(candidate);
3715
+ if (resolved) {
3716
+ setPendingAnnotation(
3717
+ (prev) => prev ? {
3718
+ ...prev,
3719
+ resolvedSource: `${resolved.source}:${resolved.line}`,
3720
+ resolvedName: resolved.name ?? void 0
3721
+ } : prev
3722
+ );
3723
+ break;
3724
+ }
3725
+ } catch {
3726
+ }
3645
3727
  }
3646
- }).catch(() => {
3647
- });
3728
+ })();
3648
3729
  }
3649
3730
  };
3650
3731
  document.addEventListener("click", handleClick, true);
@@ -3660,28 +3741,10 @@ function DebugWidget({ endpoint, getUser, onHide }) {
3660
3741
  setSubmitting(true);
3661
3742
  try {
3662
3743
  const metadata = collectMetadata(getUser);
3663
- let screenshot;
3664
- const debugEls = document.querySelectorAll("[data-impakers-debug], [data-annotation-popup], [data-annotation-marker]");
3665
- try {
3666
- debugEls.forEach((el) => el.style.visibility = "hidden");
3667
- const html2canvas = (await import("html2canvas")).default;
3668
- const canvas = await html2canvas(document.body, {
3669
- useCORS: true,
3670
- allowTaint: true,
3671
- scale: 1,
3672
- // 1x로 줄여서 용량 절약
3673
- logging: false,
3674
- width: window.innerWidth,
3675
- height: window.innerHeight
3676
- });
3677
- screenshot = canvas.toDataURL("image/jpeg", 0.5);
3678
- } catch {
3679
- } finally {
3680
- debugEls.forEach((el) => el.style.visibility = "");
3681
- }
3682
- let resolvedSource = pendingAnnotation.sourceFile || "";
3683
- let resolvedName = null;
3684
- if (pendingAnnotation.sourceFile?.includes("/chunks/")) {
3744
+ const screenshot = await captureFullPage();
3745
+ let resolvedSource = pendingAnnotation.resolvedSource || pendingAnnotation.sourceFile || "";
3746
+ let resolvedName = pendingAnnotation.resolvedName || null;
3747
+ if (!pendingAnnotation.resolvedSource && pendingAnnotation.sourceFile?.includes("/chunks/")) {
3685
3748
  try {
3686
3749
  const resolved = await resolveSourceString(pendingAnnotation.sourceFile);
3687
3750
  if (resolved) {
@@ -3751,7 +3814,8 @@ ${elementInfo.join("\n")}`);
3751
3814
  isFixed: pendingAnnotation.isFixed || false,
3752
3815
  element: pendingAnnotation.element,
3753
3816
  boundingBox: pendingAnnotation.boundingBox
3754
- }
3817
+ },
3818
+ authorName: getUser?.()?.name ? String(getUser().name) : void 0
3755
3819
  });
3756
3820
  setShowToast(true);
3757
3821
  originalSetTimeout(() => setShowToast(false), 3e3);
@@ -3920,7 +3984,7 @@ ${elementInfo.join("\n")}`);
3920
3984
  title: task.title || "\uD53C\uB4DC\uBC31",
3921
3985
  status: task.status,
3922
3986
  priority: task.priority,
3923
- authorName: getUser?.()?.name ? String(getUser().name) : "\uC775\uBA85",
3987
+ authorName: task.authorName || "\uC775\uBA85",
3924
3988
  feedbackUrl: task.feedbackUrl || currentPath,
3925
3989
  createdAt: task.createdAt,
3926
3990
  commentCount: task.commentCount || 0
@@ -3972,14 +4036,7 @@ ${elementInfo.join("\n")}`);
3972
4036
  endpoint,
3973
4037
  currentUserName: getUser?.()?.name ? String(getUser().name) : "\uC775\uBA85",
3974
4038
  currentUserId: getUser?.()?.id ? String(getUser().id) : void 0,
3975
- onClose: () => setShowInbox(false),
3976
- onStatusChange: async (taskId, status) => {
3977
- try {
3978
- await updateTaskStatus(endpoint, taskId, status);
3979
- } catch (err) {
3980
- console.error("[@impakers/debug] \uC0C1\uD0DC \uBCC0\uACBD \uC2E4\uD328:", err);
3981
- }
3982
- }
4039
+ onClose: () => setShowInbox(false)
3983
4040
  }
3984
4041
  ),
3985
4042
  showSettings && /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(