"use client"; import { Icon } from "@iconify/react"; import Image from "next/image"; import { Link } from "@/i18n/routing"; import { useLocale, useTranslations } from "next-intl"; import { useMemo, useState } from "react"; import { Avatar, AvatarFallback, AvatarImage, Card, Input, Typography, } from "poyraz-ui/atoms"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "poyraz-ui/molecules"; import { getResumeHref, LINK_DIRECTORY, LINK_DIRECTORY_CATEGORIES, SOCIAL_LINKS, TOP_ICON_LINKS, type LinkDirectoryCategory, } from "@/lib/links"; type CategoryFilter = "all" | LinkDirectoryCategory; type LinksContentProps = { initialCategory?: string; initialQuery?: string; }; const CATEGORY_ORDER = { resources: 0, navigation: 1, social: 2, } as const; const DIRECTORY_ITEMS = [...LINK_DIRECTORY].sort((left, right) => { const categoryCompare = CATEGORY_ORDER[left.category] - CATEGORY_ORDER[right.category]; if (categoryCompare !== 0) { return categoryCompare; } return left.label.localeCompare(right.label, "tr"); }); function normalize(value: string) { return value .toLocaleLowerCase("tr-TR") .normalize("NFD") .replace(/[\u0300-\u036f]/g, ""); } function formatHref(href: string) { if (href.startsWith("mailto:")) { return href.replace("mailto:", ""); } if (href.startsWith("/")) { return `poyrazavsever.com${href}`; } return href.replace(/^https?:\/\//, "").replace(/\/$/, ""); } function parseCategoryFilter(value?: string): CategoryFilter { if (value === "navigation" || value === "social" || value === "resources") { return value; } return "all"; } export function LinksContent({ initialCategory, initialQuery = "", }: LinksContentProps) { const t = useTranslations("Links"); const tNav = useTranslations("Nav"); const locale = useLocale(); const [activeCategory, setActiveCategory] = useState(() => parseCategoryFilter(initialCategory), ); const [query, setQuery] = useState(initialQuery); const filterItems = useMemo(() => [ { id: "all" as const, label: t("allCategories") }, ...LINK_DIRECTORY_CATEGORIES.map((item) => ({ id: item.id, label: t(`categories.${item.id}`), })), ], [t]); const filteredItems = useMemo(() => { const normalizedQuery = normalize(query.trim()); const queryTokens = normalizedQuery.split(/\s+/).filter(Boolean); return DIRECTORY_ITEMS.filter((item) => { if (activeCategory !== "all" && item.category !== activeCategory) { return false; } if (queryTokens.length === 0) { return true; } const haystack = normalize( [ tNav.has(item.id) ? tNav(item.id) : item.label, item.href, t(`categories.${item.category}`), ...item.keywords, ].join(" "), ); return queryTokens.every((token) => haystack.includes(token)); }); }, [activeCategory, query, t, tNav]); return (
Poyraz Avsever kapak görseli
PA
Poyraz Avsever
{t("desc")}
{SOCIAL_LINKS.map((item) => ( ))}
{TOP_ICON_LINKS.map((item) => { const href = item.id === "cv" ? getResumeHref(locale) : item.href; return (
{tNav.has(item.id) ? tNav(item.id) : item.label} {formatHref(href)}
); })}
{t("allLinks")} {t("allLinksDesc")}
setQuery(event.target.value)} placeholder={t("searchPlaceholder")} aria-label={t("allLinks")} className="h-11 rounded-2xl" />
{filteredItems.map((item) => { const href = item.id === "cv" ? getResumeHref(locale) : item.href; const isStaticOrExternal = item.external || item.id === "rss" || item.id === "cv" || href.endsWith(".xml") || href.endsWith(".pdf"); const CardContent = (
{tNav.has(item.id) ? tNav(item.id) : item.label} {t(`categories.${item.category}`)}
{formatHref(href)}
); return isStaticOrExternal ? ( {CardContent} ) : ( {CardContent} ); })} {filteredItems.length === 0 ? ( {t("empty")} ) : null}
); }