summaryrefslogtreecommitdiff
path: root/src/app/_components/archiveLinkElement.tsx
diff options
context:
space:
mode:
authorFushihara <1039534+fushihara@users.noreply.github.com>2024-09-28 19:24:00 +0900
committerFushihara <1039534+fushihara@users.noreply.github.com>2024-09-28 19:24:22 +0900
commit0acca62436a3521c67b3be423b07a57f9e829def (patch)
treecf19bd92a8383c10bef9fc9e3949427b00460024 /src/app/_components/archiveLinkElement.tsx
parent67c590c46f3a29795308098e9c6d0fa1da53e805 (diff)
リンク一覧を個別エレメントに切り出し
Diffstat (limited to 'src/app/_components/archiveLinkElement.tsx')
-rw-r--r--src/app/_components/archiveLinkElement.tsx84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/app/_components/archiveLinkElement.tsx b/src/app/_components/archiveLinkElement.tsx
new file mode 100644
index 0000000..d97d904
--- /dev/null
+++ b/src/app/_components/archiveLinkElement.tsx
@@ -0,0 +1,84 @@
+import Link from "next/link";
+type ArticlePage = {
+ type: "article",
+ articleId: number,
+ subPageNumber?: number,
+}
+type AnimeTop = {
+ type: "animeTop",
+ animeId: number,
+};
+type AnimeReviewList = {
+ type: "animeReviewList",
+ animeId: number,
+ /** 0始まり */
+ pageNumber: number,
+};
+type AnimeReviewItem = {
+ type: "AnimeReviewItem",
+ animeId: number,
+ reviewId: number,
+};
+type Common = { showLinkUnderline?: boolean }
+type Option = (ArticlePage | AnimeTop | AnimeReviewList | AnimeReviewItem) & Common;
+export function ArciveLinkElement(option: Option) {
+ const officialLinkTitle = `公式のakiba-souken.com へのリンク。閉鎖後は繋がらなくなるはず`;
+ const iaSearchResultLinkTitle = `InternetArchive の検索結果へのリンク`;
+ const iframeLinkTitle = `Iframeを使ってInternetArchiveに記録されたアーカイブを表示します`;
+ let originalUrl = "";
+ let iframeSrc = "";
+ let suffixPrivate: JSX.Element = <></>;
+ let className = "";
+ if (option.type == "article") {
+ if (option.subPageNumber == null) {
+ originalUrl = `https://akiba-souken.com/article/${option.articleId}/`;
+ iframeSrc = `article-${option.articleId}`;
+ } else {
+ originalUrl = `https://akiba-souken.com/article/${option.articleId}/?page=${option.subPageNumber}`;
+ iframeSrc = `article-${option.articleId}-${option.subPageNumber}`;
+ suffixPrivate = <>Page:{option.subPageNumber}</>
+ }
+ } else if (option.type == "animeTop") {
+ originalUrl = `https://akiba-souken.com/anime/${option.animeId}/`;
+ iframeSrc = `anime-${option.animeId}`
+ } else if (option.type == "animeReviewList") {
+ if (option.pageNumber == 0) {
+ originalUrl = `https://akiba-souken.com/anime/${option.animeId}/review/`;
+ iframeSrc = `anime-${option.animeId}-review`
+ } else {
+ const page = option.pageNumber + 1;
+ originalUrl = `https://akiba-souken.com/anime/${option.animeId}/?page=${page}`;
+ iframeSrc = `anime-${option.animeId}-review-p${page}`
+ }
+ } else if (option.type == "AnimeReviewItem") {
+ originalUrl = `https://akiba-souken.com/anime/${option.animeId}/review/${option.reviewId}`;
+ iframeSrc = `anime-${option.animeId}-review-${option.reviewId}`;
+ } else {
+ throw new Error();
+ }
+ if (option.showLinkUnderline == true) {
+ className = `original-href`;
+ }
+ return (
+ <>
+ <a
+ href={originalUrl}
+ target="_blank"
+ className={`transition duration-300 ease-in-out hover:text-gray-900 ${className}`}
+ title={officialLinkTitle}
+ >公式</a>
+ <a
+ href={`https://web.archive.org/web/*/${originalUrl}`}
+ target="_blank"
+ className={`transition duration-300 ease-in-out hover:text-gray-900 ${className}`}
+ title={iaSearchResultLinkTitle}
+ >IA検索結果</a>
+ <Link
+ href={`/iframe?src=${iframeSrc}`}
+ className={`transition duration-300 ease-in-out hover:text-gray-900 ${className}`}
+ title={iframeLinkTitle}
+ >IAをiframe</Link>
+ {suffixPrivate}
+ </>
+ )
+} \ No newline at end of file