import { createRootRoute, createRoute, createRouter, Outlet, Link } from '@tanstack/react-router' import { ArticleTicker } from './components/ArticleTicker' import { ArchiveComponent } from './components/routes/ArchiveComponent' import { ArticleDetailComponent } from './components/routes/ArticleDetailComponent' import { LiveBlogsComponent } from './components/routes/LiveBlogsComponent' import { LiveBlogDetailComponent } from './components/routes/LiveBlogDetailComponent' import { LiveBlogAdminComponent } from './components/routes/LiveBlogAdminComponent' import { CreateLiveBlogComponent } from './components/routes/CreateLiveBlogComponent' import { AdminDashboardComponent } from './components/routes/AdminDashboardComponent' import { AuthPage } from './components/routes/AuthPage' import { SportComponent } from './components/routes/SportComponent' import { ArtComponent } from './components/routes/ArtComponent' import { ScienceComponent } from './components/routes/ScienceComponent' import { AboutComponent } from './components/routes/AboutComponent' import { ProtectedRoute } from './components/auth/ProtectedRoute' import { Header } from './components/layout/Header' import { HeroArticle } from './components/home/HeroArticle' import { PinnedLiveBlogsSidebar } from './components/home/PinnedLiveBlogsSidebar' import { LatestArticlesGrid } from './components/home/LatestArticlesGrid' import { Button } from './components/ui/button' import { Zap, Search, Users } from 'lucide-react' import './styles.css' const rootRoute = createRootRoute({ head: () => ({ meta: [ { title: 'Placebo.mk - Сатирични вести од Македонија', description: 'Latest news and articles from Macedonia with a sarcastic twist', }, ], }), component: () => (
), }) const indexRoute = createRoute({ getParentRoute: () => rootRoute, path: '/', component: () => (

Placebo.mk

Сатрирични вести и коментари за локални и глобални настани. Затоа што понекогаш вистината боли повеќе од фикцијата.

Најнови вести

Свежо подготвена сатира за тековни настани, политика и сè помеѓу тоа.

Без филтер

Не разликуване нијанси. Не користиме дипломатски јазик. Само искрени коментари.

Live Покривање

Ажурирања во реално време, прекршени вести. Нема одложувања, само факти.

), }) const archiveRoute = createRoute({ getParentRoute: () => rootRoute, path: '/archive', component: ArchiveComponent, }) const sportRoute = createRoute({ getParentRoute: () => rootRoute, path: '/sport', component: SportComponent, }) const artRoute = createRoute({ getParentRoute: () => rootRoute, path: '/art', component: ArtComponent, }) const scienceRoute = createRoute({ getParentRoute: () => rootRoute, path: '/science', component: ScienceComponent, }) const aboutRoute = createRoute({ getParentRoute: () => rootRoute, path: '/about', component: AboutComponent, }) const articleDetailRoute = createRoute({ getParentRoute: () => rootRoute, path: '/articles/$id', component: () => { const { id } = articleDetailRoute.useParams() return }, loader: async ({ params }) => { const response = await fetch(`${import.meta.env.VITE_API_URL || 'http://localhost:3000'}/api/v1/articles/${params.id}`) if (!response.ok) { return { article: null } } const data = await response.json() return { article: data.data } }, head: ({ loaderData }) => { const article = loaderData?.article if (!article) { return { meta: [ { title: 'Article Not Found - Placebo.mk' }, { name: 'description', content: 'Article not found' }, ], } } const ogTitle = article.ogTitle || article.title const ogDescription = article.ogDescription || article.excerpt || 'Latest news from Placebo.mk' const ogImage = article.ogImage || article.featuredImage || '/placeholder-image.jpg' const twitterTitle = article.twitterTitle || article.title const twitterDescription = article.twitterDescription || article.excerpt || 'Latest news from Placebo.mk' const twitterImage = article.twitterImage || article.featuredImage || '/placeholder-image.jpg' const metaTags = [ { title: `${article.title} - Placebo.mk` }, { name: 'description', content: ogDescription }, { property: 'og:title', content: ogTitle }, { property: 'og:description', content: ogDescription }, { property: 'og:image', content: ogImage }, { property: 'og:url', content: typeof window !== 'undefined' ? window.location.href : '' }, { property: 'og:type', content: 'article' }, { property: 'og:locale', content: 'mk_MK' }, { name: 'twitter:card', content: 'summary_large_image' }, { name: 'twitter:title', content: twitterTitle }, { name: 'twitter:description', content: twitterDescription }, { name: 'twitter:image', content: twitterImage }, { property: 'article:published_time', content: article.createdAt }, { property: 'article:modified_time', content: article.updatedAt }, ] if (article.author?.name) { metaTags.push({ property: 'article:author', content: article.author.name }) } if (article.tags && article.tags.length > 0) { article.tags.forEach((tag: string) => { metaTags.push({ property: 'article:tag', content: tag }) }) } return { meta: metaTags, } }, }) const liveBlogsRoute = createRoute({ getParentRoute: () => rootRoute, path: '/live-blogs', component: LiveBlogsComponent, }) const liveBlogDetailRoute = createRoute({ getParentRoute: () => rootRoute, path: '/live-blogs/$slug', component: () => { const { slug } = liveBlogDetailRoute.useParams() return }, }) const authRoute = createRoute({ getParentRoute: () => rootRoute, path: '/auth', component: AuthPage, }) const liveBlogAdminRoute = createRoute({ getParentRoute: () => rootRoute, path: '/admin/live-blogs/$slug', component: () => { const { slug } = liveBlogAdminRoute.useParams() return ( ) }, }) const createLiveBlogRoute = createRoute({ getParentRoute: () => rootRoute, path: '/admin/live-blogs/create', component: () => ( ), }) const adminDashboardRoute = createRoute({ getParentRoute: () => rootRoute, path: '/admin', component: () => ( ), }) const routeTree = rootRoute.addChildren([ indexRoute, archiveRoute, sportRoute, artRoute, scienceRoute, aboutRoute, articleDetailRoute, liveBlogsRoute, liveBlogDetailRoute, authRoute, liveBlogAdminRoute, createLiveBlogRoute, adminDashboardRoute, ]) export const router = createRouter({ routeTree }) declare module '@tanstack/react-router' { interface Register { router: typeof router } }