활동을 Studio 에서 손으로 적어야 했다. 그러면 "언제 무엇을 올렸는가" 가 실제로 올린 사실과 따로 관리되고, 적기를 잊으면 타임라인에 구멍이 남는다. 게시가 곧 사건이므로 게시가 기록한다. 공개 화면에서는 링크를 없앤다. 각 줄에 그 기록으로 가는 링크가 있으면 같은 글에 닿는 길이 둘이 되고, 읽는 사람은 "기록"과 "활동"이 어떻게 다른지 매번 다시 판단해야 한다. 활동은 날짜와 무엇을 올렸는지만 말하고, 글을 읽는 자리는 기록 화면 하나로 둔다. Studio 의 활동 칸도 읽기 전용 로그가 된다 — 만들기·고치기·지우기 폼을 걷어낸다. 맥락에서 경계와 시스템 개요 칸을 뺀다. 저장은 되지만 공개 화면 어디에도 나오지 않는다 — 프로젝트 화면이 그리는 것은 목적 하나다. 쓰는 사람에게는 어딘가 실릴 것처럼 보이는 칸이었고 실제로는 아무도 읽지 않았다. 열의 데이터는 남겨 두고 서버 값을 그대로 왕복시킨다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XEHXspz4rv5pB5wiiSsVDu
52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import {
|
|
RegisteredNotFoundRoute,
|
|
useRouteInput,
|
|
} from "../../../../../presentation/routes/route-input.tsx";
|
|
import { ProjectPageHeader } from "../components/project-page-header.tsx";
|
|
import { usePublicContent } from "../use-public-content.tsx";
|
|
|
|
export function ProjectActivityPage() {
|
|
const { params } = useRouteInput<"TECH_LOG_PROJECT_ACTIVITY">();
|
|
const slug = typeof params.slug === "string" ? params.slug : "";
|
|
const view = usePublicContent(["tech-log", "project", slug, "activity"], async (queries) => {
|
|
const project = await queries.getProject(slug);
|
|
return project
|
|
? { project, activity: await queries.getProjectActivity(slug) }
|
|
: { project: undefined, activity: [] };
|
|
});
|
|
if (!view.ready) return view.fallback;
|
|
|
|
const { project, activity } = view.data;
|
|
if (!project) return <RegisteredNotFoundRoute />;
|
|
|
|
/*
|
|
활동은 로그다 — 언제 무엇을 올렸는지만 적는다.
|
|
|
|
예전에는 각 줄에 그 기록으로 가는 링크가 있었다. 그러면 같은 글에 닿는 길이 둘이 되고,
|
|
읽는 사람은 "기록"과 "활동"이 어떻게 다른지 매번 다시 판단해야 한다. 글을 읽는 자리는
|
|
기록 화면 하나로 둔다.
|
|
*/
|
|
return (
|
|
<main id="main-content" className="shell project-page">
|
|
<ProjectPageHeader project={project} title={`${project.title} 활동`} />
|
|
{activity.length === 0 ? (
|
|
<p className="public-empty-note">아직 이 프로젝트에서 공개한 기록이 없습니다.</p>
|
|
) : (
|
|
<ol className="project-activity-list">
|
|
{activity.map((item) => (
|
|
<li key={item.id}>
|
|
<article id={item.id}>
|
|
<div>
|
|
<span>{item.type}</span>
|
|
<time dateTime={item.dateTime}>{item.date}</time>
|
|
</div>
|
|
<h2>{item.title}</h2>
|
|
</article>
|
|
</li>
|
|
))}
|
|
</ol>
|
|
)}
|
|
</main>
|
|
);
|
|
}
|