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(", ")} 역할에 배정된 에이전트가 없습니다.{" "} + + 역할 배정으로 + + + )} +

+ )} + + )} )}