@edv4h/usketch-plugin-comments 1.0.0
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/LICENSE +21 -0
- package/dist/comment-badge-layer.d.ts +10 -0
- package/dist/comment-badge-layer.d.ts.map +1 -0
- package/dist/comment-badge-layer.js +75 -0
- package/dist/comment-badge-layer.js.map +1 -0
- package/dist/comment-client.d.ts +20 -0
- package/dist/comment-client.d.ts.map +1 -0
- package/dist/comment-client.js +85 -0
- package/dist/comment-client.js.map +1 -0
- package/dist/comments-tab-wrapper.d.ts +9 -0
- package/dist/comments-tab-wrapper.d.ts.map +1 -0
- package/dist/comments-tab-wrapper.js +13 -0
- package/dist/comments-tab-wrapper.js.map +1 -0
- package/dist/comments-tab.d.ts +10 -0
- package/dist/comments-tab.d.ts.map +1 -0
- package/dist/comments-tab.js +199 -0
- package/dist/comments-tab.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +8 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +61 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +49 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 EdV4H
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { BoardStore, EventBus, LayerRenderContext, ShapeRegistry } from "@edv4h/usketch-shared";
|
|
2
|
+
interface CommentBadgeLayerProps {
|
|
3
|
+
ctx: LayerRenderContext;
|
|
4
|
+
store: BoardStore;
|
|
5
|
+
shapes: ShapeRegistry;
|
|
6
|
+
events: EventBus;
|
|
7
|
+
}
|
|
8
|
+
export declare function CommentBadgeLayer({ ctx, store, shapes, events }: CommentBadgeLayerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=comment-badge-layer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-badge-layer.d.ts","sourceRoot":"","sources":["../src/comment-badge-layer.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACX,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,MAAM,uBAAuB,CAAC;AAK/B,UAAU,sBAAsB;IAC/B,GAAG,EAAE,kBAAkB,CAAC;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,sBAAsB,kDAoGvF"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { worldToScreen } from "@edv4h/usketch-shared";
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
export function CommentBadgeLayer({ ctx, store, shapes, events }) {
|
|
5
|
+
const [threads, setThreads] = useState([]);
|
|
6
|
+
// コメントスレッドの更新をリッスン
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
const unsubs = [];
|
|
9
|
+
unsubs.push(events.on("comments:threads-loaded", (loaded) => {
|
|
10
|
+
setThreads(loaded);
|
|
11
|
+
}));
|
|
12
|
+
unsubs.push(events.on("comments:badge-update", (thread) => {
|
|
13
|
+
setThreads((prev) => [thread, ...prev]);
|
|
14
|
+
}));
|
|
15
|
+
return () => {
|
|
16
|
+
for (const u of unsubs)
|
|
17
|
+
u();
|
|
18
|
+
};
|
|
19
|
+
}, [events]);
|
|
20
|
+
// シェイプごとにバッジ集約
|
|
21
|
+
const badgesByShape = new Map();
|
|
22
|
+
for (const t of threads) {
|
|
23
|
+
if (t.resolved)
|
|
24
|
+
continue;
|
|
25
|
+
badgesByShape.set(t.anchorShapeId, (badgesByShape.get(t.anchorShapeId) ?? 0) + t.messages.length);
|
|
26
|
+
}
|
|
27
|
+
const badges = [];
|
|
28
|
+
for (const [shapeId, count] of badgesByShape) {
|
|
29
|
+
const shape = store.getShape(shapeId);
|
|
30
|
+
if (!shape)
|
|
31
|
+
continue;
|
|
32
|
+
const def = shapes.get(shape.type);
|
|
33
|
+
const bounds = def
|
|
34
|
+
? def.getBounds(shape)
|
|
35
|
+
: { x: shape.x, y: shape.y, width: shape.width, height: shape.height };
|
|
36
|
+
// バッジ位置: シェイプの右上
|
|
37
|
+
badges.push({
|
|
38
|
+
shapeId,
|
|
39
|
+
x: bounds.x + bounds.width,
|
|
40
|
+
y: bounds.y,
|
|
41
|
+
count,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (badges.length === 0)
|
|
45
|
+
return null;
|
|
46
|
+
const { viewport } = ctx;
|
|
47
|
+
return (_jsx(_Fragment, { children: badges.map((badge) => {
|
|
48
|
+
const screen = worldToScreen(badge.x, badge.y, viewport);
|
|
49
|
+
return (_jsx("button", { type: "button", onPointerDown: (e) => e.stopPropagation(), onPointerUp: (e) => e.stopPropagation(), onClick: (e) => {
|
|
50
|
+
e.stopPropagation();
|
|
51
|
+
events.emit("side-panel:open", { tabId: "comments" });
|
|
52
|
+
}, style: {
|
|
53
|
+
position: "absolute",
|
|
54
|
+
left: screen.x - 10,
|
|
55
|
+
top: screen.y - 10,
|
|
56
|
+
width: 20,
|
|
57
|
+
height: 20,
|
|
58
|
+
borderRadius: "50%",
|
|
59
|
+
background: "#f59e0b",
|
|
60
|
+
color: "#fff",
|
|
61
|
+
border: "2px solid #fff",
|
|
62
|
+
fontSize: 10,
|
|
63
|
+
fontWeight: 700,
|
|
64
|
+
display: "flex",
|
|
65
|
+
alignItems: "center",
|
|
66
|
+
justifyContent: "center",
|
|
67
|
+
cursor: "pointer",
|
|
68
|
+
boxShadow: "0 1px 4px rgba(0,0,0,0.2)",
|
|
69
|
+
fontFamily: "system-ui, sans-serif",
|
|
70
|
+
padding: 0,
|
|
71
|
+
lineHeight: 1,
|
|
72
|
+
}, children: badge.count }, badge.shapeId));
|
|
73
|
+
}) }));
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=comment-badge-layer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-badge-layer.js","sourceRoot":"","sources":["../src/comment-badge-layer.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CommentMessage, CommentThread } from "./types.js";
|
|
2
|
+
export interface CommentClientOptions {
|
|
3
|
+
apiUrl: string;
|
|
4
|
+
boardId: string;
|
|
5
|
+
extraHeaders?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createCommentClient(options: CommentClientOptions): {
|
|
8
|
+
list: () => Promise<CommentThread[]>;
|
|
9
|
+
createThread: (params: {
|
|
10
|
+
anchorShapeId: string;
|
|
11
|
+
anchorX?: number;
|
|
12
|
+
anchorY?: number;
|
|
13
|
+
text: string;
|
|
14
|
+
}) => Promise<CommentThread | null>;
|
|
15
|
+
addMessage: (commentId: string, text: string) => Promise<CommentMessage | null>;
|
|
16
|
+
resolve: (commentId: string, resolved: boolean) => Promise<boolean>;
|
|
17
|
+
deleteThread: (commentId: string) => Promise<boolean>;
|
|
18
|
+
};
|
|
19
|
+
export type CommentClient = ReturnType<typeof createCommentClient>;
|
|
20
|
+
//# sourceMappingURL=comment-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-client.d.ts","sourceRoot":"","sources":["../src/comment-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,oBAAoB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB;gBAezC,OAAO,CAAC,aAAa,EAAE,CAAC;2BAUX;QACnC,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACb,KAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;4BAeI,MAAM,QAAQ,MAAM,KAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;yBAexD,MAAM,YAAY,OAAO,KAAG,OAAO,CAAC,OAAO,CAAC;8BAcvC,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;EAchE;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
export function createCommentClient(options) {
|
|
2
|
+
const { apiUrl, boardId, extraHeaders } = options;
|
|
3
|
+
const base = `${apiUrl}/api/boards/${boardId}/comments`;
|
|
4
|
+
function jsonHeaders() {
|
|
5
|
+
return {
|
|
6
|
+
"Content-Type": "application/json",
|
|
7
|
+
...extraHeaders,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function baseHeaders() {
|
|
11
|
+
return { ...extraHeaders };
|
|
12
|
+
}
|
|
13
|
+
async function list() {
|
|
14
|
+
try {
|
|
15
|
+
const res = await fetch(base, { credentials: "include", headers: baseHeaders() });
|
|
16
|
+
if (!res.ok)
|
|
17
|
+
return [];
|
|
18
|
+
return (await res.json());
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function createThread(params) {
|
|
25
|
+
try {
|
|
26
|
+
const res = await fetch(base, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
credentials: "include",
|
|
29
|
+
headers: jsonHeaders(),
|
|
30
|
+
body: JSON.stringify(params),
|
|
31
|
+
});
|
|
32
|
+
if (!res.ok)
|
|
33
|
+
return null;
|
|
34
|
+
return (await res.json());
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function addMessage(commentId, text) {
|
|
41
|
+
try {
|
|
42
|
+
const res = await fetch(`${base}/${commentId}/messages`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
credentials: "include",
|
|
45
|
+
headers: jsonHeaders(),
|
|
46
|
+
body: JSON.stringify({ text }),
|
|
47
|
+
});
|
|
48
|
+
if (!res.ok)
|
|
49
|
+
return null;
|
|
50
|
+
return (await res.json());
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function resolve(commentId, resolved) {
|
|
57
|
+
try {
|
|
58
|
+
const res = await fetch(`${base}/${commentId}`, {
|
|
59
|
+
method: "PATCH",
|
|
60
|
+
credentials: "include",
|
|
61
|
+
headers: jsonHeaders(),
|
|
62
|
+
body: JSON.stringify({ resolved }),
|
|
63
|
+
});
|
|
64
|
+
return res.ok;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async function deleteThread(commentId) {
|
|
71
|
+
try {
|
|
72
|
+
const res = await fetch(`${base}/${commentId}`, {
|
|
73
|
+
method: "DELETE",
|
|
74
|
+
credentials: "include",
|
|
75
|
+
headers: baseHeaders(),
|
|
76
|
+
});
|
|
77
|
+
return res.ok;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return { list, createThread, addMessage, resolve, deleteThread };
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=comment-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comment-client.js","sourceRoot":"","sources":["../src/comment-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { EventBus } from "@edv4h/usketch-shared";
|
|
2
|
+
import type { CommentClient } from "./comment-client.js";
|
|
3
|
+
interface CommentsTabWrapperProps {
|
|
4
|
+
client: CommentClient;
|
|
5
|
+
events: EventBus;
|
|
6
|
+
}
|
|
7
|
+
export declare function CommentsTabWrapper({ client, events }: CommentsTabWrapperProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=comments-tab-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-tab-wrapper.d.ts","sourceRoot":"","sources":["../src/comments-tab-wrapper.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,UAAU,uBAAuB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,QAAQ,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,uBAAuB,2CAU7E"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
import { CommentsTab } from "./comments-tab.js";
|
|
4
|
+
export function CommentsTabWrapper({ client, events }) {
|
|
5
|
+
const [focusThreadId, setFocusThreadId] = useState(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
return events.on("comments:focus-thread", ({ threadId }) => {
|
|
8
|
+
setFocusThreadId(threadId);
|
|
9
|
+
});
|
|
10
|
+
}, [events]);
|
|
11
|
+
return _jsx(CommentsTab, { client: client, events: events, focusThreadId: focusThreadId });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=comments-tab-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-tab-wrapper.js","sourceRoot":"","sources":["../src/comments-tab-wrapper.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAOhD,MAAM,UAAU,kBAAkB,CAAC,EAAE,MAAM,EAAE,MAAM,EAA2B;IAC7E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExE,SAAS,CAAC,GAAG,EAAE;QACd,OAAO,MAAM,CAAC,EAAE,CAAuB,uBAAuB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;YAChF,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,KAAC,WAAW,IAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAI,CAAC;AACtF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { EventBus } from "@edv4h/usketch-shared";
|
|
2
|
+
import type { CommentClient } from "./comment-client.js";
|
|
3
|
+
interface CommentsTabProps {
|
|
4
|
+
client: CommentClient;
|
|
5
|
+
events: EventBus;
|
|
6
|
+
focusThreadId: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function CommentsTab({ client, events, focusThreadId }: CommentsTabProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=comments-tab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-tab.d.ts","sourceRoot":"","sources":["../src/comments-tab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,UAAU,gBAAgB;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,QAAQ,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAgPD,wBAAgB,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,gBAAgB,2CA0I9E"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
function formatTime(iso) {
|
|
4
|
+
const d = new Date(iso);
|
|
5
|
+
return d.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" });
|
|
6
|
+
}
|
|
7
|
+
function ThreadItem({ thread, isFocused, onReply, onResolve, onDelete, }) {
|
|
8
|
+
const [replyText, setReplyText] = useState("");
|
|
9
|
+
const [isComposing, setIsComposing] = useState(false);
|
|
10
|
+
const inputRef = useRef(null);
|
|
11
|
+
const threadRef = useRef(null);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (isFocused && threadRef.current) {
|
|
14
|
+
threadRef.current.scrollIntoView({ behavior: "smooth", block: "nearest" });
|
|
15
|
+
}
|
|
16
|
+
}, [isFocused]);
|
|
17
|
+
const handleSubmit = useCallback(() => {
|
|
18
|
+
const text = replyText.trim();
|
|
19
|
+
if (!text)
|
|
20
|
+
return;
|
|
21
|
+
onReply(thread.id, text);
|
|
22
|
+
setReplyText("");
|
|
23
|
+
}, [replyText, thread.id, onReply]);
|
|
24
|
+
return (_jsxs("div", { ref: threadRef, style: {
|
|
25
|
+
padding: "12px 16px",
|
|
26
|
+
borderBottom: "1px solid var(--border-subtle)",
|
|
27
|
+
background: isFocused ? "var(--bg-active)" : "transparent",
|
|
28
|
+
color: "var(--fg-primary)",
|
|
29
|
+
}, children: [_jsxs("div", { style: {
|
|
30
|
+
display: "flex",
|
|
31
|
+
justifyContent: "space-between",
|
|
32
|
+
alignItems: "center",
|
|
33
|
+
marginBottom: 8,
|
|
34
|
+
}, children: [_jsxs("span", { style: { fontSize: 11, color: "var(--fg-tertiary)" }, children: ["on shape ", thread.anchorShapeId.slice(0, 8), "\u2026"] }), _jsxs("div", { style: { display: "flex", gap: 4 }, children: [_jsx("button", { type: "button", onClick: () => onResolve(thread.id, !thread.resolved), title: thread.resolved ? "Reopen" : "Resolve", style: {
|
|
35
|
+
border: "none",
|
|
36
|
+
background: "none",
|
|
37
|
+
cursor: "pointer",
|
|
38
|
+
fontSize: 14,
|
|
39
|
+
color: thread.resolved ? "var(--success)" : "var(--fg-tertiary)",
|
|
40
|
+
padding: "2px 4px",
|
|
41
|
+
}, children: thread.resolved ? "✓" : "○" }), _jsx("button", { type: "button", onClick: () => onDelete(thread.id), title: "Delete thread", style: {
|
|
42
|
+
border: "none",
|
|
43
|
+
background: "none",
|
|
44
|
+
cursor: "pointer",
|
|
45
|
+
fontSize: 12,
|
|
46
|
+
color: "var(--fg-disabled)",
|
|
47
|
+
padding: "2px 4px",
|
|
48
|
+
}, children: "\uD83D\uDDD1" })] })] }), thread.messages.map((msg) => (_jsxs("div", { style: { marginBottom: 6 }, children: [_jsx("div", { style: { fontSize: 13, color: "var(--fg-primary)", lineHeight: 1.4 }, children: msg.text }), _jsxs("div", { style: { fontSize: 10, color: "var(--fg-tertiary)", marginTop: 2 }, children: [msg.authorId.slice(0, 8), "\u2026 \u00B7 ", formatTime(msg.createdAt)] })] }, msg.id))), !thread.resolved && (_jsxs("div", { style: { display: "flex", gap: 6, marginTop: 8 }, children: [_jsx("input", { ref: inputRef, type: "text", value: replyText, onChange: (e) => setReplyText(e.target.value), onCompositionStart: () => setIsComposing(true), onCompositionEnd: () => setIsComposing(false), onKeyDown: (e) => {
|
|
49
|
+
e.stopPropagation();
|
|
50
|
+
if (e.key === "Enter" && !isComposing)
|
|
51
|
+
handleSubmit();
|
|
52
|
+
}, placeholder: "Reply\u2026", style: {
|
|
53
|
+
flex: 1,
|
|
54
|
+
border: "1px solid var(--border-default)",
|
|
55
|
+
background: "var(--bg-input)",
|
|
56
|
+
color: "var(--fg-primary)",
|
|
57
|
+
borderRadius: 6,
|
|
58
|
+
padding: "6px 10px",
|
|
59
|
+
fontSize: 12,
|
|
60
|
+
outline: "none",
|
|
61
|
+
fontFamily: "inherit",
|
|
62
|
+
} }), _jsx("button", { type: "button", onClick: handleSubmit, style: {
|
|
63
|
+
border: "none",
|
|
64
|
+
background: "var(--brand-gradient)",
|
|
65
|
+
color: "white",
|
|
66
|
+
borderRadius: 6,
|
|
67
|
+
padding: "6px 10px",
|
|
68
|
+
fontSize: 12,
|
|
69
|
+
cursor: "pointer",
|
|
70
|
+
flexShrink: 0,
|
|
71
|
+
fontFamily: "inherit",
|
|
72
|
+
fontWeight: 500,
|
|
73
|
+
}, children: "\u9001\u4FE1" })] }))] }));
|
|
74
|
+
}
|
|
75
|
+
function NewThreadForm({ prompt, onSubmit, onCancel, }) {
|
|
76
|
+
const [text, setText] = useState("");
|
|
77
|
+
const [isComposing, setIsComposing] = useState(false);
|
|
78
|
+
const inputRef = useRef(null);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
inputRef.current?.focus();
|
|
81
|
+
}, []);
|
|
82
|
+
return (_jsxs("div", { style: {
|
|
83
|
+
padding: "12px 16px",
|
|
84
|
+
borderBottom: "1px solid var(--border-subtle)",
|
|
85
|
+
background: "var(--bg-active)",
|
|
86
|
+
}, children: [_jsxs("div", { style: { fontSize: 12, color: "var(--fg-secondary)", marginBottom: 8 }, children: ["\u65B0\u3057\u3044\u30B3\u30E1\u30F3\u30C8: ", prompt.anchorShapeId.slice(0, 8), "\u2026"] }), _jsxs("div", { style: { display: "flex", gap: 6 }, children: [_jsx("input", { ref: inputRef, type: "text", value: text, onChange: (e) => setText(e.target.value), onCompositionStart: () => setIsComposing(true), onCompositionEnd: () => setIsComposing(false), onKeyDown: (e) => {
|
|
87
|
+
e.stopPropagation();
|
|
88
|
+
if (e.key === "Enter" && !isComposing && text.trim())
|
|
89
|
+
onSubmit(text.trim());
|
|
90
|
+
if (e.key === "Escape")
|
|
91
|
+
onCancel();
|
|
92
|
+
}, placeholder: "\u30B3\u30E1\u30F3\u30C8\u3092\u66F8\u304F\u2026", style: {
|
|
93
|
+
flex: 1,
|
|
94
|
+
border: "1px solid var(--border-default)",
|
|
95
|
+
background: "var(--bg-input)",
|
|
96
|
+
color: "var(--fg-primary)",
|
|
97
|
+
borderRadius: 6,
|
|
98
|
+
padding: "6px 10px",
|
|
99
|
+
fontSize: 12,
|
|
100
|
+
outline: "none",
|
|
101
|
+
fontFamily: "inherit",
|
|
102
|
+
} }), _jsx("button", { type: "button", onClick: () => text.trim() && onSubmit(text.trim()), style: {
|
|
103
|
+
border: "none",
|
|
104
|
+
background: "var(--brand-gradient)",
|
|
105
|
+
color: "white",
|
|
106
|
+
borderRadius: 6,
|
|
107
|
+
padding: "6px 10px",
|
|
108
|
+
fontSize: 12,
|
|
109
|
+
cursor: "pointer",
|
|
110
|
+
flexShrink: 0,
|
|
111
|
+
fontFamily: "inherit",
|
|
112
|
+
fontWeight: 500,
|
|
113
|
+
}, children: "\u6295\u7A3F" })] })] }));
|
|
114
|
+
}
|
|
115
|
+
export function CommentsTab({ client, events, focusThreadId }) {
|
|
116
|
+
const [threads, setThreads] = useState([]);
|
|
117
|
+
const [loading, setLoading] = useState(true);
|
|
118
|
+
const [newThreadPrompt, setNewThreadPrompt] = useState(null);
|
|
119
|
+
const fetchedRef = useRef(false);
|
|
120
|
+
useEffect(() => {
|
|
121
|
+
if (fetchedRef.current)
|
|
122
|
+
return;
|
|
123
|
+
fetchedRef.current = true;
|
|
124
|
+
client
|
|
125
|
+
.list()
|
|
126
|
+
.then((loaded) => {
|
|
127
|
+
setThreads(loaded);
|
|
128
|
+
// バッジレイヤーにもデータを共有
|
|
129
|
+
events.emit("comments:threads-loaded", loaded);
|
|
130
|
+
})
|
|
131
|
+
.finally(() => setLoading(false));
|
|
132
|
+
}, [client, events]);
|
|
133
|
+
// 新規スレッド作成プロンプトをリッスン
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
return events.on("comments:prompt-new-thread", (prompt) => {
|
|
136
|
+
setNewThreadPrompt(prompt);
|
|
137
|
+
});
|
|
138
|
+
}, [events]);
|
|
139
|
+
// バッジレイヤーにスレッド一覧を同期
|
|
140
|
+
const syncBadges = useCallback((updated) => {
|
|
141
|
+
events.emit("comments:threads-loaded", updated);
|
|
142
|
+
}, [events]);
|
|
143
|
+
const handleReply = useCallback(async (threadId, text) => {
|
|
144
|
+
const msg = await client.addMessage(threadId, text);
|
|
145
|
+
if (!msg)
|
|
146
|
+
return;
|
|
147
|
+
setThreads((prev) => {
|
|
148
|
+
const updated = prev.map((t) => t.id === threadId ? { ...t, messages: [...t.messages, msg] } : t);
|
|
149
|
+
syncBadges(updated);
|
|
150
|
+
return updated;
|
|
151
|
+
});
|
|
152
|
+
}, [client, syncBadges]);
|
|
153
|
+
const handleResolve = useCallback(async (threadId, resolved) => {
|
|
154
|
+
const ok = await client.resolve(threadId, resolved);
|
|
155
|
+
if (!ok)
|
|
156
|
+
return;
|
|
157
|
+
setThreads((prev) => {
|
|
158
|
+
const updated = prev.map((t) => t.id === threadId ? { ...t, resolved: resolved ? 1 : 0 } : t);
|
|
159
|
+
syncBadges(updated);
|
|
160
|
+
return updated;
|
|
161
|
+
});
|
|
162
|
+
}, [client, syncBadges]);
|
|
163
|
+
const handleDelete = useCallback(async (threadId) => {
|
|
164
|
+
const ok = await client.deleteThread(threadId);
|
|
165
|
+
if (!ok)
|
|
166
|
+
return;
|
|
167
|
+
setThreads((prev) => {
|
|
168
|
+
const updated = prev.filter((t) => t.id !== threadId);
|
|
169
|
+
syncBadges(updated);
|
|
170
|
+
return updated;
|
|
171
|
+
});
|
|
172
|
+
}, [client, syncBadges]);
|
|
173
|
+
const handleCreateThread = useCallback(async (text) => {
|
|
174
|
+
if (!newThreadPrompt)
|
|
175
|
+
return;
|
|
176
|
+
const thread = await client.createThread({
|
|
177
|
+
anchorShapeId: newThreadPrompt.anchorShapeId,
|
|
178
|
+
anchorX: newThreadPrompt.anchorX,
|
|
179
|
+
anchorY: newThreadPrompt.anchorY,
|
|
180
|
+
text,
|
|
181
|
+
});
|
|
182
|
+
if (thread) {
|
|
183
|
+
setThreads((prev) => [thread, ...prev]);
|
|
184
|
+
// バッジレイヤー用にイベント発火(タブ内のリスナーはスキップ)
|
|
185
|
+
events.emit("comments:badge-update", thread);
|
|
186
|
+
}
|
|
187
|
+
setNewThreadPrompt(null);
|
|
188
|
+
}, [client, newThreadPrompt, events]);
|
|
189
|
+
if (loading) {
|
|
190
|
+
return (_jsx("div", { style: { padding: 16, textAlign: "center", color: "var(--fg-tertiary)", fontSize: 13 }, children: "\u30B3\u30E1\u30F3\u30C8\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026" }));
|
|
191
|
+
}
|
|
192
|
+
return (_jsxs("div", { children: [newThreadPrompt && (_jsx(NewThreadForm, { prompt: newThreadPrompt, onSubmit: handleCreateThread, onCancel: () => setNewThreadPrompt(null) })), threads.length === 0 && !newThreadPrompt ? (_jsx("div", { style: {
|
|
193
|
+
padding: 24,
|
|
194
|
+
textAlign: "center",
|
|
195
|
+
color: "var(--fg-tertiary)",
|
|
196
|
+
fontSize: 13,
|
|
197
|
+
}, children: "\u307E\u3060\u30B3\u30E1\u30F3\u30C8\u306F\u3042\u308A\u307E\u305B\u3093\u3002\u30B7\u30A7\u30A4\u30D7\u3092\u9078\u629E\u3057\u3066\u30B9\u30EC\u30C3\u30C9\u3092\u958B\u59CB\u3057\u3066\u304F\u3060\u3055\u3044\u3002" })) : (threads.map((thread) => (_jsx(ThreadItem, { thread: thread, isFocused: focusThreadId === thread.id, onReply: handleReply, onResolve: handleResolve, onDelete: handleDelete }, thread.id))))] }));
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=comments-tab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comments-tab.js","sourceRoot":"","sources":["../src/comments-tab.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { UsketchPlugin } from "@edv4h/usketch-shared";
|
|
2
|
+
export interface CommentsPluginOptions {
|
|
3
|
+
boardId: string;
|
|
4
|
+
apiUrl: string;
|
|
5
|
+
extraHeaders?: Record<string, string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createCommentsPlugin(options: CommentsPluginOptions): UsketchPlugin;
|
|
8
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAuB1E,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa,CAoElF"}
|
package/dist/plugin.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { CommentBadgeLayer } from "./comment-badge-layer.js";
|
|
3
|
+
import { createCommentClient } from "./comment-client.js";
|
|
4
|
+
import { CommentsTabWrapper } from "./comments-tab-wrapper.js";
|
|
5
|
+
function CommentIcon() {
|
|
6
|
+
return (_jsx("svg", { width: 13, height: 13, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "M2.5 7.5c0-2.8 2.5-5 5.5-5s5.5 2.2 5.5 5-2.5 5-5.5 5c-.7 0-1.4-.1-2-.3L3 13.5l.8-2.4a4.8 4.8 0 0 1-1.3-3.6Z" }) }));
|
|
7
|
+
}
|
|
8
|
+
export function createCommentsPlugin(options) {
|
|
9
|
+
const { boardId, apiUrl, extraHeaders } = options;
|
|
10
|
+
let cleanup;
|
|
11
|
+
return {
|
|
12
|
+
id: "usketch-plugin-comments",
|
|
13
|
+
name: "Comments",
|
|
14
|
+
setup(ctx) {
|
|
15
|
+
const client = createCommentClient({ apiUrl, boardId, extraHeaders });
|
|
16
|
+
// サイドパネルにコメントタブ登録
|
|
17
|
+
ctx.events.emit("side-panel:register-tab", {
|
|
18
|
+
tab: {
|
|
19
|
+
id: "comments",
|
|
20
|
+
label: "コメント",
|
|
21
|
+
icon: "💬",
|
|
22
|
+
iconComponent: () => _jsx(CommentIcon, {}),
|
|
23
|
+
order: 10,
|
|
24
|
+
render: () => _jsx(CommentsTabWrapper, { client: client, events: ctx.events }),
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
// バッジレイヤー(fixedレイヤー = スクリーン座標系で描画)
|
|
28
|
+
ctx.layers.register({
|
|
29
|
+
id: "comment-badges",
|
|
30
|
+
order: 55,
|
|
31
|
+
fixed: true,
|
|
32
|
+
render: (renderCtx) => (_jsx(CommentBadgeLayer, { ctx: renderCtx, store: ctx.store, shapes: ctx.shapes, events: ctx.events })),
|
|
33
|
+
});
|
|
34
|
+
// フローティングバーからのコメント開始イベント
|
|
35
|
+
const unsubStartThread = ctx.events.on("comments:start-thread", ({ selectedShapeIds }) => {
|
|
36
|
+
if (selectedShapeIds.length === 0)
|
|
37
|
+
return;
|
|
38
|
+
const shapeId = selectedShapeIds[0];
|
|
39
|
+
const shape = ctx.store.getShape(shapeId);
|
|
40
|
+
if (!shape)
|
|
41
|
+
return;
|
|
42
|
+
// プロンプト入力なしで即サイドパネルを開いてスレッド作成準備
|
|
43
|
+
ctx.events.emit("side-panel:open", { tabId: "comments" });
|
|
44
|
+
ctx.events.emit("comments:prompt-new-thread", {
|
|
45
|
+
anchorShapeId: shapeId,
|
|
46
|
+
anchorX: shape.x,
|
|
47
|
+
anchorY: shape.y,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
cleanup = () => {
|
|
51
|
+
unsubStartThread();
|
|
52
|
+
ctx.events.emit("side-panel:unregister-tab", { tabId: "comments" });
|
|
53
|
+
ctx.layers.unregister("comment-badges");
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
teardown() {
|
|
57
|
+
cleanup?.();
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.tsx"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface CommentMessage {
|
|
2
|
+
id: string;
|
|
3
|
+
commentId: string;
|
|
4
|
+
authorId: string;
|
|
5
|
+
text: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
}
|
|
8
|
+
export interface CommentThread {
|
|
9
|
+
id: string;
|
|
10
|
+
boardId: string;
|
|
11
|
+
anchorShapeId: string;
|
|
12
|
+
anchorX: number;
|
|
13
|
+
anchorY: number;
|
|
14
|
+
resolved: number;
|
|
15
|
+
createdBy: string;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
messages: CommentMessage[];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC3B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@edv4h/usketch-plugin-comments",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"source": "./src/index.ts",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"@edv4h/usketch-shared": "1.0.0",
|
|
16
|
+
"@edv4h/usketch-plugin-side-panel": "1.0.0"
|
|
17
|
+
},
|
|
18
|
+
"peerDependencies": {
|
|
19
|
+
"react": ">=19"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@types/react": "19.2.14",
|
|
23
|
+
"typescript": "5.9.3",
|
|
24
|
+
"vitest": "3.2.4"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md"
|
|
32
|
+
],
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/EdV4H/usketch.git",
|
|
37
|
+
"directory": "plugins/usketch-plugin-comments"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/EdV4H/usketch#readme",
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/EdV4H/usketch/issues"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc -p tsconfig.json",
|
|
45
|
+
"typecheck": "tsc --noEmit",
|
|
46
|
+
"test": "vitest run --passWithNoTests",
|
|
47
|
+
"clean": "rm -rf dist"
|
|
48
|
+
}
|
|
49
|
+
}
|