"use client"; import Image from "next/image"; import { Icon } from "@iconify/react"; import Link from "next/link"; 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 { LINK_DIRECTORY, LINK_DIRECTORY_CATEGORIES, SOCIAL_LINKS, TOP_ICON_LINKS, type LinkDirectoryCategory, } from "@/lib/links"; type CategoryFilter = "all" | LinkDirectoryCategory; const FILTER_ITEMS: ReadonlyArray<{ id: CategoryFilter; label: string }> = [ { id: "all", label: "Tüm kategoriler" }, ...LINK_DIRECTORY_CATEGORIES, ]; const CATEGORY_LABELS = Object.fromEntries( LINK_DIRECTORY_CATEGORIES.map((item) => [item.id, item.label]), ) as Record<(typeof LINK_DIRECTORY_CATEGORIES)[number]["id"], 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(/\/$/, ""); } export function LinksContent() { const [activeCategory, setActiveCategory] = useState("all"); const [query, setQuery] = useState(""); 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( [item.label, item.href, CATEGORY_LABELS[item.category], ...item.keywords].join(" "), ); return queryTokens.every((token) => haystack.includes(token)); }); }, [activeCategory, query]); return (
Poyraz Avsever kapak görseli
PA
Poyraz Avsever
Burada sosyal hesaplarım, portfolyo sayfalarım ve hızlı erişim linklerimin tamamı tek yerde duruyor. Direkt açıp paylaşabilirsin.
{SOCIAL_LINKS.map((item) => ( ))}
{TOP_ICON_LINKS.map((item) => (
{item.label} {formatHref(item.href)}
))}
Tüm Linkler Sayfalar, kaynaklar ve sosyal profiller
setQuery(event.target.value)} placeholder="Link ara... github, medium, /blog" aria-label="Linklerde arama" className="h-11 rounded-2xl" />
{filteredItems.map((item) => (
{item.label} {CATEGORY_LABELS[item.category]}
{formatHref(item.href)}
))} {filteredItems.length === 0 ? ( Seçili filtreye uygun link bulunamadı. ) : null}
); }