@weekend-studio/easyblog-next 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/index.ts","../src/app/NextAppRouterUtils.ts","../src/app/BaseUtils.ts","../src/app/lib/utils.ts","../src/app/components/NextBlogPage.tsx","../src/app/components/Article.tsx","../src/app/components/ui/linkBadge.tsx","../src/app/components/ui/badge.tsx","../src/app/components/NextBlogListPage.tsx","../src/app/components/ArticleGroup.tsx","../src/app/components/ArticleCard.tsx","../src/app/components/ui/card.tsx","../src/app/components/ui/pagination.tsx","../src/app/components/ui/button.tsx","../src/app/NextPageRouterUtils.ts","../src/app/components/NextBlogListPageForPageRouter.tsx","../src/app/components/NextBlogPageForPageRouter.tsx"],"sourcesContent":["import './globals.css'\n\nexport * from './models';\nexport * from './app-index';\nexport * from './page-index';\n","import { cache } from \"react\";\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { Metadata } from \"next\";\nimport { notFound } from \"next/navigation\";\n\nimport { exchangeToken } from './BaseUtils';\nimport { getFormattedDate } from \"./lib/utils\";\n\n// Cached token getter\nconst getAuthToken = cache(async (config: EasyBlogConfig): Promise<string | null> => {\n return exchangeToken(config);\n});\n \n// Server-side data fetching functions\nasync function getBlogPosts(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { revalidate: 3600 }\n });\n\n if (!response.ok) {\n console.error('Failed to fetch blog posts:', response);\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nasync function getBlogPost(config: EasyBlogConfig, slug: string) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n },\n next: { revalidate: 3600 }\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch blog post: ${response.status} ${response.statusText}`);\n }\n\n return response.json();\n}\n\nasync function getBlogPaths(config: EasyBlogConfig) {\n const { blogs } = await getBlogPosts(config, { index: 0, limit: 10000 });\n return blogs.map((blog: any) => ({ slug: blog.slug }));\n}\n\nasync function generateMetadata(config: EasyBlogConfig, slug?: string): Promise<Metadata> {\n if (slug) {\n const post = await getBlogPost(config, slug);\n if (!post) return notFound();\n\n return {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n openGraph: {\n title: post.title,\n description: post.excerpt?.substring(0, 160),\n type: 'article',\n publishedTime: getFormattedDate(post.created_at),\n tags: post.tags,\n },\n };\n }\n\n return {\n title: 'Blog',\n description: 'Read our latest blog posts',\n openGraph: {\n title: 'Blog',\n description: 'Read our latest blog posts',\n type: 'website',\n },\n };\n}\n\n// Server exports\nexport {\n generateMetadata,\n getBlogPost,\n getBlogPosts,\n getBlogPaths,\n};\n","// Base functionality shared between both routers\nimport { EasyBlogConfig, IQueryParams } from \"./models\";\n\nexport async function exchangeToken(config: EasyBlogConfig): Promise<string | null> {\n try {\n const response = await fetch(`${config.apiUrl}/exchange-token`, {\n method: 'POST',\n headers: { \n 'Authorization': `Bearer ${config.apiKey}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to exchange token:', response);\n throw new Error('Failed to authenticate');\n }\n\n const data = await response.json();\n return data.token;\n } catch (error) {\n console.error('Failed to exchange token:', error);\n return null;\n }\n}\n\n\nexport async function getBlogPostsBase(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await exchangeToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n return { url, token };\n}\n\nexport async function getBlogPostBase(config: EasyBlogConfig, slug: string) {\n const token = await exchangeToken(config);\n const url = `${config.apiUrl}/sdk/blogs/${slug}`;\n return { url, token };\n}","import { IQueryParams } from \"../models\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function buildQueryParams(params: IQueryParams): string {\n const queryParams = new URLSearchParams();\n params.index && queryParams.set('index', params.index.toString());\n params.limit && queryParams.set('limit', params.limit.toString());\n if (params.category) queryParams.set('category', params.category);\n if (params.tags) queryParams.set('tags', [params.tags].join(','));\n return queryParams.toString();\n}\n\nexport const getFormattedDate = (date: Date) => {\n if (!date) return '';\n return new Date(date).toISOString().split('T')[0];\n}\n\n// Helper function to generate visible page numbers\nexport const getVisiblePages = (current: number, total: number) => {\n if (total <= 7) return Array.from({ length: total }, (_, i) => i + 1);\n \n if (current <= 3) return [1, 2, 3, 4, 5, null, total];\n if (current >= total - 2) return [1, null, total - 4, total - 3, total - 2, total - 1, total];\n \n return [1, null, current - 1, current, current + 1, null, total];\n};","import React from 'react';\nimport { notFound } from 'next/navigation';\nimport { Article } from './Article';\nimport { EasyBlogConfig } from '../models';\nimport { getBlogPost } from '../NextAppRouterUtils';\n\ninterface NextBlogPageProps {\n config: EasyBlogConfig;\n slug: string;\n style?: React.CSSProperties;\n}\n\nexport async function NextBlogPage(props: NextBlogPageProps) {\n try {\n const response = await getBlogPost({ \n apiKey: props.config.apiKey, \n projectId: props.config.projectId,\n apiUrl: props.config.apiUrl\n }, props.slug);\n if (!response.blog) return notFound();\n const post = response.blog;\n const htmlContent = response.html_content;\n\n return (\n <Article \n post={post} \n content={htmlContent}\n style={props.style}\n />\n );\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return notFound();\n }\n}\n","import React from 'react';\nimport { BlogType } from '@easyblog/shared';\nimport { lowlight as low} from 'lowlight/lib/core';\nimport { getFormattedDate } from '../lib/utils';\nimport { LinkBadge } from './ui/linkBadge';\nimport javascript from 'highlight.js/lib/languages/javascript'\nimport typescript from 'highlight.js/lib/languages/typescript'\nimport css from 'highlight.js/lib/languages/css'\nimport html from 'highlight.js/lib/languages/xml'\n\ninterface IProps {\n post: BlogType | null;\n content: string | null;\n style?: React.CSSProperties;\n}\n\nconst Article: React.FC<IProps> = ({ post, content, style }) => {\n low.registerLanguage('css', css);\n low.registerLanguage('js', javascript);\n low.registerLanguage('ts', typescript);\n low.registerLanguage('html', html);\n\n const contentHtml = {\n __html: content as string\n }\n\n return post && (<article style={style} className='easyblog'>\n {post.thumbnail && <img src={post.thumbnail} alt={post.title} className=\"w-full h-64 object-cover mb-8 rounded-lg\" />}\n <header>\n <h1 className=\"title\">{post.title}</h1>\n <div className=\"info\">\n <div className='author'>\n Created by <span className='font-semibold'>{post.author}</span> \n </div>\n <div className='date'>\n Published at <span className='font-semibold'>{getFormattedDate(post.created_at)}</span>\n </div>\n </div>\n </header>\n <div className='content' dangerouslySetInnerHTML={contentHtml} />\n <footer className=\"mt-8 pt-4 border-t border-gray-200\">\n {post.tags && post.tags.length > 0 && <div className='flex flex-wrap gap-2 my-4'>\n <span className='text-sm font-semibold '>Tags</span>\n <div className=\"flex flex-wrap gap-2\">\n {post.tags.map((tag, index) => (\n <LinkBadge href={`/blogs?tags=${tag}`} key={index}>\n {tag}\n </LinkBadge>\n ))}\n </div>\n </div>}\n {post.category && <div className=\"flex flex-wrap gap-2 my-4\">\n <span className='text-sm font-semibold'>Category</span>\n <LinkBadge href={`/blogs?category=${post.category}`}>\n {post.category}\n </LinkBadge>\n </div>}\n </footer>\n </article>\n )\n};\n\nexport { Article };\n","import Link from \"next/link\";\nimport { Badge } from \"./badge\";\nimport React from \"react\";\n\nexport const LinkBadge = ({ children, href }: { children: React.ReactNode, href: string }) => {\n return (\n <Link href={href}>\n <Badge variant=\"outline\" className=\"text-xs hover:cursor-pointer hover:bg-primary hover:text-primary-foreground\">{children}</Badge>\n </Link>\n );\n};","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { cn } from \"../../lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n","import React from 'react';\nimport { getBlogPosts } from '../NextAppRouterUtils';\nimport { ArticleGroup } from './ArticleGroup';\nimport { EasyBlogConfig, IQueryParams } from '../models';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/app/components/ui/pagination\"\nimport { getVisiblePages } from '../lib/utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\ninterface NextBlogListPageProps {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n searchParams?: {\n page?: string;\n category?: string;\n tags?: string;\n };\n displayOptions?: {\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n }\n}\n\nexport async function NextBlogListPage(props: NextBlogListPageProps) {\n const postsPerPage = props.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n const searchParams = props.searchParams || {};\n const currentPage = Number(searchParams.page) || 1;\n\n const queryParams: IQueryParams = {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: searchParams.category || '',\n tags: searchParams.tags?.split(',') || []\n }\n\n const res = await getBlogPosts(\n props.config, \n queryParams\n );\n\n const { blogs, total } = res;\n\n const totalPages = Math.ceil(total / queryParams.limit!);\n\n const visiblePages = getVisiblePages(currentPage, totalPages);\n\n return (\n <div>\n <ArticleGroup \n blogs={blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?page=${currentPage - 1}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`/blogs?page=${pageNum}`}\n isActive={pageNum === currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {currentPage < totalPages && (\n <PaginationItem>\n <PaginationNext href={`/blogs?page=${currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\n );\n}\n","import React from 'react';\nimport { BlogType } from '@easyblog/shared';\nimport { ArticleCard } from './ArticleCard';\n\ninterface IProps {\n type: 'grid' | 'list'\n blogs: BlogType[],\n showThumbnail?: boolean,\n showReadingTime?: boolean,\n showExcerpt?: boolean,\n showTags?: boolean,\n showDate?: boolean,\n showAuthor?: boolean,\n showCategory?: boolean,\n isNextPage?: boolean\n}\n\nconst ArticleGroup: React.FC<IProps> = ({ \n type, \n blogs,\n showThumbnail = true,\n showReadingTime = true,\n showExcerpt = true,\n showTags = true,\n showDate = true,\n showAuthor = true,\n showCategory = true,\n isNextPage = false\n}) => {\n if (!blogs || blogs.length === 0) {\n return <div>No blogs found. Please refresh the page.</div>;\n }\n\n const renderGridView = () => {\n return (\n <div className=\"grid grid-cols-1 md:grid-cols-3 lg:grid-cols-3 gap-6\">\n {blogs.map((blog) => (\n <ArticleCard\n key={blog._id}\n blog={blog}\n showThumbnail={showThumbnail}\n showReadingTime={showReadingTime}\n showExcerpt={showExcerpt}\n showTags={showTags}\n showDate={showDate}\n showAuthor={showAuthor}\n showCategory={showCategory}\n isNextPage={isNextPage}\n />\n ))}\n </div>\n );\n };\n const renderListView = () => {\n return (\n <div className=\"flex flex-col gap-4 min-w-[800px]\">\n {blogs.map((blog) => (\n <ArticleCard\n key={blog._id}\n blog={blog}\n showThumbnail={showThumbnail}\n showReadingTime={showReadingTime}\n showExcerpt={showExcerpt}\n showTags={showTags}\n showDate={showDate}\n showAuthor={showAuthor}\n showCategory={showCategory}\n horizontal={true}\n isNextPage={isNextPage}\n />\n ))}\n </div>\n );\n };\n\n return <div>{type === 'grid' ? renderGridView() : renderListView()}</div>;\n};\n\nexport { ArticleGroup };\n","import { BlogType } from '@easyblog/shared';\nimport React from 'react';\nimport { Card, CardContent, CardFooter, CardHeader } from './ui/card';\nimport { Badge } from './ui/badge';\nimport { getFormattedDate } from '../lib/utils';\nimport Link from 'next/link.js';\nimport { LinkBadge } from './ui/linkBadge';\n\ninterface IProps {\n blog: BlogType;\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n horizontal?: boolean;\n isNextPage?: boolean;\n}\n\nconst ArticleCard: React.FC<IProps> = ({ \n blog, \n showThumbnail = true, \n showReadingTime = true, \n showExcerpt = true, \n showTags = true, \n showDate = true, \n horizontal = false,\n showAuthor = true,\n showCategory = true,\n isNextPage = false\n}) => {\n\n const renderTags = (tags: string[]) => {\n return tags.map((tag, index) => {\n return isNextPage ? (\n <LinkBadge key={index} href={`/blogs/?tags=${tag}`}>\n {tag}\n </LinkBadge>\n ) : (\n <Badge key={index} variant=\"outline\" className=\"text-xs rounded-full hover:cursor-pointer hover:bg-primary hover:text-primary-foreground\">\n {tag}\n </Badge>\n );\n });\n };\n\n const renderCategory = () => {\n return isNextPage ? <Link href={`/blogs/?category=${blog.category}`} className=\"hover:underline\"> | {blog.category}</Link> : <span> | {blog.category}</span>;\n };\n\n const renderThumbnail = () => {\n return isNextPage ? (\n <Link href={`/blogs/${blog.slug}`}>\n <img className={`${horizontal ? 'w-48 h-full' : 'w-full h-48'} object-cover`} src={blog.thumbnail!} alt={blog.title} />\n </Link>\n ) : (\n <img className={`${horizontal ? 'w-48 h-full' : 'w-full h-48'} object-cover`} src={blog.thumbnail!} alt={blog.title} />\n );\n };\n\n const renderTitle = () => {\n return isNextPage ? <Link href={`/blogs/${blog.slug}`} className=\"hover:underline text-primary\">{blog.title}</Link> : <h3 className=\"font-bold text-xl mb-2 text-wrap\">{blog.title}</h3>;\n };\n\n return (\n <Card className={`max-w-full overflow-hidden ${horizontal ? 'flex flex-row' : ''}`}>\n {blog.thumbnail && showThumbnail && (\n <CardHeader className=\"p-0\">\n {renderThumbnail()}\n </CardHeader>\n )}\n <CardContent className=\"p-6\">\n {renderTitle()}\n {(showAuthor || showDate || showCategory) && (\n <p className=\"text-muted-foreground\">\n {showAuthor && <span>{blog.author}</span>} {showDate && <span>| {getFormattedDate(blog.created_at)}</span>} {blog.category && showCategory && renderCategory()}\n </p>\n )}\n {blog.reading_time && showReadingTime && (\n <p className=\"text-muted-foreground text-sm mt-2\">{blog.reading_time} minutes to read</p>\n )}\n {showExcerpt && (\n <p className=\"text-muted-foreground text-sm mt-2\">{blog.excerpt}</p>\n )}\n {horizontal && <div className=\"mt-4 flex flex-wrap gap-2 items-start\">\n {showTags && blog.tags.map((tag, index) => (\n <LinkBadge key={index} href={`/blogs?tags=${tag}`}>\n {tag}\n </LinkBadge>\n ))}\n </div>}\n </CardContent>\n {!horizontal && <CardFooter className=\"flex flex-wrap gap-2 items-start\">\n {showTags && renderTags(blog.tags)}\n </CardFooter>}\n </Card>\n );\n};\n\nexport { ArticleCard };\n","import * as React from \"react\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n \"rounded-xl border bg-card text-card-foreground shadow\",\n className\n )}\n {...props}\n />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n {...props}\n />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\"flex items-center p-6 pt-0\", className)}\n {...props}\n />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { ButtonProps, buttonVariants } from \"@/app/components/ui/button\"\nimport { cn } from \"@/app/lib/utils\"\nimport Link from \"next/link\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n HTMLUListElement,\n React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n <ul\n ref={ref}\n className={cn(\"flex flex-row items-center gap-1\", className)}\n {...props}\n />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n HTMLLIElement,\n React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n React.ComponentProps<typeof Link>\n\nconst PaginationLink = ({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) => (\n <Link\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n className\n )}\n {...props}\n />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to previous page\"\n size=\"default\"\n className={cn(\"gap-1 pl-2.5\", className)}\n {...props}\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span>Previous</span>\n </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n className,\n ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n <PaginationLink\n aria-label=\"Go to next page\"\n size=\"default\"\n className={cn(\"gap-1 pr-2.5\", className)}\n {...props}\n >\n <span>Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n className,\n ...props\n}: React.ComponentProps<\"span\">) => (\n <span\n aria-hidden\n className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"../../lib/utils\"\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n outline:\n \"border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-9 px-4 py-2\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n lg: \"h-10 rounded-md px-8\",\n icon: \"h-9 w-9\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : \"button\"\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n","import { EasyBlogConfig, IQueryParams } from \"./models\";\nimport { exchangeToken } from './BaseUtils';\n\n// For Pages Router: Use in-memory cache with expiration\nlet tokenCache: { [key: string]: { token: string | null; expires: number } } = {};\nconst CACHE_DURATION = 3600000; // 1 hour in milliseconds\n\nasync function getAuthToken(config: EasyBlogConfig): Promise<string | null> {\n const cacheKey = `${config.projectId}-${config.apiKey}`;\n const now = Date.now();\n\n // Check cache\n if (tokenCache[cacheKey] && tokenCache[cacheKey].expires > now) {\n return tokenCache[cacheKey].token;\n }\n\n // Get new token\n const token = await exchangeToken(config);\n \n // Update cache\n tokenCache[cacheKey] = {\n token,\n expires: now + CACHE_DURATION\n };\n\n return token;\n}\n\nexport async function getBlogPostsPageRouter(config: EasyBlogConfig, params: IQueryParams = {}) {\n const token = await getAuthToken(config);\n\n const queryString = new URLSearchParams(\n Object.entries(params).map(([key, value]) => [key, String(value)])\n ).toString();\n\n const url = `${config.apiUrl}/sdk/blogs${queryString ? `?${queryString}` : ''}`;\n\n const response = await fetch(url, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n console.error('Failed to fetch blog posts:', response);\n throw new Error(`Failed to fetch blog posts: ${response.status} ${response.statusText}`);\n }\n\n const data = await response.json();\n return data;\n}\n\nexport async function getBlogPostPageRouter(config: EasyBlogConfig, slug: string) {\n const token = await getAuthToken(config);\n\n const response = await fetch(`${config.apiUrl}/sdk/blogs/${slug}`, {\n headers: { \n 'Authorization': `Bearer ${token}`,\n 'x-project-id': config.projectId\n }\n });\n\n if (!response.ok) {\n const errorMessage = `Failed to fetch blog post: ${response.status} ${response.statusText}`;\n throw new Error(errorMessage);\n }\n\n return response.json();\n}\n\nexport async function getBlogPathsPageRouter(config: EasyBlogConfig) {\n const { blogs } = await getBlogPostsPageRouter(config, { index: 0, limit: 10000 });\n return blogs.map((blog: any) => ({ \n params: { slug: blog.slug } \n }));\n}\n\n// Optional: Cache cleanup\nsetInterval(() => {\n const now = Date.now();\n Object.keys(tokenCache).forEach(key => {\n if (tokenCache[key].expires <= now) {\n delete tokenCache[key];\n }\n });\n}, CACHE_DURATION);\n","'use client';\n\nimport { getBlogPostsPageRouter } from '../NextPageRouterUtils';\nimport { ArticleGroup } from './ArticleGroup';\nimport { EasyBlogConfig } from '../models';\nimport React from 'react';\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from \"@/app/components/ui/pagination\"\nimport { getVisiblePages } from '../lib/utils';\n\nconst DEFAULT_BLOG_PER_PAGE = 9;\n\ninterface NextBlogListPageForPageRouterProps {\n blogs: any[];\n type: 'grid' | 'list';\n currentPage: number;\n totalPages: number;\n displayOptions?: {\n showThumbnail?: boolean;\n showReadingTime?: boolean;\n showExcerpt?: boolean;\n showTags?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showCategory?: boolean;\n isNextPage?: boolean;\n blogPerPage?: number;\n }\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n type: 'grid' | 'list';\n displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];\n}\n\nexport function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps) {\n if (!props.blogs) {\n return null;\n }\n\n const visiblePages = getVisiblePages(props.currentPage, props.totalPages);\n\n return (\n <div>\n <ArticleGroup \n blogs={props.blogs} \n type={props.type} \n {...props.displayOptions}\n />\n\n {props.totalPages > 1 && (\n <Pagination className=\"mt-8\">\n <PaginationContent>\n {props.currentPage > 1 && (\n <PaginationItem>\n <PaginationPrevious href={`/blogs?page=${props.currentPage - 1}`} />\n </PaginationItem>\n )}\n\n {visiblePages.map((pageNum, idx) => (\n pageNum === null ? (\n <PaginationItem key={`ellipsis-${idx}`}>\n <PaginationEllipsis />\n </PaginationItem>\n ) : (\n <PaginationItem key={pageNum}>\n <PaginationLink\n href={`/blogs?page=${pageNum}`}\n isActive={pageNum === props.currentPage}\n >\n {pageNum}\n </PaginationLink>\n </PaginationItem>\n )\n ))}\n\n {props.currentPage < props.totalPages && (\n <PaginationItem>\n <PaginationNext href={`/blogs?page=${props.currentPage + 1}`} />\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )}\n </div>\n );\n}\n\nexport function withServerSideProps(pageConfig: GetStaticPropsParams) {\n return {\n async getServerSideProps({ query }: { query: { \n page?: string,\n category?: string,\n tags?: string\n } }) {\n try {\n const currentPage = query.page ? parseInt(query.page as string) : 1;\n const postsPerPage = pageConfig.displayOptions?.blogPerPage || DEFAULT_BLOG_PER_PAGE;\n \n const { blogs, total } = await getBlogPostsPageRouter(pageConfig.config, {\n index: (currentPage - 1) * postsPerPage,\n limit: postsPerPage,\n category: query.category,\n tags: query.tags ? query.tags.split(',') : undefined\n });\n \n const totalPages = Math.ceil(total / postsPerPage);\n\n return {\n props: {\n blogs,\n type: pageConfig.type,\n displayOptions: pageConfig.displayOptions || {},\n currentPage,\n totalPages\n }\n };\n } catch (error) {\n console.error('Error fetching blog posts:', error);\n return {\n notFound: true\n };\n }\n }\n };\n}","'use client';\n\nimport { Article } from './Article';\nimport { EasyBlogConfig } from '../models';\nimport { getBlogPathsPageRouter, getBlogPostPageRouter } from '../NextPageRouterUtils';\nimport React from 'react';\n\ninterface NextBlogPageForPageRouterProps {\n post: any;\n htmlContent: string;\n config: EasyBlogConfig;\n style?: React.CSSProperties;\n}\n\ninterface GetStaticPropsParams {\n config: EasyBlogConfig;\n}\n\nexport function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps) {\n if (!props.post) {\n return null; // Or your custom 404 component\n }\n\n return (\n <Article \n post={props.post} \n content={props.htmlContent}\n style={props.style}\n />\n );\n}\n\nexport function withStaticProps(pageConfig: GetStaticPropsParams) {\n return {\n async getStaticProps({ params }: { params: { slug: string } }) {\n try {\n const response = await getBlogPostPageRouter({\n apiKey: pageConfig.config.apiKey,\n projectId: pageConfig.config.projectId,\n apiUrl: pageConfig.config.apiUrl\n }, params.slug);\n\n if (!response.blog) {\n return {\n notFound: true\n };\n }\n\n return {\n props: {\n post: response.blog,\n htmlContent: response.html_content\n },\n revalidate: 60\n };\n } catch (error) {\n console.error('Error fetching blog post:', error);\n return {\n notFound: true\n };\n }\n },\n\n async getStaticPaths() {\n try {\n const paths = await getBlogPathsPageRouter(pageConfig.config);\n \n return {\n paths,\n fallback: 'blocking'\n };\n } catch (error) {\n console.error('Error fetching blog slugs:', error);\n return {\n paths: [],\n fallback: 'blocking'\n };\n }\n }\n }\n}\n"],"mappings":"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","names":["React","notFound","React","React","React","notFound","React","React","React","React","React","Link","React","Link","React","React","React","cva","cva","Link","Link","React","getAuthToken","React","DEFAULT_BLOG_PER_PAGE","React","React"]}
@@ -0,0 +1,34 @@
1
+ interface PaginatedResponse<T> {
2
+ data: T[];
3
+ metadata: {
4
+ currentPage: number;
5
+ totalPages: number;
6
+ totalItems: number;
7
+ itemsPerPage: number;
8
+ };
9
+ }
10
+ interface BlogQueryParams {
11
+ page?: number;
12
+ limit?: number;
13
+ category?: string;
14
+ tag?: string;
15
+ search?: string;
16
+ }
17
+ interface EasyBlogConfig {
18
+ apiKey: string;
19
+ projectId: string;
20
+ apiUrl: string;
21
+ }
22
+ interface GetStaticPropsContext {
23
+ params?: Record<string, string>;
24
+ preview?: boolean;
25
+ previewData?: any;
26
+ }
27
+ interface IQueryParams {
28
+ index?: number;
29
+ limit?: number;
30
+ category?: string;
31
+ tags?: string[];
32
+ }
33
+
34
+ export type { BlogQueryParams, EasyBlogConfig, GetStaticPropsContext, IQueryParams, PaginatedResponse };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=models.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,96 @@
1
+ import { EasyBlogConfig, IQueryParams } from './models.js';
2
+ import React from 'react';
3
+
4
+ interface NextBlogListPageForPageRouterProps {
5
+ blogs: any[];
6
+ type: 'grid' | 'list';
7
+ currentPage: number;
8
+ totalPages: number;
9
+ displayOptions?: {
10
+ showThumbnail?: boolean;
11
+ showReadingTime?: boolean;
12
+ showExcerpt?: boolean;
13
+ showTags?: boolean;
14
+ showDate?: boolean;
15
+ showAuthor?: boolean;
16
+ showCategory?: boolean;
17
+ isNextPage?: boolean;
18
+ blogPerPage?: number;
19
+ };
20
+ }
21
+ interface GetStaticPropsParams$1 {
22
+ config: EasyBlogConfig;
23
+ type: 'grid' | 'list';
24
+ displayOptions?: NextBlogListPageForPageRouterProps['displayOptions'];
25
+ }
26
+ declare function NextBlogListPageForPageRouter(props: NextBlogListPageForPageRouterProps): React.JSX.Element | null;
27
+ declare function withServerSideProps(pageConfig: GetStaticPropsParams$1): {
28
+ getServerSideProps({ query }: {
29
+ query: {
30
+ page?: string;
31
+ category?: string;
32
+ tags?: string;
33
+ };
34
+ }): Promise<{
35
+ props: {
36
+ blogs: any;
37
+ type: "grid" | "list";
38
+ displayOptions: {
39
+ showThumbnail?: boolean;
40
+ showReadingTime?: boolean;
41
+ showExcerpt?: boolean;
42
+ showTags?: boolean;
43
+ showDate?: boolean;
44
+ showAuthor?: boolean;
45
+ showCategory?: boolean;
46
+ isNextPage?: boolean;
47
+ blogPerPage?: number;
48
+ };
49
+ currentPage: number;
50
+ totalPages: number;
51
+ };
52
+ notFound?: undefined;
53
+ } | {
54
+ notFound: boolean;
55
+ props?: undefined;
56
+ }>;
57
+ };
58
+
59
+ interface NextBlogPageForPageRouterProps {
60
+ post: any;
61
+ htmlContent: string;
62
+ config: EasyBlogConfig;
63
+ style?: React.CSSProperties;
64
+ }
65
+ interface GetStaticPropsParams {
66
+ config: EasyBlogConfig;
67
+ }
68
+ declare function NextBlogPageForPageRouter(props: NextBlogPageForPageRouterProps): React.JSX.Element | null;
69
+ declare function withStaticProps(pageConfig: GetStaticPropsParams): {
70
+ getStaticProps({ params }: {
71
+ params: {
72
+ slug: string;
73
+ };
74
+ }): Promise<{
75
+ notFound: boolean;
76
+ props?: undefined;
77
+ revalidate?: undefined;
78
+ } | {
79
+ props: {
80
+ post: any;
81
+ htmlContent: any;
82
+ };
83
+ revalidate: number;
84
+ notFound?: undefined;
85
+ }>;
86
+ getStaticPaths(): Promise<{
87
+ paths: any;
88
+ fallback: string;
89
+ }>;
90
+ };
91
+
92
+ declare function getBlogPostsPageRouter(config: EasyBlogConfig, params?: IQueryParams): Promise<any>;
93
+ declare function getBlogPostPageRouter(config: EasyBlogConfig, slug: string): Promise<any>;
94
+ declare function getBlogPathsPageRouter(config: EasyBlogConfig): Promise<any>;
95
+
96
+ export { NextBlogListPageForPageRouter, NextBlogPageForPageRouter, getBlogPathsPageRouter, getBlogPostPageRouter, getBlogPostsPageRouter, withServerSideProps as withListServerSideProps, withStaticProps as withPageStaticProps };