diff --git a/src/shared/ui/index.tsx b/src/shared/ui/index.tsx
index a7fdd11..80c75cf 100644
--- a/src/shared/ui/index.tsx
+++ b/src/shared/ui/index.tsx
@@ -3,6 +3,7 @@
import Link from "next/link";
import {
forwardRef,
+ useState,
type ButtonHTMLAttributes,
type InputHTMLAttributes,
type ReactNode,
@@ -270,6 +271,19 @@ export function EmptyState({ title, desc, action }: { title: string; desc?: stri
}
export function CopyField({ value, label }: { value: string; label?: string }) {
+ const [copied, setCopied] = useState<"ok" | "fail" | null>(null);
+ const copy = () => {
+ const flash = (r: "ok" | "fail") => {
+ setCopied(r);
+ setTimeout(() => setCopied(null), 1500);
+ };
+ // clipboard는 https·localhost에서만 있다
+ if (!navigator.clipboard) return flash("fail");
+ navigator.clipboard.writeText(value).then(
+ () => flash("ok"),
+ () => flash("fail"),
+ );
+ };
return (
@@ -278,10 +292,14 @@ export function CopyField({ value, label }: { value: string; label?: string }) {
);
diff --git a/src/widgets/activity/ActivityView.tsx b/src/widgets/activity/ActivityView.tsx
index 9c99a3c..f7dd34e 100644
--- a/src/widgets/activity/ActivityView.tsx
+++ b/src/widgets/activity/ActivityView.tsx
@@ -34,13 +34,13 @@ export function ActivityView({ projectId }: { projectId: string }) {
상세에서 확인합니다.
-
+
{(Object.keys(TABS) as Tab[]).map((t) => (
) : (
-
+ <>
+ {(unassigned.length > 0 || noTasks) && (
+
+ {noTasks ? (
+ <>
+ 태스크가 없습니다.{" "}
+
+ Room 3에서 PM 계획 받기
+
+ >
+ ) : (
+ <>
+ {unassigned.map((r) => TEAM_ROLE_META[r].label).join(", ")} 역할에 배정된 에이전트가 없습니다.{" "}
+
+ 역할 배정으로
+
+ >
+ )}
+
+ )}
+
+ >
)}
>
)}