@contenify/chatbot 3.0.0 → 4.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.
- package/README.md +70 -203
- package/dist/index.d.mts +1 -42
- package/dist/index.d.ts +1 -42
- package/dist/index.js +1693 -1225
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1677 -1209
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1311 -78
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../contexts/PreferencesContext.tsx","../lib/api.ts","../lib/config.ts","../services/preferences.service.ts","../components/chatbot/ChatBot.tsx","../src/utils/ aiJsonParser.ts","../src/utils/decodeUnicode.ts","../src/utils/articleTextToHtml.ts","../src/utils/formatAIContent.ts","../components/chatbot/ChatWindow.tsx","../components/chatbot/EditModal.tsx","../components/chatbot/RichTextEditor.tsx","../hooks/useTheme.ts","../components/news/NewsList.tsx","../services/news.service.ts","../components/chatbot/UserMenu.tsx","../components/chatbot/headerBar.tsx","../components/ui/Drawer.tsx","../components/preferences/Preferences.tsx","../services/settings.service.ts","../components/ClientSelect.tsx","../src/utils/util.ts","../services/chat.service.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect } from \"react\"\nimport { PreferencesProvider } from \"../contexts/PreferencesContext\"\nimport ChatBot from \"../components/chatbot/ChatBot\"\nimport { setConfig } from \"../lib/config\"\n\nexport interface ContenifyChatBotProps {\n apiUrl?: string\n apiKey?: string\n domain?: string\n onPost?: (content: string, keywords: string[]) => void\n}\n\nexport function ContenifyChatBot({ apiUrl, apiKey, domain, onPost }: ContenifyChatBotProps) {\n useEffect(() => {\n setConfig({ apiUrl, apiKey, domain })\n }, [apiUrl, apiKey, domain])\n\n return (\n <PreferencesProvider>\n <ChatBot onPost={onPost} />\n </PreferencesProvider>\n )\n}\n\nexport default ContenifyChatBot\n\n// Re-export types for consumers\nexport type {\n ChatbotPreferences,\n LocalizationPreferences,\n AppearancePreferences,\n ContentPreferences,\n Preferences,\n} from \"../contexts/PreferencesContext\"\n\nexport type {\n ContentOption,\n AnalyzeInputResponse,\n CreateContentPayload,\n RecreateSettings,\n} from \"../services/chat.service\"\n\n// Re-export config utilities for consumers\nexport { setConfig } from \"../lib/config\"\n","'use client'\nimport { createContext, useContext, useState, useEffect, ReactNode } from 'react'\nimport { getMyPreferencesApi } from '@/services/preferences.service'\nimport { getServerBaseUrl } from '@/lib/config'\n\nexport interface ChatbotPreferences {\n name: string\n logoUrl?: string\n primaryColor: string\n secondaryColor: string\n theme: 'light' | 'dark' | 'system'\n}\n\nexport interface LocalizationPreferences {\n country: string\n state: string\n cities: string[]\n language: string\n locale: string\n timezone: string\n}\n\nexport interface AppearancePreferences {\n showSidebar: boolean\n showHeader: boolean\n activeThemePreset: string | null\n showNewsPanel: boolean\n}\n\nexport interface ContentPreferences {\n tone: 'formal' | 'casual' | 'engaging' | 'professional'\n style: 'news' | 'blog' | 'editorial' | 'summary'\n wordCount: 'short' | 'medium' | 'long'\n includeQuotes: boolean\n includeFAQ: boolean\n targetAudience: string\n}\n\nexport interface Preferences {\n chatbot: ChatbotPreferences\n localization: LocalizationPreferences\n appearance: AppearancePreferences\n content: ContentPreferences\n _id?: string\n user?: string\n isActive?: boolean\n createdAt?: string\n updatedAt?: string\n}\n\ninterface PreferencesContextType {\n preferences: Preferences | null\n loading: boolean\n error: string | null\n refreshPreferences: () => Promise<void>\n updatePreferences: (newPreferences: Preferences) => void\n}\n\nconst defaultPreferences: Preferences = {\n chatbot: {\n name: 'ContenifyAI Assistant',\n primaryColor: '#10b981',\n secondaryColor: '#064e3b',\n theme: 'system',\n },\n localization: {\n country: 'India',\n state: 'Uttar Pradesh',\n cities: [],\n language: 'en',\n locale: 'en-IN',\n timezone: 'Asia/Kolkata',\n },\n appearance: {\n showSidebar: true,\n showHeader: true,\n activeThemePreset: null,\n showNewsPanel: true,\n },\n content: {\n tone: 'engaging',\n style: 'blog',\n wordCount: 'medium',\n includeQuotes: true,\n includeFAQ: false,\n targetAudience: '',\n },\n}\n\nconst PreferencesContext = createContext<PreferencesContextType | undefined>(undefined)\n\nexport function PreferencesProvider({ children }: { children: ReactNode }) {\n const [preferences, setPreferences] = useState<Preferences | null>(defaultPreferences)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n const refreshPreferences = async () => {\n try {\n setLoading(true)\n setError(null)\n const data = await getMyPreferencesApi()\n\n if (data) {\n // Ensure logoUrl has full path\n if (data.chatbot?.logoUrl && !data.chatbot.logoUrl.startsWith('http')) {\n data.chatbot.logoUrl = `${getServerBaseUrl()}/${data.chatbot.logoUrl}`\n }\n\n // Merge API response with defaults to ensure all fields exist\n const mergedPreferences: Preferences = {\n ...defaultPreferences,\n ...data,\n chatbot: {\n ...defaultPreferences.chatbot,\n ...data.chatbot,\n },\n localization: {\n ...defaultPreferences.localization,\n ...data.localization,\n },\n appearance: {\n ...defaultPreferences.appearance,\n ...data.appearance,\n },\n content: {\n ...defaultPreferences.content,\n ...data.content,\n },\n }\n\n setPreferences(mergedPreferences)\n\n // Apply CSS variables for colors\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--color-primary', mergedPreferences.chatbot?.primaryColor || '#10b981')\n document.documentElement.style.setProperty('--color-secondary', mergedPreferences.chatbot?.secondaryColor || '#064e3b')\n }\n }\n } catch (err) {\n console.error('Failed to fetch preferences:', err)\n setError(err instanceof Error ? err.message : 'Failed to load preferences')\n setPreferences(defaultPreferences)\n } finally {\n setLoading(false)\n }\n }\n\n const updatePreferences = (newPreferences: Preferences) => {\n setPreferences(newPreferences)\n\n // Apply CSS variables for colors\n if (typeof document !== 'undefined') {\n document.documentElement.style.setProperty('--color-primary', newPreferences.chatbot?.primaryColor || '#10b981')\n document.documentElement.style.setProperty('--color-secondary', newPreferences.chatbot?.secondaryColor || '#064e3b')\n }\n }\n\n useEffect(() => {\n refreshPreferences()\n }, [])\n\n return (\n <PreferencesContext.Provider\n value={{\n preferences,\n loading,\n error,\n refreshPreferences,\n updatePreferences,\n }}\n >\n {children}\n </PreferencesContext.Provider>\n )\n}\n\nexport function usePreferences() {\n const context = useContext(PreferencesContext)\n if (context === undefined) {\n throw new Error('usePreferences must be used within a PreferencesProvider')\n }\n return context\n}\n","import axios from \"axios\"\nimport { getApiBaseUrl, getApiKey } from \"./config\"\n\nconst api = axios.create({\n baseURL: getApiBaseUrl(),\n withCredentials: true,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n})\n\n/**\n * Request middleware\n */\napi.interceptors.request.use(\n (config) => {\n const apiKey = getApiKey()\n if (apiKey) {\n config.headers[\"x-api-key\"] = apiKey\n }\n return config\n },\n (error) => Promise.reject(error)\n)\n\n/**\n * Response middleware\n */\napi.interceptors.response.use(\n (response) => response,\n (error) => {\n // Centralized error handling\n const message =\n error.response?.data?.message ||\n error.message ||\n \"Something went wrong\"\n\n return Promise.reject(message)\n }\n)\n\nexport default api\n","let _apiUrl = process.env.NEXT_PUBLIC_CONTENIFY_API_URL || \"http://localhost:8080/api\"\nlet _apiKey = process.env.NEXT_PUBLIC_API_KEY || \"\"\nlet _domain = process.env.NEXT_PUBLIC_DOMAIN || \"\"\n\nexport function setConfig(config: { apiUrl?: string; apiKey?: string; domain?: string }) {\n if (config.apiUrl) _apiUrl = config.apiUrl\n if (config.apiKey) _apiKey = config.apiKey\n if (config.domain) _domain = config.domain\n}\n\nexport function getApiBaseUrl(): string {\n return _apiUrl\n}\n\nexport function getServerBaseUrl(): string {\n return _apiUrl.replace(/\\/api\\/?$/, \"\")\n}\n\nexport function getApiKey(): string {\n return _apiKey\n}\n\nexport function getDomain(): string {\n return _domain\n}\n","import api from \"@/lib/api\"\n\n/**\n * Get logged-in user's chatbot preferences\n */\nexport const getMyPreferencesApi = async () => {\n const { data } = await api.get(\"/chatboat/preferences/me\")\n return data.data\n}\n\n/**\n * Create or update chatbot preferences\n */\nexport const savePreferencesApi = async ({\n botName,\n logo,\n state,\n cities,\n primaryColor,\n secondaryColor,\n theme,\n language,\n showSidebar,\n showHeader,\n activeThemePreset,\n showNewsPanel,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n}: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n primaryColor?: string\n secondaryColor?: string\n theme?: \"light\" | \"dark\" | \"system\"\n language?: string\n showSidebar?: boolean\n showHeader?: boolean\n activeThemePreset?: string | null\n showNewsPanel?: boolean\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const formData = new FormData()\n\n if (botName) {\n formData.append(\"botName\", botName)\n }\n\n if (logo) {\n formData.append(\"logo\", logo)\n }\n\n if (state) {\n formData.append(\"state\", state)\n }\n\n if (cities) {\n formData.append(\"cities\", JSON.stringify(cities))\n }\n\n if (primaryColor) {\n formData.append(\"primaryColor\", primaryColor)\n }\n\n if (secondaryColor) {\n formData.append(\"secondaryColor\", secondaryColor)\n }\n\n if (theme) {\n formData.append(\"theme\", theme)\n }\n\n if (language) {\n formData.append(\"language\", language)\n }\n\n if (showSidebar !== undefined) {\n formData.append(\"showSidebar\", String(showSidebar))\n }\n\n if (showHeader !== undefined) {\n formData.append(\"showHeader\", String(showHeader))\n }\n\n if (activeThemePreset !== undefined) {\n formData.append(\"activeThemePreset\", activeThemePreset ?? \"\")\n }\n\n if (showNewsPanel !== undefined) {\n formData.append(\"showNewsPanel\", String(showNewsPanel))\n }\n\n if (tone) {\n formData.append(\"tone\", tone)\n }\n\n if (style) {\n formData.append(\"style\", style)\n }\n\n if (wordCount) {\n formData.append(\"wordCount\", wordCount)\n }\n\n if (includeQuotes !== undefined) {\n formData.append(\"includeQuotes\", String(includeQuotes))\n }\n\n if (includeFAQ !== undefined) {\n formData.append(\"includeFAQ\", String(includeFAQ))\n }\n\n if (targetAudience !== undefined) {\n formData.append(\"targetAudience\", targetAudience)\n }\n\n const { data } = await api.put(\"/chatboat/preferences\", formData, {\n headers: {\n \"Content-Type\": \"multipart/form-data\",\n },\n })\n\n return data.data\n}\n\n/**\n * Reset chatbot preferences\n */\nexport const resetPreferencesApi = async () => {\n const { data } = await api.delete(\"/chatboat/preferences/me\")\n return data\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport ChatWindow from \"./ChatWindow\"\nimport HeaderBar from \"./headerBar\"\nimport Drawer from \"../ui/Drawer\"\nimport PreferencesPage from \"../preferences/Preferences\"\nimport {\n rewriteNewsStreamApi,\n rewriteNewsApi,\n analyzeInputApi,\n createContentStreamApi,\n createContentApi,\n type ContentOption,\n} from \"@/services/chat.service\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport toast from \"react-hot-toast\"\nimport { Loader2 } from \"lucide-react\"\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\n/**\n * Build a JSON string from the streaming buffers to store as message content.\n */\nfunction buildStructuredContent(title: string, article: string, metaKeywords: string[], subtitle = \"\", metaDescription = \"\"): string {\n return JSON.stringify({ title, subtitle, article, metaDescription, metaKeywords })\n}\n\nexport default function ChatBot({ onPost }: { onPost?: (content: string, keywords: string[]) => void }) {\n const { loading } = useTheme()\n const { preferences } = usePreferences()\n const [preferencesOpen, setPreferencesOpen] = useState(false)\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [isStreaming, setIsStreaming] = useState(false)\n const [activeField, setActiveField] = useState<string | null>(null)\n const [analyzedData, setAnalyzedData] = useState<{\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null>(null)\n\n\nconst handleRecreate = async ({ title, content, id }: { title: string; content?: string; id?: string }) => {\n const assistantId = crypto.randomUUID()\n\n // Add user message and empty assistant message\n setMessages(prev => [\n ...prev,\n {\n id: crypto.randomUUID(),\n role: \"user\",\n content: `Recreate this news:\\n ${title}`,\n },\n {\n id: assistantId,\n role: \"assistant\",\n content: \"\",\n },\n ])\n setIsStreaming(true)\n\n try {\n let hasStartedStreaming = false\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: structured } : m\n )\n )\n }\n\n // Get content preferences\n const contentPrefs = preferences?.content\n const lang = preferences?.localization?.language === \"hi\" ? \"Hindi\" : \"English\"\n\n // Try streaming API first\n try {\n await rewriteNewsStreamApi({\n article: content || \"\",\n language: lang,\n articleId: id,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n onFieldStart: (field) => {\n setActiveField(field)\n },\n onContent: (field, chunk) => {\n hasStartedStreaming = true\n if (field === \"title\") titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => {\n keywordsBuffer = keywords\n updateMessage()\n },\n onFieldEnd: () => {\n setActiveField(null)\n },\n onComplete: (data) => {\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: finalContent }\n : m\n )\n )\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Article created successfully!\")\n },\n onError: async (error) => {\n console.error(\"Streaming error:\", error)\n\n // If streaming hasn't started, try fallback to regular API\n if (!hasStartedStreaming) {\n throw error // Will be caught by outer catch\n } else {\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to complete article generation\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: (titleBuffer || articleBuffer) ? buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) : \"Failed to create article. Please try again.\" }\n : m\n )\n )\n }\n },\n })\n\n // Fallback: if stream ended without firing onComplete, finalize with buffers\n if (isStreaming) {\n if (titleBuffer || articleBuffer) {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: structured } : m\n )\n )\n }\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch (streamError) {\n // Fallback to regular API if streaming fails\n console.log(\"Streaming failed, using regular API...\", streamError)\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"\" }\n : m\n )\n )\n\n const result = await rewriteNewsApi({\n article: content || \"\",\n language: lang,\n articleId: id,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n })\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: typeof result === \"string\" ? result : JSON.stringify(result) }\n : m\n )\n )\n setIsStreaming(false)\n toast.success(\"Article created successfully!\")\n }\n } catch (err) {\n console.error(\"Complete Error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n toast.error((err as Error)?.message || \"An error occurred while creating the article\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Failed to create article. Please try again.\" }\n : m\n )\n )\n }\n}\n\n\n\n const handleSendMessage = async (text: string) => {\n const userMsgId = crypto.randomUUID()\n const assistantId = crypto.randomUUID()\n\n // Add user message\n setMessages(prev => [\n ...prev,\n { id: userMsgId, role: \"user\", content: text },\n ])\n\n // Check if input contains a URL\n const urlRegex = /https?:\\/\\/[^\\s]+/\n const hasUrl = urlRegex.test(text)\n\n if (hasUrl) {\n // Show analyzing state\n setMessages(prev => [\n ...prev,\n { id: assistantId, role: \"assistant\", content: \"Analyzing your link...\" },\n ])\n\n try {\n return;\n const result = await analyzeInputApi(text)\n\n if (result.hasUrl && result.options?.length > 0) {\n // Store analyzed data for when user picks an action\n setAnalyzedData({\n url: result.url || \"\",\n content: result.content || \"\",\n options: result.options,\n messageId: assistantId,\n })\n\n // Show options as assistant message\n const optionsList = result.options\n .map((opt) => `• **${opt.name}**${opt.description ? ` – ${opt.description}` : \"\"}`)\n .join(\"\\n\")\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? {\n ...m,\n content: `I found an article (${result.wordCount || 0} words). What would you like to do?\\n\\n${optionsList}`,\n }\n : m\n )\n )\n } else {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Could not extract content from that URL. Please try a different link.\" }\n : m\n )\n )\n }\n } catch (err) {\n console.error(\"Analyze input error:\", err)\n toast.error(\"Failed to analyze the link\")\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Failed to analyze the link. Please try again.\" }\n : m\n )\n )\n }\n } else {\n // No URL — send as regular chat (recreate flow with the text as article)\n setMessages(prev => [\n ...prev,\n { id: assistantId, role: \"assistant\", content: \"\" },\n ])\n setIsStreaming(true)\n\n try {\n const contentPrefs = preferences?.content\n const lang = preferences?.localization?.language === \"hi\" ? \"Hindi\" : \"English\"\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: structured } : m\n )\n )\n }\n\n await rewriteNewsStreamApi({\n article: text,\n language: lang,\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n includeQuotes: contentPrefs?.includeQuotes,\n includeFAQ: contentPrefs?.includeFAQ,\n targetAudience: contentPrefs?.targetAudience,\n onFieldStart: (field) => {\n setActiveField(field)\n },\n onContent: (field, chunk) => {\n if (field === \"title\") titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => {\n keywordsBuffer = keywords\n updateMessage()\n },\n onFieldEnd: () => {\n setActiveField(null)\n },\n onComplete: (data) => {\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: finalContent } : m\n )\n )\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Content generated!\")\n },\n onError: (error) => {\n console.error(\"Stream error:\", error)\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to generate content\")\n },\n })\n\n // Fallback: if stream ended without firing onComplete, finalize with buffers\n if (isStreaming) {\n if (titleBuffer || articleBuffer) {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: structured } : m\n )\n )\n }\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch (err) {\n console.error(\"Send message error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Failed to generate content. Please try again.\" }\n : m\n )\n )\n }\n }\n }\n\n /**\n * Handle when user selects a content action option (e.g. Recreate, Summary, etc.)\n */\n const handleSelectAction = async (actionId: string, url: string, content: string) => {\n const assistantId = crypto.randomUUID()\n\n // Clear analyzed data\n setAnalyzedData(null)\n\n const actionName = analyzedData?.options.find(o => o.id === actionId)?.name || actionId\n\n setMessages(prev => [\n ...prev,\n { id: crypto.randomUUID(), role: \"user\", content: `Action: ${actionName}` },\n { id: assistantId, role: \"assistant\", content: \"\" },\n ])\n setIsStreaming(true)\n\n try {\n const contentPrefs = preferences?.content\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: structured } : m\n )\n )\n }\n\n try {\n // Try streaming first\n await createContentStreamApi({\n url,\n content,\n actionId,\n settings: {\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n },\n onFieldStart: (field) => {\n setActiveField(field)\n },\n onContent: (field, chunk) => {\n if (field === \"title\") titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => {\n keywordsBuffer = keywords\n updateMessage()\n },\n onFieldEnd: () => {\n setActiveField(null)\n },\n onComplete: (data) => {\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: finalContent } : m\n )\n )\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Content created!\")\n },\n onError: (error) => {\n console.error(\"Stream error:\", error)\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to create content\")\n },\n })\n\n // Fallback: if stream ended without firing onComplete, finalize with buffers\n if (isStreaming) {\n if (titleBuffer || articleBuffer) {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: structured } : m\n )\n )\n }\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch {\n // Fallback to non-streaming\n const result = await createContentApi({ url, content, actionId, settings: {\n tone: contentPrefs?.tone,\n style: contentPrefs?.style,\n wordCount: contentPrefs?.wordCount,\n }})\n\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: typeof result === \"string\" ? result : JSON.stringify(result) }\n : m\n )\n )\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Content created!\")\n }\n } catch (err) {\n console.error(\"Create content error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Failed to create content. Please try again.\" }\n : m\n )\n )\n }\n }\n\n // Show loading screen while preferences are loading\n if (loading) {\n return (\n <div className=\"cnfy-loading\">\n <div className=\"cnfy-loading-inner\">\n <Loader2 className=\"cnfy-loading-spinner cnfy-animate-spin\" />\n <p className=\"cnfy-loading-text\">Loading...</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-root\">\n\n <HeaderBar onOpenPreferences={() => setPreferencesOpen(true)} />\n\n <div className=\"cnfy-main\">\n <section className=\"cnfy-chat-section cnfy-chat-section--full\">\n {/* Chat window */}\n <div className=\"cnfy-chat-inner\">\n <ChatWindow\n messages={messages}\n onSend={handleSendMessage}\n onSelectNews={handleRecreate}\n isStreaming={isStreaming}\n activeField={activeField}\n analyzedData={analyzedData}\n onSelectAction={handleSelectAction}\n onPost={onPost}\n />\n </div>\n\n {!messages.length && (\n <div className=\"cnfy-empty-state\">\n <div>\n <p className=\"cnfy-empty-state-title\">AI News Assistant</p>\n <p className=\"cnfy-empty-state-subtitle\">\n Type a message or paste a link to begin\n </p>\n </div>\n </div>\n )}\n </section>\n </div>\n\n <Drawer\n open={preferencesOpen}\n onClose={() => setPreferencesOpen(false)}\n title=\"Settings\"\n >\n <PreferencesPage />\n </Drawer>\n </div>\n )\n}\n","/* eslint-disable prefer-const */\n// utils/aiJsonParser.ts\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractJSON(raw: string): any | null {\n if (!raw) return null\n\n // remove markdown code blocks\n let cleaned = raw\n .replace(/```json/gi, \"\")\n .replace(/```/g, \"\")\n .trim()\n\n // locate first JSON object\n const first = cleaned.indexOf(\"{\")\n const last = cleaned.lastIndexOf(\"}\")\n\n if (first === -1 || last === -1 || last <= first) return null\n\n const possibleJson = cleaned.substring(first, last + 1)\n\n try {\n return JSON.parse(possibleJson)\n } catch (err) {\n console.warn(\"JSON parse failed:\", err)\n return null\n }\n}","// utils/decodeUnicode.ts\n\nexport function decodeUnicode(text: string): string {\n if (!text) return \"\"\n\n try {\n // converts \\u0930\\u093e\\u0924 into real Hindi characters\n return JSON.parse(`\"${text.replace(/\"/g, '\\\\\"')}\"`)\n } catch {\n return text\n }\n}","export function articleTextToHtml(text: string): string {\n if (!text) return \"\"\n\n // convert escaped newlines\n text = text.replace(/\\\\n/g, \"\\n\")\n\n const lines = text\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean)\n\n let html = \"\"\n\n for (const line of lines) {\n\n // detect headings\n if (line.length < 80 && !line.endsWith(\"।\") && !line.endsWith(\".\")) {\n html += `<h2>${line}</h2>`\n continue\n }\n\n // normal paragraph\n html += `<p>${line}</p>`\n }\n\n return html\n}","// utils/formatAIContent.ts\n\nimport { extractJSON } from \"./ aiJsonParser\"\nimport { decodeUnicode } from \"./decodeUnicode\"\nimport { ParsedContent } from \"../types/ai\"\nimport { articleTextToHtml } from \"./articleTextToHtml\"\n\nexport function formatAIContent(raw?: string): ParsedContent {\n const empty: ParsedContent = {\n isArticle: false,\n title: \"\",\n subtitle: \"\",\n articleHtml: \"\",\n article: \"\",\n metaDescription: \"\",\n metaKeywords: [],\n plainText: \"\",\n }\n\n if (!raw) return empty\n\n const parsed = extractJSON(raw)\n\n if (parsed && (parsed.title || parsed.article)) {\n const rawArticle = (parsed.article || \"\").trim()\n const safeArticle = decodeUnicode(rawArticle)\n\n // If article already contains HTML tags, use it directly; otherwise convert text to HTML\n const isHtml = /<[a-z][\\s\\S]*>/i.test(safeArticle)\n const articleHtml = isHtml ? safeArticle : articleTextToHtml(safeArticle)\n\n return {\n isArticle: true,\n title: parsed.title || \"\",\n subtitle: parsed.subtitle || \"\",\n articleHtml,\n article: rawArticle,\n metaDescription: parsed.metaDescription || \"\",\n metaKeywords: Array.isArray(parsed.metaKeywords)\n ? parsed.metaKeywords\n : [],\n plainText: raw,\n }\n }\n\n return { ...empty, plainText: raw }\n}","\"use client\"\n\nimport { formatAIContent } from \"@/src/utils/formatAIContent\"\nimport { Check, Copy, Edit3, Send, SendHorizontal, Zap, X, RefreshCcw, FileText, ListChecks, Share2, BookOpen, Mail, Key, Loader2 } from \"lucide-react\"\nimport type { ContentOption } from \"@/services/chat.service\"\nimport { useLayoutEffect, useRef, useState, useEffect } from \"react\"\nimport EditModal from \"./EditModal\"\nimport NewsList from \"../news/NewsList\"\nimport { getTrendingNews, getNewsSources, getNewsBySource, scrapeNewsSource } from \"@/services/news.service\"\nimport Select, { SingleValue } from \"react-select\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport type { ParsedContent } from \"@/src/types/ai\"\n\ninterface SourceOption {\n value: string | null\n label: string\n}\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\n\n\nconst ACTION_ICONS: Record<string, typeof FileText> = {\n recreate_article: RefreshCcw,\n create_summary: ListChecks,\n create_social_posts: Share2,\n create_blog_post: BookOpen,\n create_newsletter: Mail,\n extract_key_points: Key,\n}\n\nexport default function ChatWindow({\n messages,\n onSend,\n onSelectNews,\n isStreaming = false,\n activeField,\n analyzedData,\n onSelectAction,\n onPost: onPostCallback,\n}: {\n messages: ChatMessage[]\n onSend: (message: string) => void\n onSelectNews?: (news: { title: string; content?: string; id?: string }) => void\n isStreaming?: boolean\n activeField?: string | null\n analyzedData?: {\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null\n onSelectAction?: (actionId: string, url: string, content: string) => void\n onPost?: (content: string, keywords: string[]) => void\n}) {\n const { showNewsPanel } = useTheme()\n const bottomRef = useRef<HTMLDivElement>(null)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const [input, setInput] = useState(\"\")\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [showNewsDropdown, setShowNewsDropdown] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [trendingNews, setTrendingNews] = useState<any[]>([])\n const [loadingNews, setLoadingNews] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [sources, setSources] = useState<any[]>([])\n const [selectedSource, setSelectedSource] = useState<string | null>(null)\n const [loadingSources, setLoadingSources] = useState(false)\n const [scraping, setScraping] = useState(false)\n const [editModal, setEditModal] = useState<{\n isOpen: boolean\n title: string\n subtitle: string\n content: string\n metaDescription: string\n metaKeywords: string[]\n messageId: string\n }>({ isOpen: false, title: \"\", subtitle: \"\", content: \"\", metaDescription: \"\", metaKeywords: [], messageId: \"\" })\n\n const { primaryColor } = useTheme();\n const { preferences } = usePreferences();\n const preferredLanguage = preferences?.localization?.language;\n\n\n const handleCopy = async (parsed: ParsedContent, messageId: string) => {\n try {\n const tempDiv = document.createElement(\"div\")\n let textContent = \"\"\n\n if (parsed.title) textContent += parsed.title + \"\\n\\n\"\n if (parsed.subtitle) textContent += parsed.subtitle + \"\\n\\n\"\n if (parsed.articleHtml) {\n tempDiv.innerHTML = parsed.articleHtml\n textContent += tempDiv.textContent || tempDiv.innerText || \"\"\n }\n if (parsed.metaDescription) textContent += \"\\n\\nMeta Description:\\n\" + parsed.metaDescription\n\n await navigator.clipboard.writeText(textContent)\n setCopiedId(messageId)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n const handleEdit = (parsed: ParsedContent, messageId: string) => {\n setEditModal({\n isOpen: true,\n title: parsed.title || \"\",\n subtitle: parsed.subtitle || \"\",\n content: parsed.articleHtml || \"\",\n metaDescription: parsed.metaDescription || \"\",\n metaKeywords: parsed.metaKeywords,\n messageId,\n })\n }\n\n const handleCloseModal = () => {\n setEditModal({ isOpen: false, title: \"\", subtitle: \"\", content: \"\", metaDescription: \"\", metaKeywords: [], messageId: \"\" })\n }\n\n const handleSaveDraft = (data: { article: string; keywords: string[] }) => {\n console.log(\"Saving draft:\", data)\n handleCloseModal()\n }\n\n const handlePost = (data: { article: string; keywords: string[] }) => {\n onPostCallback?.(data.article, data.keywords)\n handleCloseModal()\n }\n\n useLayoutEffect(() => {\n bottomRef.current?.scrollIntoView({ block: \"end\" })\n }, [messages])\n\n const handleSend = () => {\n if (!input.trim()) return\n onSend(input)\n setInput(\"\")\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\"\n }\n }\n\n // Auto-resize textarea based on content\n useEffect(() => {\n const textarea = textareaRef.current\n if (textarea) {\n textarea.style.height = \"auto\"\n textarea.style.height = `${textarea.scrollHeight}px`\n }\n }, [input])\n\n const fetchSources = async () => {\n setLoadingSources(true)\n try {\n const data = await getNewsSources()\n setSources(data || [])\n } catch (err) {\n console.error(\"Failed to fetch sources:\", err)\n } finally {\n setLoadingSources(false)\n }\n }\n\n const fetchNews = async (sourceId: string | null) => {\n setLoadingNews(true)\n try {\n let data\n if (sourceId) {\n data = await getNewsBySource(sourceId)\n } else {\n data = await getTrendingNews()\n }\n setTrendingNews(data || [])\n } catch (err) {\n console.error(\"Failed to fetch news:\", err)\n } finally {\n setLoadingNews(false)\n }\n }\n\n const handleScrape = async () => {\n if (!selectedSource) return\n setScraping(true)\n try {\n await scrapeNewsSource(selectedSource)\n await fetchNews(selectedSource)\n } catch (err) {\n console.error(\"Failed to scrape:\", err)\n } finally {\n setScraping(false)\n }\n }\n\n const handleSourceSelect = (option: SingleValue<SourceOption>) => {\n const sourceId = option?.value ?? null\n setSelectedSource(sourceId)\n fetchNews(sourceId)\n }\n\n const handleOpenNewsDropdown = () => {\n setShowNewsDropdown(true)\n if (sources.length === 0) {\n fetchSources()\n }\n if (trendingNews.length === 0) {\n fetchNews(selectedSource)\n }\n }\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setShowNewsDropdown(false)\n }\n }\n\n if (showNewsDropdown) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [showNewsDropdown])\n\n\n\n return (\n <div className=\"cnfy-chat\">\n {/* Chat Area */}\n <div className=\"cnfy-chat-area\">\n <div className=\"cnfy-chat-scroll\">\n {messages.map(msg => {\n const parsed = formatAIContent(msg.content)\n\n return (\n <div key={msg.id} className=\"cnfy-msg\">\n <div className={msg.role === \"assistant\"?`cnfy-msg-body`:`cnfy-msg-body you`}>\n {/* Copy button for article content */}\n {msg.role === \"assistant\" && parsed.isArticle && (\n <div className=\"cnfy-msg-copy-row\">\n <button\n onClick={() => handleCopy(parsed, msg.id)}\n className=\"cnfy-copy-btn\"\n title=\"Copy to clipboard\"\n >\n {copiedId === msg.id ? (\n <Check size={16} className=\"cnfy-copy-icon--copied\" />\n ) : (\n <Copy size={16} />\n )}\n </button>\n </div>\n )}\n\n {/* Creating indicator - show when streaming and message is empty */}\n {msg.role === \"assistant\" && isStreaming && msg.id === messages[messages.length - 1]?.id && !parsed.isArticle && !parsed.plainText && (\n <div className=\"cnfy-creating-indicator\">\n <Loader2 size={16} className=\"cnfy-animate-spin\" />\n <span>Creating article...</span>\n </div>\n )}\n\n {/* Article content - structured rendering */}\n {parsed.isArticle ? (\n <>\n {/* Title — plain text */}\n {parsed.title && (\n <h1 className=\"cnfy-block-h1\">\n {parsed.title}\n {activeField === \"title\" && <span className=\"cnfy-cursor-blink\">|</span>}\n </h1>\n )}\n\n {parsed.subtitle && (\n <h1 className=\"cnfy-block-h2\">\n {parsed.subtitle}\n {activeField === \"subtitle\" && <span className=\"cnfy-cursor-blink\">|</span>}\n </h1>\n )}\n <hr className=\"cnfy-divider\" />\n {/* Article — streamed HTML, render directly */}\n {parsed.articleHtml && (\n <div\n className=\"cnfy-article-content\"\n dangerouslySetInnerHTML={{ __html: parsed.articleHtml }}\n />\n )}\n {activeField === \"article\" && <span className=\"cnfy-cursor-blink\">|</span>}\n </>\n ) : (\n /* Plain text messages (status, error, options, etc.) */\n parsed.plainText && (\n <p className=\"cnfy-block-p\">{parsed.plainText}</p>\n )\n )}\n\n {parsed.metaDescription && (\n <div className=\"cnfy-msg-keywords\">\n <div className=\"cnfy-msg-keywords-label\">Meta Description</div>\n <div className=\"cnfy-block-p\">\n {parsed.metaDescription}\n </div>\n </div>\n )}\n\n {/* Meta Keywords */}\n {parsed.metaKeywords.length > 0 && (\n <div className=\"cnfy-msg-keywords\">\n <div className=\"cnfy-msg-keywords-label\">Keywords</div>\n <div className=\"cnfy-msg-keywords-list\">\n {parsed.metaKeywords.map((tag, i) => (\n <span\n key={i}\n className=\"cnfy-msg-keyword-tag\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Content action options - show when URL was analyzed */}\n {msg.role === \"assistant\" && analyzedData?.messageId === msg.id && analyzedData.options.length > 0 && (\n <div className=\"cnfy-action-options\">\n {analyzedData.options.map((option) => {\n const IconComponent = ACTION_ICONS[option.id] || FileText\n return (\n <button\n key={option.id}\n onClick={() => onSelectAction?.(option.id, analyzedData.url, analyzedData.content)}\n className=\"cnfy-action-btn\"\n >\n <IconComponent size={16} />\n {option.name}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Edit and Post buttons for AI responses - only show when streaming is complete */}\n {msg.role === \"assistant\" && parsed.isArticle && !analyzedData?.messageId && (!isStreaming || msg.id !== messages[messages.length - 1]?.id) && (\n <div className=\"cnfy-msg-actions\">\n <button\n onClick={() => handleEdit(parsed, msg.id)}\n className=\"cnfy-btn-edit\"\n >\n <Edit3 size={16} />\n Edit\n </button>\n <button\n onClick={() => handlePost({ article: parsed.articleHtml, keywords: parsed.metaKeywords })}\n className=\"cnfy-btn-post\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <Send size={16} />\n Post\n </button>\n </div>\n )}\n </div>\n </div>\n )\n })}\n\n <div ref={bottomRef} />\n </div>\n </div>\n\n {/* Input */}\n <div className=\"cnfy-input-area\">\n <div className=\"cnfy-input-inner\">\n {/* Pulse Icon - Trending News */}\n <div ref={dropdownRef} className=\"cnfy-news-pulse-wrap\">\n <button\n onClick={handleOpenNewsDropdown}\n className=\"cnfy-news-pulse-btn cnfy-animate-pulse\"\n title=\"Select from trending news\"\n >\n <Zap size={16} />\n </button>\n\n {/* News Dropdown */}\n {showNewsDropdown && (\n <div className=\"cnfy-news-dropdown\">\n {/* Header */}\n <div className=\"cnfy-news-dropdown-header\" style={{ backgroundColor: primaryColor, color: \"#fff\" }}>\n <span className=\"cnfy-news-dropdown-title\">Select News</span>\n <button\n onClick={() => setShowNewsDropdown(false)}\n className=\"cnfy-news-dropdown-close\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <X size={14} />\n </button>\n </div>\n\n {/* Source Selector */}\n <div className=\"cnfy-news-dropdown-source\">\n {/* Source Dropdown with react-select */}\n <div className=\"cnfy-news-dropdown-select-wrap\">\n <Select<SourceOption>\n options={[\n { value: null, label: \"All Sources (Trending)\" },\n ...sources\n .filter((source) => !preferredLanguage || source.language === preferredLanguage)\n .map((source) => ({\n value: source.id,\n label: source.name,\n })),\n ]}\n value={\n selectedSource\n ? { value: selectedSource, label: sources.find(s => s.id === selectedSource)?.name || selectedSource }\n : { value: null, label: \"All Sources (Trending)\" }\n }\n onChange={handleSourceSelect}\n isLoading={loadingSources}\n isDisabled={loadingSources}\n placeholder=\"Select source...\"\n classNamePrefix=\"react-select\"\n menuPlacement=\"bottom\"\n menuPosition=\"fixed\"\n menuShouldScrollIntoView={false}\n maxMenuHeight={220}\n menuPortalTarget={typeof window !== \"undefined\" ? document.body : null}\n styles={{\n container: (base) => ({\n ...base,\n width: \"100%\",\n }),\n control: (base) => ({\n ...base,\n minHeight: \"38px\",\n borderColor: \"#e5e7eb\",\n boxShadow: \"none\",\n width: \"100%\",\n }),\n menu: (base) => ({\n ...base,\n width: \"100%\",\n zIndex: 999999,\n }),\n menuPortal: (base) => ({\n ...base,\n zIndex: 999999,\n }),\n option: (base, state) => ({\n ...base,\n backgroundColor: state.isSelected\n ? primaryColor\n : state.isFocused\n ? \"#f3f4f6\"\n : \"white\",\n color: state.isSelected ? \"white\" : \"#374151\",\n cursor: \"pointer\",\n }),\n }}\n />\n </div>\n\n {/* Scrape Button */}\n {selectedSource && (\n <button\n onClick={handleScrape}\n disabled={scraping}\n className=\"cnfy-scrape-btn\"\n title=\"Fetch latest news\"\n >\n <RefreshCcw size={14} className={scraping ? 'cnfy-animate-spin' : ''} />\n {scraping ? 'Scraping...' : 'Scrape'}\n </button>\n )}\n\n {/* Refresh Button for trending */}\n {!selectedSource && (\n <button\n onClick={() => fetchNews(null)}\n disabled={loadingNews}\n className=\"cnfy-refresh-btn\"\n >\n <RefreshCcw size={14} className={loadingNews ? 'cnfy-animate-spin' : ''} />\n Refresh\n </button>\n )}\n </div>\n\n {/* News List */}\n <div className=\"cnfy-news-dropdown-list\">\n {loadingNews ? (\n <div className=\"cnfy-news-dropdown-msg\">\n Loading news...\n </div>\n ) : trendingNews.length === 0 ? (\n <div className=\"cnfy-news-dropdown-msg\">\n <p>No news found.</p>\n {selectedSource && (\n <p className=\"cnfy-news-dropdown-hint\">Click "Scrape" to fetch latest news.</p>\n )}\n </div>\n ) : (\n <NewsList\n news={trendingNews.slice(0, 10)}\n onView={(item) => window.open(item.sourceUrl || item.link, \"_blank\")}\n onRecreate={(payload) => {\n setShowNewsDropdown(false)\n onSelectNews?.(payload)\n }}\n />\n )}\n </div>\n </div>\n )}\n </div>\n\n <textarea\n ref={textareaRef}\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={e => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }}\n rows={1}\n placeholder=\"Ask AI something…\"\n className={`cnfy-chat-textarea ${!showNewsPanel ? 'cnfy-chat-textarea--with-pulse' : ''}`}\n style={{ maxHeight: \"200px\", overflowY: input.split(\"\\n\").length > 6 ? \"auto\" : \"hidden\" }}\n disabled\n />\n <button\n onClick={handleSend}\n className=\"cnfy-send-btn\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n <SendHorizontal size={18} />\n </button>\n </div>\n </div>\n\n {/* Edit Modal */}\n <EditModal\n isOpen={editModal.isOpen}\n initialTitle={editModal.title}\n initialSubtitle={editModal.subtitle}\n initialContent={editModal.content}\n initialMetaDescription={editModal.metaDescription}\n metaKeywords={editModal.metaKeywords}\n onClose={handleCloseModal}\n onSaveDraft={(data) => handleSaveDraft({ article: data.article, keywords: data.keywords })}\n onPost={(data) => handlePost({ article: data.article, keywords: data.keywords })}\n />\n </div>\n )\n}\n","\"use client\"\n\nimport { X } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\nimport RichTextEditor from \"./RichTextEditor\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nexport type ArticleEditData = {\n title: string\n subtitle: string\n article: string\n metaDescription: string\n slug: string\n keywords: string[]\n}\n\ntype EditModalProps = {\n isOpen: boolean\n initialTitle?: string\n initialSubtitle?: string\n initialContent: string\n initialMetaDescription?: string\n metaKeywords: string[]\n onClose: () => void\n onSaveDraft: (data: ArticleEditData) => void\n onPost: (data: ArticleEditData) => void\n}\n\nfunction toSlug(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n}\n\nexport default function EditModal({\n isOpen,\n initialTitle = \"\",\n initialSubtitle = \"\",\n initialContent,\n initialMetaDescription = \"\",\n metaKeywords,\n onClose,\n onSaveDraft,\n onPost,\n}: EditModalProps) {\n const { primaryColor } = useTheme()\n const [title, setTitle] = useState(\"\")\n const [subtitle, setSubtitle] = useState(\"\")\n const [slug, setSlug] = useState(\"\")\n const [slugEdited, setSlugEdited] = useState(false)\n const [metaDescription, setMetaDescription] = useState(\"\")\n const [content, setContent] = useState(\"\")\n const [keywords, setKeywords] = useState<string[]>(metaKeywords)\n const [newKeyword, setNewKeyword] = useState(\"\")\n\n useEffect(() => {\n setTitle(initialTitle)\n setSubtitle(initialSubtitle)\n setMetaDescription(initialMetaDescription)\n setSlug(toSlug(initialTitle))\n setSlugEdited(false)\n setContent(initialContent)\n setKeywords(metaKeywords)\n }, [initialTitle, initialSubtitle, initialContent, initialMetaDescription, metaKeywords])\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [isOpen])\n\n const handleTitleChange = (value: string) => {\n setTitle(value)\n if (!slugEdited) {\n setSlug(toSlug(value))\n }\n }\n\n const handleSlugChange = (value: string) => {\n setSlug(toSlug(value))\n setSlugEdited(true)\n }\n\n const handleAddKeyword = () => {\n if (newKeyword.trim() && !keywords.includes(newKeyword.trim())) {\n setKeywords([...keywords, newKeyword.trim()])\n setNewKeyword(\"\")\n }\n }\n\n const handleRemoveKeyword = (index: number) => {\n setKeywords(keywords.filter((_, i) => i !== index))\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleAddKeyword()\n }\n }\n\n const getEditData = (): ArticleEditData => ({\n title,\n subtitle,\n article: content,\n metaDescription,\n slug,\n keywords,\n })\n\n if (!isOpen) return null\n\n return (\n <div className=\"cnfy-edit-modal-overlay\">\n {/* Backdrop */}\n <div className=\"cnfy-edit-modal-backdrop\" onClick={onClose} />\n\n {/* Modal */}\n <div className=\"cnfy-edit-modal\">\n {/* Header */}\n <div className=\"cnfy-edit-modal-header\">\n <h2 className=\"cnfy-edit-modal-title\">Edit Article</h2>\n <button onClick={onClose} className=\"cnfy-edit-modal-close-btn\">\n <X size={20} className=\"cnfy-edit-modal-close-icon\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"cnfy-edit-modal-body\">\n\n {/* Title */}\n <div>\n <label className=\"cnfy-edit-label\">Title</label>\n <input\n type=\"text\"\n value={title}\n onChange={e => handleTitleChange(e.target.value)}\n placeholder=\"Article title...\"\n className=\"cnfy-edit-input\"\n />\n </div>\n\n {/* Subtitle */}\n <div>\n <label className=\"cnfy-edit-label\">Subtitle</label>\n <input\n type=\"text\"\n value={subtitle}\n onChange={e => setSubtitle(e.target.value)}\n placeholder=\"Article subtitle...\"\n className=\"cnfy-edit-input\"\n />\n </div>\n\n {/* Slug */}\n <div>\n <label className=\"cnfy-edit-label\">Slug</label>\n <input\n type=\"text\"\n value={slug}\n onChange={e => handleSlugChange(e.target.value)}\n placeholder=\"article-url-slug\"\n className=\"cnfy-edit-input cnfy-edit-input--mono\"\n />\n </div>\n\n {/* Article Content - WYSIWYG Editor */}\n <div>\n <label className=\"cnfy-edit-label\">Article Content</label>\n <RichTextEditor\n content={content}\n onChange={setContent}\n placeholder=\"Start writing your article...\"\n />\n </div>\n\n {/* Meta Description */}\n <div>\n <label className=\"cnfy-edit-label\">Meta Description</label>\n <textarea\n value={metaDescription}\n onChange={e => setMetaDescription(e.target.value)}\n placeholder=\"Brief description for search engines...\"\n className=\"cnfy-edit-textarea\"\n rows={3}\n />\n </div>\n\n {/* Meta Keywords */}\n <div>\n <label className=\"cnfy-edit-label\">Meta Keywords</label>\n <div className=\"cnfy-keyword-list\">\n {keywords.map((keyword, index) => (\n <span key={index} className=\"cnfy-keyword-tag\">\n #{keyword}\n <button\n onClick={() => handleRemoveKeyword(index)}\n className=\"cnfy-keyword-remove-btn\"\n >\n <X size={14} />\n </button>\n </span>\n ))}\n </div>\n <div className=\"cnfy-keyword-input-row\">\n <input\n type=\"text\"\n value={newKeyword}\n onChange={e => setNewKeyword(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add a keyword...\"\n className=\"cnfy-keyword-input\"\n />\n <button onClick={handleAddKeyword} className=\"cnfy-btn-add-keyword\">\n Add\n </button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n <div className=\"cnfy-edit-modal-footer\">\n <button onClick={onClose} className=\"cnfy-btn-footer-cancel\">\n Cancel\n </button>\n <button\n onClick={() => onSaveDraft(getEditData())}\n className=\"cnfy-btn-save-draft\"\n >\n Save Draft\n </button>\n <button\n onClick={() => onPost(getEditData())}\n className=\"cnfy-btn-post-article\"\n style={{ backgroundColor: primaryColor, color: \"#fff\" }}\n >\n Post\n </button>\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport StarterKit from \"@tiptap/starter-kit\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport {\n Bold,\n Italic,\n List,\n ListOrdered,\n Heading1,\n Heading2,\n Undo,\n Redo,\n Pilcrow,\n} from \"lucide-react\"\nimport { useEffect } from \"react\"\n\ntype RichTextEditorProps = {\n content: string\n onChange: (content: string) => void\n placeholder?: string\n}\n\nexport default function RichTextEditor({\n content,\n onChange,\n placeholder = \"Start writing your article...\",\n}: RichTextEditorProps) {\n const editor = useEditor({\n immediatelyRender: false, // Prevents SSR hydration mismatch\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2],\n },\n }),\n Placeholder.configure({\n placeholder,\n }),\n ],\n content: content,\n editorProps: {\n attributes: {\n class: \"ProseMirror\",\n },\n },\n onUpdate: ({ editor }) => {\n onChange(editor.getHTML())\n },\n })\n\n // Update editor content when prop changes\n useEffect(() => {\n if (editor && content !== editor.getHTML()) {\n editor.commands.setContent(content)\n }\n }, [content, editor])\n\n if (!editor) {\n return (\n <div className=\"cnfy-editor-loading\">\n Loading editor...\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-editor\">\n {/* Toolbar */}\n <div className=\"cnfy-toolbar\">\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n isActive={editor.isActive(\"heading\", { level: 1 })}\n title=\"Heading 1\"\n >\n <Heading1 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n isActive={editor.isActive(\"heading\", { level: 2 })}\n title=\"Heading 2\"\n >\n <Heading2 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().setParagraph().run()}\n isActive={editor.isActive(\"paragraph\")}\n title=\"Paragraph\"\n >\n <Pilcrow size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive(\"bold\")}\n title=\"Bold\"\n >\n <Bold size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive(\"italic\")}\n title=\"Italic\"\n >\n <Italic size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n <List size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n <ListOrdered size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo\"\n >\n <Undo size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo\"\n >\n <Redo size={18} />\n </ToolbarButton>\n </div>\n\n {/* Editor */}\n <EditorContent editor={editor} className=\"cnfy-editor-content\" />\n </div>\n )\n}\n\ntype ToolbarButtonProps = {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nfunction ToolbarButton({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`cnfy-toolbar-btn ${\n isActive ? \"cnfy-toolbar-btn--active\" : \"\"\n } ${disabled ? \"cnfy-toolbar-btn--disabled\" : \"\"}`}\n >\n {children}\n </button>\n )\n}\n","import { usePreferences } from '@/contexts/PreferencesContext'\n\nexport function useTheme() {\n const { preferences, loading } = usePreferences()\n\n return {\n loading,\n primaryColor: preferences?.chatbot?.primaryColor || '#10b981',\n secondaryColor: preferences?.chatbot?.secondaryColor || '#064e3b',\n botName: preferences?.chatbot?.name || 'AI News Assistant',\n logoUrl: preferences?.chatbot?.logoUrl,\n theme: preferences?.chatbot?.theme || 'system',\n showSidebar: preferences?.appearance?.showSidebar ?? true,\n showHeader: preferences?.appearance?.showHeader ?? true,\n activeThemePreset: preferences?.appearance?.activeThemePreset ?? null,\n showNewsPanel: preferences?.appearance?.showNewsPanel ?? true,\n }\n}\n","\"use client\"\nimport { useState } from \"react\"\nimport { Eye, RefreshCcw } from \"lucide-react\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nconst dateFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n})\n\nconst timeFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n})\n\nfunction extractLinksFromContent(html?: string) {\n if (!html) return []\n\n const parser = new DOMParser()\n const doc = parser.parseFromString(html, \"text/html\")\n\n return Array.from(doc.querySelectorAll(\"li\")).map((li) => {\n const anchor = li.querySelector(\"a\")\n const source = li.querySelector(\"font\")\n\n return {\n title: anchor?.textContent || \"\",\n url: anchor?.getAttribute(\"href\") || \"#\",\n source: source?.textContent || \"\",\n }\n })\n}\n\nexport default function NewsList({\n news,\n onView,\n onRecreate,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n news: any[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onView: (item: any) => void\n onRecreate: (payload: { title: string; content?: string; id?: string }) => void\n}) {\n\n const { primaryColor } = useTheme();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [primaryColorState] = useState<any>(primaryColor);\n\n const lightenColor = (hex:string, percent = 85) => {\n hex = hex.replace(\"#\", \"\");\n\n let r = parseInt(hex.substring(0, 2), 16);\n let g = parseInt(hex.substring(2, 4), 16);\n let b = parseInt(hex.substring(4, 6), 16);\n\n r = Math.round(r + (255 - r) * (percent / 100));\n g = Math.round(g + (255 - g) * (percent / 100));\n b = Math.round(b + (255 - b) * (percent / 100));\n\n return `rgb(${r}, ${g}, ${b})`;\n}\n\n\n\n\n return (\n <div className=\"cnfy-news-list\">\n {news.flatMap((item) => {\n const publishedDate = new Date(item.publishedAt)\n const links = extractLinksFromContent(item.content)\n\n // CHILD CARDS\n if (links.length > 0) {\n return links.map((link, idx) => (\n <div\n key={`${item._id}-link-${idx}`}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {link.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {link.source || item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => window.open(link.url, \"_blank\")}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: link.title,\n content: link.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n ))\n }\n\n // PARENT CARD\n return (\n <div\n key={item._id}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {item.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => onView(item)}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: item.title,\n content: item.content || item.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\nexport const getTrendingNews = async () => {\n const { data } = await api.get(\"/chatboat/trending\")\n return data.data\n}\n\n/**\n * Get list of available news sources (RSS feeds)\n */\nexport const getNewsSources = async () => {\n const { data } = await api.get(\"/chatboat/scrape/sources\")\n return data.data\n}\n\n/**\n * Scrape top 10 news from a specific source\n */\nexport const scrapeNewsSource = async (sourceId: string) => {\n const { data } = await api.post(\"/chatboat/scrape/source\", { sourceId })\n return data.data\n}\n\n/**\n * Get previously scraped news by source\n */\nexport const getNewsBySource = async (sourceId: string) => {\n const { data } = await api.get(`/chatboat/scrape/by-source/${sourceId}`)\n return data.data\n}\n","\"use client\"\n\nimport { Settings } from \"lucide-react\"\n\nexport default function UserMenu({\n onOpenPreferences,\n}: {\n onOpenPreferences?: () => void\n}) {\n return (\n <div className=\"cnfy-user-menu\">\n <button\n onClick={() => onOpenPreferences?.()}\n className=\"cnfy-user-menu-trigger\"\n aria-label=\"Settings\"\n >\n <Settings size={20} className=\"cnfy-user-menu-trigger-icon\" />\n </button>\n </div>\n )\n}\n","\"use client\"\n\nimport UserMenu from \"./UserMenu\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nexport default function HeaderBar({\n onOpenPreferences,\n}: {\n onOpenPreferences?: () => void\n}) {\n const { primaryColor, botName, logoUrl } = useTheme()\n\n return (\n <header className=\"cnfy-header\">\n <div className=\"cnfy-header-inner\">\n\n {/* Left: Logo + Brand */}\n <div className=\"cnfy-header-left\">\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" className=\"cnfy-header-logo-img\" />\n ) : (\n <div\n className=\"cnfy-header-logo-fallback\"\n style={{ backgroundColor: primaryColor }}\n >\n {botName.charAt(0).toUpperCase()}\n </div>\n )}\n <span className=\"cnfy-header-brand\">\n {botName.toUpperCase()}\n </span>\n </div>\n\n {/* Right: User Menu */}\n <div className=\"cnfy-header-right\">\n <UserMenu onOpenPreferences={onOpenPreferences} />\n </div>\n </div>\n </header>\n )\n}\n","\"use client\"\n\nimport { useEffect } from \"react\"\nimport { X } from \"lucide-react\"\n\nexport default function Drawer({\n open,\n onClose,\n title,\n children,\n}: {\n open: boolean\n onClose: () => void\n title?: string\n children: React.ReactNode\n}) {\n // Prevent body scroll when drawer is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [open])\n\n if (!open) return null\n\n return (\n <div className=\"cnfy-drawer-overlay\">\n {/* Backdrop */}\n <div className=\"cnfy-drawer-backdrop\" onClick={onClose} />\n\n {/* Panel */}\n <div className=\"cnfy-drawer-panel\">\n <div className=\"cnfy-drawer-header\">\n {title && <h2 className=\"cnfy-drawer-title\">{title}</h2>}\n <button onClick={onClose} className=\"cnfy-drawer-close-btn\">\n <X size={20} />\n </button>\n </div>\n\n <div className=\"cnfy-drawer-body\">\n {children}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\nimport { useState, useEffect } from \"react\"\nimport toast from \"react-hot-toast\"\nimport { savePreferencesApi } from \"@/services/preferences.service\"\nimport { triggerScrape, getScrapeStatus } from \"@/services/settings.service\"\nimport { usePreferences } from \"@/contexts/PreferencesContext\"\nimport ClientSelect from \"@/components/ClientSelect\"\nimport { hexToRgba } from \"@/src/utils/util\"\n\ninterface ScrapeStatus {\n isRunning: boolean\n lastRun?: string\n nextScheduled?: string\n totalScraped?: number\n}\n\nconst STATE_OPTIONS = [\n { value: \"Uttar Pradesh\", label: \"Uttar Pradesh\" }\n]\n\nconst CITY_OPTIONS = [\n \"Agra\",\n \"Aligarh\",\n \"Ayodhya\",\n \"Bareilly\",\n \"Bijnor\",\n \"Bulandshahr\",\n \"Etawah\",\n \"Firozabad\",\n \"Ghaziabad\",\n \"Gorakhpur\",\n \"Jhansi\",\n \"Kanpur\",\n \"Lucknow\",\n \"Mathura\",\n \"Meerut\",\n \"Moradabad\",\n \"Muzaffarnagar\",\n \"Noida\",\n \"Prayagraj\",\n \"Rampur\",\n \"Saharanpur\",\n \"Sitapur\",\n \"Unnao\",\n \"Varanasi\"\n].map(city => ({ value: city, label: city }))\n\nconst LANGUAGE_OPTIONS = [\n { value: \"en\", label: \"English\" },\n { value: \"hi\", label: \"Hindi\" },\n]\n\nexport default function PreferencesPage() {\n const { preferences, loading, refreshPreferences, updatePreferences } = usePreferences()\n const primaryColor = preferences?.chatbot?.primaryColor || \"#10b981\"\n\n const [botName, setBotName] = useState(\"\")\n const [logo, setLogo] = useState<File | null>(null)\n const [logoUrl, setLogoUrl] = useState<string | null>(null)\n const [state, setState] = useState<{ value: string; label: string } | null>(null)\n const [cities, setCities] = useState<{ value: string; label: string }[]>([])\n const [language, setLanguage] = useState<{ value: string; label: string } | null>(null)\n\n const [saving, setSaving] = useState(false)\n const [success, setSuccess] = useState(false)\n\n // News Scraping state\n const [scraping, setScraping] = useState(false)\n const [scrapeStatus, setScrapeStatus] = useState<ScrapeStatus | null>(null)\n const [loadingStatus, setLoadingStatus] = useState(true)\n\n // Store original values for comparison\n const [originalValues, setOriginalValues] = useState<{\n botName: string\n state: string | undefined\n cities: string[]\n language: string | undefined\n }>({\n botName: \"\",\n state: undefined,\n cities: [],\n language: undefined,\n })\n\n // Fetch scrape status on mount\n useEffect(() => {\n const fetchScrapeStatus = async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (error) {\n console.log(\"Failed to fetch scrape status:\", error)\n } finally {\n setLoadingStatus(false)\n }\n }\n fetchScrapeStatus()\n }, [])\n\n const handleScrape = async () => {\n setScraping(true)\n try {\n await triggerScrape({\n state: preferences?.localization?.state,\n cities: preferences?.localization?.cities,\n })\n toast.success(\"News scraping started successfully!\")\n setTimeout(async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (e) {\n console.log(\"Failed to refresh scrape status:\", e)\n }\n }, 2000)\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to trigger news scraping\")\n } finally {\n setScraping(false)\n }\n }\n\n useEffect(() => {\n if (preferences) {\n // Set chatbot preferences\n const name = preferences.chatbot?.name || \"\"\n const pState = preferences.localization?.state\n const pCities = preferences.localization?.cities || []\n const pLanguage = preferences.localization?.language\n\n setBotName(name)\n if (preferences.chatbot?.logoUrl) setLogoUrl(preferences.chatbot.logoUrl)\n\n // Set localization preferences\n if (pState) {\n setState({ value: pState, label: pState })\n }\n if (Array.isArray(pCities)) {\n setCities(pCities.map((city: string) => ({ value: city, label: city })))\n }\n if (pLanguage) {\n const langOption = LANGUAGE_OPTIONS.find(opt => opt.value === pLanguage)\n setLanguage(langOption || null)\n }\n\n // Store original values\n setOriginalValues({\n botName: name,\n state: pState,\n cities: pCities,\n language: pLanguage,\n })\n }\n }, [preferences])\n\n const handleSave = async () => {\n if (!botName) {\n toast.error(\"Chatbot name is required\")\n return\n }\n\n setSaving(true)\n setSuccess(false)\n\n try {\n // Build payload with only changed fields\n const payload: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n language?: string\n } = {}\n\n // Check each field for changes\n if (botName !== originalValues.botName) {\n payload.botName = botName\n }\n\n if (logo) {\n payload.logo = logo\n }\n\n const currentState = state?.value\n if (currentState !== originalValues.state) {\n payload.state = currentState\n }\n\n const currentCities = cities.map(c => c.value)\n const citiesChanged =\n currentCities.length !== originalValues.cities.length ||\n currentCities.some((city, index) => city !== originalValues.cities[index])\n if (citiesChanged) {\n payload.cities = currentCities\n }\n\n const currentLanguage = language?.value\n if (currentLanguage !== originalValues.language) {\n payload.language = currentLanguage\n }\n\n // If no changes detected, show message\n if (Object.keys(payload).length === 0) {\n toast.error(\"No changes to save\")\n setSaving(false)\n return\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const updatedPreferences = await savePreferencesApi(payload as any)\n\n // Update global context with new preferences\n if (updatedPreferences) {\n updatePreferences(updatedPreferences)\n } else {\n // Refresh from server if save didn't return data\n await refreshPreferences()\n }\n\n setSuccess(true)\n setLogo(null) // Clear logo after successful save\n toast.success(\"Preferences saved successfully!\")\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to save preferences\")\n } finally {\n setSaving(false)\n }\n }\n\n if (loading) {\n return (\n <div className=\"cnfy-dash-page\">\n <p className=\"cnfy-dash-page-subtitle\">Loading settings...</p>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-dash-page\">\n {/* Chatbot Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Chatbot Settings</h2>\n\n {/* Chatbot Name */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Name</label>\n <input\n value={botName}\n onChange={(e) => setBotName(e.target.value)}\n className=\"cnfy-dash-input\"\n placeholder=\"Contenify AI\"\n />\n </div>\n\n {/* Logo */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Logo</label>\n <div className=\"cnfy-logo-upload\">\n <div className=\"cnfy-logo-preview\">\n {logo ? (\n <img\n src={URL.createObjectURL(logo)}\n alt=\"Logo preview\"\n className=\"cnfy-logo-img\"\n />\n ) : logoUrl ? (\n <img\n src={logoUrl}\n alt=\"Current logo\"\n className=\"cnfy-logo-img\"\n />\n ) : (\n <span className=\"cnfy-logo-placeholder\">No logo</span>\n )}\n </div>\n\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => setLogo(e.target.files?.[0] || null)}\n className=\"cnfy-file-input\"\n />\n </div>\n </div>\n\n </div>\n\n\n {/* News Scraping */}\n <div className=\"cnfy-dash-card\">\n <div className=\"cnfy-dash-card-header\">\n <h2 className=\"cnfy-dash-card-title-inline\">News Scraping</h2>\n <p className=\"cnfy-dash-card-desc\">\n Scrape latest news from your configured locations\n </p>\n </div>\n\n {!loadingStatus && scrapeStatus && (\n <div className=\"cnfy-dash-grid cnfy-dash-grid--sm\">\n <div>\n <span className=\"cnfy-dash-label-muted\">Status:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.isRunning ? (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--yellow\">Running</span>\n ) : (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--green\">Idle</span>\n )}\n </p>\n </div>\n\n {scrapeStatus.lastRun && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Last Run:</span>\n <p className=\"cnfy-dash-label-bold\">\n {new Date(scrapeStatus.lastRun).toLocaleString()}\n </p>\n </div>\n )}\n\n {scrapeStatus.totalScraped !== undefined && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Total Scraped:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.totalScraped.toLocaleString()} articles\n </p>\n </div>\n )}\n </div>\n )}\n\n <div>\n <p className=\"cnfy-dash-info-text\">\n Current configuration: <strong>{preferences?.localization?.state}</strong>\n {preferences?.localization?.cities && preferences.localization.cities.length > 0 && (\n <> - {preferences.localization.cities.join(\", \")}</>\n )}\n </p>\n <button\n onClick={handleScrape}\n disabled={scraping || scrapeStatus?.isRunning}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: hexToRgba(primaryColor, 0.8) }}\n >\n {scraping ? \"Starting Scrape...\" : scrapeStatus?.isRunning ? \"Scraping in Progress...\" : \"Start Scraping\"}\n </button>\n </div>\n </div>\n\n {/* Localization Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Localization Settings</h2>\n\n {/* State */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">State</label>\n <ClientSelect\n options={STATE_OPTIONS}\n value={state}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option:any) => setState(option)}\n placeholder=\"Select state\"\n />\n </div>\n\n {/* City */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Cities</label>\n <ClientSelect\n isMulti={true}\n options={CITY_OPTIONS}\n value={cities}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(options) => setCities(options as any)}\n placeholder=\"Select cities\"\n isDisabled={!state}\n />\n </div>\n\n {/* Language */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Language</label>\n <ClientSelect\n options={LANGUAGE_OPTIONS}\n value={language}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onChange={(option:any) => setLanguage(option)}\n placeholder=\"Select language\"\n />\n </div>\n </div>\n\n \n\n {/* Save Button */}\n <div className=\"cnfy-dash-actions\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: primaryColor }}\n >\n {saving ? \"Saving...\" : \"Save Preferences\"}\n </button>\n </div>\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\n/**\n * Trigger news scraping\n */\n\nexport const triggerScrape = async ({\n state,\n cities,\n}: {\n state?: string\n cities?: string[]\n}) => {\n const { data } = await api.post(\"/chatboat/scrape/trigger\", {\n state,\n cities,\n })\n return data\n}\n\n/**\n * Get scraping status\n */\nexport const getScrapeStatus = async () => {\n const { data } = await api.get(\"/chatboat/scrape/status\")\n return data.data\n}\n\n/**\n * Reset user data (daily limits, etc.)\n */\nexport const resetUserData = async () => {\n const { data } = await api.post(\"/users/reset\")\n return data\n}\n","import React, { useEffect, useState } from \"react\";\nimport type { Props as SelectProps } from \"react-select\";\n\ntype Option = {\n label: string;\n value: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet ReactSelect: any = null;\n\nconst ClientSelect = (props: SelectProps<Option, boolean>) => {\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n import(\"react-select\").then((mod) => {\n ReactSelect = mod.default;\n });\n }, []);\n\n if (!mounted || !ReactSelect) return null;\n\n return <ReactSelect {...props} />;\n};\n\nexport default ClientSelect;\n","\n\nexport const hexToRgba = (hex: string, opacity: number) => {\n const sanitizedHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(sanitizedHex.substring(0, 2), 16);\n const g = parseInt(sanitizedHex.substring(2, 4), 16);\n const b = parseInt(sanitizedHex.substring(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n};\n\n\n\n","import api from \"@/lib/api\"\nimport { getApiBaseUrl, getApiKey } from \"@/lib/config\"\n\n/* ─── Types ─── */\n\nexport interface ContentOption {\n id: string\n name: string\n description?: string\n icon?: string\n}\n\nexport interface RecreateSettings {\n tones: string[]\n styles: string[]\n wordCounts?: string[]\n}\n\nexport interface AnalyzeInputResponse {\n hasUrl: boolean\n url?: string\n content?: string\n wordCount?: number\n options: ContentOption[]\n recreateSettings?: RecreateSettings\n}\n\nexport interface CreateContentPayload {\n url: string\n content: string\n actionId: string\n settings?: {\n tone?: string\n style?: string\n wordCount?: string\n }\n}\n\nexport interface StreamCallbacks {\n onFieldStart?: (field: string) => void\n onContent: (field: string, chunk: string) => void\n onKeywords?: (keywords: string[]) => void\n onFieldEnd?: (field: string) => void\n onComplete?: (data: { title: string; subtitle?: string; article: string; metaDescription?: string; metaKeywords: string[] }) => void\n onError?: (error: any) => void\n}\n\n/* ─── Helpers ─── */\n\nfunction getHeaders(): Record<string, string> {\n const apiKey = getApiKey()\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n }\n if (apiKey) {\n headers[\"x-api-key\"] = apiKey\n }\n return headers\n}\n\n/**\n * Process an SSE stream with the structured event format.\n * Events: start, field_start, content, keywords, field_end, done, error\n */\nasync function processSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n callbacks: StreamCallbacks\n) {\n const decoder = new TextDecoder()\n let buffer = \"\"\n\n const processLines = (lines: string[]) => {\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed.startsWith(\"data: \")) continue\n\n const data = trimmed.slice(6).trim()\n\n try {\n const event = JSON.parse(data)\n\n switch (event.type) {\n case \"start\":\n break\n\n case \"field_start\":\n callbacks.onFieldStart?.(event.field)\n break\n\n case \"content\":\n callbacks.onContent(event.field, event.content)\n break\n\n case \"keywords\":\n callbacks.onKeywords?.(event.content)\n break\n\n case \"field_end\":\n callbacks.onFieldEnd?.(event.field)\n break\n\n case \"done\":\n callbacks.onComplete?.(event.data)\n return true\n\n case \"error\":\n callbacks.onError?.(new Error(event.message))\n return true\n }\n } catch {\n // Skip unparseable lines\n }\n }\n return false\n }\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n\n const lines = buffer.split(\"\\n\")\n buffer = lines.pop() || \"\"\n\n if (processLines(lines)) return\n }\n\n // Process any remaining data in the buffer after stream ends\n if (buffer.trim()) {\n processLines([buffer])\n }\n}\n\n/* ─── API endpoints ─── */\n\n/**\n * Analyze user input for URLs and return content options\n */\nexport const analyzeInputApi = async (input: string): Promise<AnalyzeInputResponse> => {\n const { data } = await api.post(\"/chatboat/analyze-input\", { input })\n return data.data\n}\n\n/**\n * Create content based on selected action (non-streaming)\n */\nexport const createContentApi = async (payload: CreateContentPayload) => {\n const { data } = await api.post(\"/chatboat/create-content\", payload)\n return data.data\n}\n\n/**\n * Create content based on selected action (streaming with structured SSE)\n */\nexport const createContentStreamApi = async ({\n url,\n content,\n actionId,\n settings,\n onFieldStart,\n onContent,\n onKeywords,\n onFieldEnd,\n onComplete,\n onError,\n}: CreateContentPayload & StreamCallbacks) => {\n const API_BASE_URL = getApiBaseUrl()\n\n const response = await fetch(`${API_BASE_URL}/chat/create-content/stream`, {\n method: \"POST\",\n headers: getHeaders(),\n credentials: \"include\",\n body: JSON.stringify({ url, content, actionId, settings }),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error(\"No reader available\")\n }\n\n await processSSEStream(reader, {\n onFieldStart,\n onContent,\n onKeywords,\n onFieldEnd,\n onComplete,\n onError,\n })\n}\n\n/**\n * Get all available content creation options and settings\n */\nexport const getContentOptionsApi = async () => {\n const { data } = await api.get(\"/chat/content-options\")\n return data.data\n}\n\n/**\n * Streaming version of rewrite news API with structured SSE events.\n * Events: start → field_start → content chunks → field_end → done\n */\nexport const rewriteNewsStreamApi = async ({\n article,\n language = \"English\",\n articleId,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n onFieldStart,\n onContent,\n onKeywords,\n onFieldEnd,\n onComplete,\n onError,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n} & StreamCallbacks) => {\n const payload: Record<string, any> = {\n article,\n language,\n }\n\n if (articleId) payload.articleId = articleId\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n try {\n const API_BASE_URL = getApiBaseUrl()\n\n const response = await fetch(`${API_BASE_URL}/chatboat/rewrite/stream`, {\n method: \"POST\",\n headers: getHeaders(),\n credentials: \"include\",\n body: JSON.stringify(payload),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n\n const contentType = response.headers.get(\"content-type\") || \"\"\n\n // Handle plain JSON response (non-SSE fallback from API)\n if (contentType.includes(\"application/json\")) {\n const json = await response.json()\n const data = json.data || json\n onComplete?.({\n title: data.title || \"\",\n subtitle: data.subtitle || \"\",\n article: data.article || \"\",\n metaDescription: data.metaDescription || \"\",\n metaKeywords: Array.isArray(data.metaKeywords) ? data.metaKeywords : [],\n })\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n throw new Error(\"No reader available\")\n }\n\n await processSSEStream(reader, {\n onFieldStart,\n onContent,\n onKeywords,\n onFieldEnd,\n onComplete,\n onError,\n })\n } catch (error: any) {\n onError?.(error)\n throw error\n }\n}\n\n/**\n * Non-streaming version (fallback)\n */\nexport const rewriteNewsApi = async ({\n article,\n language = \"English\",\n articleId,\n tone,\n style,\n wordCount,\n includeQuotes,\n includeFAQ,\n targetAudience,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const payload: Record<string, any> = {\n article,\n language,\n }\n\n if (articleId) payload.articleId = articleId\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n const { data } = await api.post(\"/chatboat/rewrite\", payload)\n\n return data.data;\n}\n"],"mappings":"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","names":["import_react","axios","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_react","import_jsx_runtime","StarterKit","Placeholder","editor","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime","_a","_b","Select","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","_a","_b","toast","_c","import_react_hot_toast","import_lucide_react","import_jsx_runtime","toast","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../components/chatbot/ChatBot.tsx","../src/utils/ aiJsonParser.ts","../src/utils/decodeUnicode.ts","../src/utils/articleTextToHtml.ts","../src/utils/formatAIContent.ts","../components/chatbot/ChatWindow.tsx","../components/chatbot/EditModal.tsx","../components/chatbot/RichTextEditor.tsx","../hooks/useTheme.ts","../lib/config.ts","../components/news/NewsList.tsx","../src/utils/util.ts","../lib/api.ts","../services/news.service.ts","../components/ui/Drawer.tsx","../components/preferences/Preferences.tsx","../services/settings.service.ts","../components/history/HistoryPanel.tsx","../services/history.service.ts","../services/chat.service.ts"],"sourcesContent":["\"use client\"\n\nimport { useEffect } from \"react\"\nimport ChatBot from \"../components/chatbot/ChatBot\"\nimport { setConfig } from \"../lib/config\"\n\nexport interface ContenifyChatBotProps {\n apiUrl?: string\n apiKey?: string\n domain?: string\n onPost?: (content: string, keywords: string[]) => void\n}\n\nexport function ContenifyChatBot({ apiUrl, apiKey, domain, onPost }: ContenifyChatBotProps) {\n useEffect(() => {\n setConfig({ apiUrl, apiKey, domain })\n }, [apiUrl, apiKey, domain])\n\n useEffect(() => {\n if (!onPost) return\n const handler = (e: Event) => {\n const detail = (e as CustomEvent).detail\n onPost(detail.article ?? \"\", detail.keywords ?? [])\n }\n window.addEventListener('contenify-post-article', handler)\n return () => window.removeEventListener('contenify-post-article', handler)\n }, [onPost])\n\n return <ChatBot />\n}\n\nexport default ContenifyChatBot\n\nexport type {\n ContentOption,\n AnalyzeInputResponse,\n CreateContentPayload,\n RecreateSettings,\n} from \"../services/chat.service\"\n\n// Re-export config utilities for consumers\nexport { setConfig } from \"../lib/config\"\n","\"use client\"\n\nimport { useState } from \"react\"\nimport ChatWindow from \"./ChatWindow\"\nimport Drawer from \"../ui/Drawer\"\nimport PreferencesPage from \"../preferences/Preferences\"\nimport HistoryPanel from \"../history/HistoryPanel\"\nimport {\n rewriteNewsStreamApi,\n rewriteNewsApi,\n analyzeInputApi,\n createContentStreamApi,\n createContentApi,\n resolveSeoStreamApi,\n type ContentOption,\n} from \"@/services/chat.service\"\nimport type { SeoAnalysis } from \"@/src/types/ai\"\nimport { getHistoryItem } from \"@/services/history.service\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport toast from \"react-hot-toast\"\nimport { Loader2 } from \"lucide-react\"\nimport { ApiKeyInvalidError } from \"@/lib/api\"\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\nfunction buildStructuredContent(title: string, article: string, metaKeywords: string[], subtitle = \"\", metaDescription = \"\"): string {\n return JSON.stringify({ title, subtitle, article, metaDescription, metaKeywords })\n}\n\nexport default function ChatBot() {\n const { loading } = useTheme()\n const [preferencesOpen, setPreferencesOpen] = useState(false)\n const [messages, setMessages] = useState<ChatMessage[]>([])\n const [isStreaming, setIsStreaming] = useState(false)\n const [activeField, setActiveField] = useState<string | null>(null)\n const [analyzedData, setAnalyzedData] = useState<{\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null>(null)\n\n const handleRecreate = async ({ title, content, id }: { title: string; content?: string; id?: string }) => {\n const assistantId = crypto.randomUUID()\n\n setMessages(prev => [\n ...prev,\n { id: crypto.randomUUID(), role: \"user\", content: `Recreate this news:\\n ${title}` },\n { id: assistantId, role: \"assistant\", content: \"\" },\n ])\n setIsStreaming(true)\n\n try {\n let hasStartedStreaming = false\n let streamDone = false // Fix: local flag instead of stale isStreaming closure\n let pendingError: Error | null = null // Fix: propagate onError out of async callback\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: structured } : m))\n }\n\n try {\n await rewriteNewsStreamApi({\n article: content || \"\",\n language: \"English\",\n articleId: id,\n onFieldStart: (field) => { setActiveField(field) },\n onContent: (field, chunk) => {\n hasStartedStreaming = true\n if (field === \"title\") titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => { keywordsBuffer = keywords; updateMessage() },\n onFieldEnd: () => { setActiveField(null) },\n onComplete: (data) => {\n streamDone = true\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: finalContent } : m))\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Article created successfully!\")\n },\n onError: (error) => {\n if (!hasStartedStreaming) {\n // Fix: store error so we can throw it after the await resolves\n pendingError = error instanceof Error ? error : new Error(String(error))\n } else {\n streamDone = true\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to complete article generation\")\n setMessages(prev => prev.map(m =>\n m.id === assistantId\n ? { ...m, content: (titleBuffer || articleBuffer) ? buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) : \"Failed to create article. Please try again.\" }\n : m\n ))\n }\n },\n })\n\n // Fix: propagate error that was stored from onError callback\n if (pendingError) throw pendingError\n\n // Finalize if stream ended without onComplete firing\n if (!streamDone && (titleBuffer || articleBuffer)) {\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) } : m\n ))\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch {\n // Fallback to regular API\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: \"\" } : m))\n\n const result = await rewriteNewsApi({\n article: content || \"\",\n language: \"English\",\n articleId: id,\n })\n\n setMessages(prev => prev.map(m =>\n m.id === assistantId\n ? { ...m, content: typeof result === \"string\" ? result : JSON.stringify(result) }\n : m\n ))\n setIsStreaming(false)\n toast.success(\"Article created successfully!\")\n }\n } catch (err) {\n if (err instanceof ApiKeyInvalidError) return\n console.error(\"Complete Error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n toast.error((err as Error)?.message || \"An error occurred while creating the article\")\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: \"Failed to create article. Please try again.\" } : m\n ))\n }\n }\n\n const handleSendMessage = async (text: string) => {\n const userMsgId = crypto.randomUUID()\n const assistantId = crypto.randomUUID()\n\n setMessages(prev => [...prev, { id: userMsgId, role: \"user\", content: text }])\n\n const urlRegex = /https?:\\/\\/[^\\s]+/\n const hasUrl = urlRegex.test(text)\n\n if (hasUrl) {\n setMessages(prev => [...prev, { id: assistantId, role: \"assistant\", content: \"Analyzing your link...\" }])\n\n try {\n // Fix: removed the `return;` that was blocking analyzeInputApi\n const result = await analyzeInputApi(text)\n\n if (result.hasUrl && result.options?.length > 0) {\n setAnalyzedData({\n url: result.url || \"\",\n content: result.content || \"\",\n options: result.options,\n messageId: assistantId,\n })\n\n const optionsList = result.options\n .map((opt) => `• **${opt.name}**${opt.description ? ` – ${opt.description}` : \"\"}`)\n .join(\"\\n\")\n\n setMessages(prev => prev.map(m =>\n m.id === assistantId\n ? { ...m, content: `I found an article (${result.wordCount || 0} words). What would you like to do?\\n\\n${optionsList}` }\n : m\n ))\n } else {\n setMessages(prev => prev.map(m =>\n m.id === assistantId\n ? { ...m, content: \"Could not extract content from that URL. Please try a different link.\" }\n : m\n ))\n }\n } catch (err) {\n if (err instanceof ApiKeyInvalidError) return\n console.error(\"Analyze input error:\", err)\n toast.error(\"Failed to analyze the link\")\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: \"Failed to analyze the link. Please try again.\" } : m\n ))\n }\n } else {\n setMessages(prev => [...prev, { id: assistantId, role: \"assistant\", content: \"\" }])\n setIsStreaming(true)\n\n try {\n let streamDone = false\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: structured } : m))\n }\n\n await rewriteNewsStreamApi({\n article: text,\n language: \"English\",\n onFieldStart: (field) => { setActiveField(field) },\n onContent: (field, chunk) => {\n if (field === \"title\") titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => { keywordsBuffer = keywords; updateMessage() },\n onFieldEnd: () => { setActiveField(null) },\n onComplete: (data) => {\n streamDone = true\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: finalContent } : m))\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Content generated!\")\n },\n onError: (error) => {\n if (error instanceof ApiKeyInvalidError) return\n console.error(\"Stream error:\", error)\n streamDone = true\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to generate content\")\n },\n })\n\n if (!streamDone && (titleBuffer || articleBuffer)) {\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) } : m\n ))\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch (err) {\n if (err instanceof ApiKeyInvalidError) return\n console.error(\"Send message error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: \"Failed to generate content. Please try again.\" } : m\n ))\n }\n }\n }\n\n const handleSelectAction = async (actionId: string, url: string, content: string) => {\n const assistantId = crypto.randomUUID()\n\n setAnalyzedData(null)\n\n const actionName = analyzedData?.options.find(o => o.id === actionId)?.name || actionId\n\n setMessages(prev => [\n ...prev,\n { id: crypto.randomUUID(), role: \"user\", content: `Action: ${actionName}` },\n { id: assistantId, role: \"assistant\", content: \"\" },\n ])\n setIsStreaming(true)\n\n try {\n let streamDone = false\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n const structured = buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: structured } : m))\n }\n\n try {\n await createContentStreamApi({\n url,\n content,\n actionId,\n settings: {},\n onFieldStart: (field) => { setActiveField(field) },\n onContent: (field, chunk) => {\n if (field === \"title\") titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => { keywordsBuffer = keywords; updateMessage() },\n onFieldEnd: () => { setActiveField(null) },\n onComplete: (data) => {\n streamDone = true\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: finalContent } : m))\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Content created!\")\n },\n onError: (error) => {\n if (error instanceof ApiKeyInvalidError) return\n console.error(\"Stream error:\", error)\n streamDone = true\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to create content\")\n },\n })\n\n if (!streamDone && (titleBuffer || articleBuffer)) {\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) } : m\n ))\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch {\n const result = await createContentApi({ url, content, actionId, settings: {} })\n\n setMessages(prev => prev.map(m =>\n m.id === assistantId\n ? { ...m, content: typeof result === \"string\" ? result : JSON.stringify(result) }\n : m\n ))\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"Content created!\")\n }\n } catch (err) {\n if (err instanceof ApiKeyInvalidError) return\n console.error(\"Create content error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: \"Failed to create content. Please try again.\" } : m\n ))\n }\n }\n\n const handleResolveSeo = async (articleData: {\n title: string; subtitle: string; article: string\n metaDescription: string; metaKeywords: string[]\n seoAnalysis: SeoAnalysis; language?: string; historyId?: string\n }) => {\n const assistantId = crypto.randomUUID()\n setMessages(prev => [\n ...prev,\n { id: crypto.randomUUID(), role: \"user\", content: \"Resolve SEO issues\" },\n { id: assistantId, role: \"assistant\", content: \"\" },\n ])\n setIsStreaming(true)\n\n try {\n let streamDone = false\n let titleBuffer = \"\"\n let articleBuffer = \"\"\n let keywordsBuffer: string[] = []\n\n const updateMessage = () => {\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) } : m\n ))\n }\n\n await resolveSeoStreamApi({\n ...articleData,\n onFieldStart: (field) => { setActiveField(field) },\n onContent: (field, chunk) => {\n if (field === 'title') titleBuffer += chunk\n else articleBuffer += chunk\n updateMessage()\n },\n onKeywords: (keywords) => { keywordsBuffer = keywords; updateMessage() },\n onFieldEnd: () => { setActiveField(null) },\n onComplete: (data) => {\n streamDone = true\n const finalContent = (data && (data.title || data.article))\n ? JSON.stringify(data)\n : buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer)\n setMessages(prev => prev.map(m => m.id === assistantId ? { ...m, content: finalContent } : m))\n setIsStreaming(false)\n setActiveField(null)\n toast.success(\"SEO issues resolved!\")\n },\n onError: () => {\n streamDone = true\n setIsStreaming(false)\n setActiveField(null)\n toast.error(\"Failed to resolve SEO issues\")\n },\n })\n\n if (!streamDone && (titleBuffer || articleBuffer)) {\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: buildStructuredContent(titleBuffer, articleBuffer, keywordsBuffer) } : m\n ))\n setIsStreaming(false)\n setActiveField(null)\n }\n } catch (err) {\n if (err instanceof ApiKeyInvalidError) return\n console.error(\"Resolve SEO error:\", err)\n setIsStreaming(false)\n setActiveField(null)\n toast.error((err as Error)?.message || \"Failed to resolve SEO issues\")\n setMessages(prev => prev.map(m =>\n m.id === assistantId ? { ...m, content: \"Failed to resolve SEO issues. Please try again.\" } : m\n ))\n }\n }\n\n const handleHistorySelect = async (id: string) => {\n try {\n const item = await getHistoryItem(id)\n const content = buildStructuredContent(\n item.title,\n item.article || \"\",\n item.metaKeywords || [],\n item.subtitle,\n item.metaDescription,\n )\n setMessages(prev => [...prev, { id: crypto.randomUUID(), role: 'assistant', content }])\n } catch {\n toast.error('Failed to load article')\n }\n }\n\n if (loading) {\n return (\n <div className=\"cnfy-loading\">\n <div className=\"cnfy-loading-inner\">\n <Loader2 className=\"cnfy-loading-spinner cnfy-animate-spin\" />\n <p className=\"cnfy-loading-text\">Loading...</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-root\">\n <div className=\"cnfy-main\">\n <section className=\"cnfy-chat-section cnfy-chat-section--full\">\n <div className=\"cnfy-chat-inner cnfy-chat-inner--with-history\">\n <HistoryPanel\n onSelect={handleHistorySelect}\n onNewChat={() => setMessages([])}\n />\n <ChatWindow\n messages={messages}\n onSend={handleSendMessage}\n onSelectNews={handleRecreate}\n isStreaming={isStreaming}\n activeField={activeField}\n analyzedData={analyzedData}\n onSelectAction={handleSelectAction}\n onResolveSeo={handleResolveSeo}\n />\n </div>\n </section>\n </div>\n\n <Drawer\n open={preferencesOpen}\n onClose={() => setPreferencesOpen(false)}\n title=\"Settings\"\n >\n <PreferencesPage />\n </Drawer>\n </div>\n )\n}\n","/* eslint-disable prefer-const */\n// utils/aiJsonParser.ts\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function extractJSON(raw: string): any | null {\n if (!raw) return null\n\n // remove markdown code blocks\n let cleaned = raw\n .replace(/```json/gi, \"\")\n .replace(/```/g, \"\")\n .trim()\n\n // locate first JSON object\n const first = cleaned.indexOf(\"{\")\n const last = cleaned.lastIndexOf(\"}\")\n\n if (first === -1 || last === -1 || last <= first) return null\n\n const possibleJson = cleaned.substring(first, last + 1)\n\n try {\n return JSON.parse(possibleJson)\n } catch (err) {\n console.warn(\"JSON parse failed:\", err)\n return null\n }\n}","// utils/decodeUnicode.ts\n\nexport function decodeUnicode(text: string): string {\n if (!text) return \"\"\n\n try {\n // converts \\u0930\\u093e\\u0924 into real Hindi characters\n return JSON.parse(`\"${text.replace(/\"/g, '\\\\\"')}\"`)\n } catch {\n return text\n }\n}","export function articleTextToHtml(text: string): string {\n if (!text) return \"\"\n\n // convert escaped newlines\n text = text.replace(/\\\\n/g, \"\\n\")\n\n const lines = text\n .split(\"\\n\")\n .map(line => line.trim())\n .filter(Boolean)\n\n let html = \"\"\n\n for (const line of lines) {\n\n // detect headings\n if (line.length < 80 && !line.endsWith(\"।\") && !line.endsWith(\".\")) {\n html += `<h2>${line}</h2>`\n continue\n }\n\n // normal paragraph\n html += `<p>${line}</p>`\n }\n\n return html\n}","// utils/formatAIContent.ts\n\nimport { extractJSON } from \"./ aiJsonParser\"\nimport { decodeUnicode } from \"./decodeUnicode\"\nimport { ParsedContent } from \"../types/ai\"\nimport { articleTextToHtml } from \"./articleTextToHtml\"\n\nexport function formatAIContent(raw?: string): ParsedContent {\n const empty: ParsedContent = {\n isArticle: false,\n title: \"\",\n subtitle: \"\",\n articleHtml: \"\",\n article: \"\",\n metaDescription: \"\",\n metaKeywords: [],\n plainText: \"\",\n images: [],\n }\n\n if (!raw) return empty\n\n const parsed = extractJSON(raw)\n\n if (parsed && (parsed.title || parsed.article)) {\n const rawArticle = (parsed.article || \"\").trim()\n const safeArticle = decodeUnicode(rawArticle)\n\n // If article already contains HTML tags, use it directly; otherwise convert text to HTML\n const isHtml = /<[a-z][\\s\\S]*>/i.test(safeArticle)\n const articleHtml = isHtml ? safeArticle : articleTextToHtml(safeArticle)\n\n return {\n isArticle: true,\n title: parsed.title || \"\",\n subtitle: parsed.subtitle || \"\",\n articleHtml,\n article: rawArticle,\n metaDescription: parsed.metaDescription || \"\",\n metaKeywords: Array.isArray(parsed.metaKeywords) ? parsed.metaKeywords : [],\n plainText: raw,\n seoAnalysis: parsed.seoAnalysis || null,\n images: Array.isArray(parsed.images) ? parsed.images : [],\n }\n }\n\n return { ...empty, plainText: raw }\n}","\"use client\"\n\nimport { formatAIContent } from \"@/src/utils/formatAIContent\"\nimport { Check, Copy, Edit3, FileDown, SendHorizontal, Zap, X, RefreshCcw, FileText, ListChecks, Share2, BookOpen, Mail, Key, Loader2, Sparkles, Link2, PenLine, LayoutList, BarChart2, ChevronDown, ChevronUp, AlertTriangle, Lightbulb, Wand2 } from \"lucide-react\"\nimport type { ContentOption } from \"@/services/chat.service\"\nimport { useLayoutEffect, useRef, useState, useEffect, useCallback } from \"react\"\nimport EditModal from \"./EditModal\"\nimport { getApiBaseUrl, getApiKey } from \"@/lib/config\"\nimport NewsList from \"../news/NewsList\"\nimport { getTrendingNews, getNewsSources, getNewsBySource, scrapeNewsSource } from \"@/services/news.service\"\nimport { useTheme } from \"@/hooks/useTheme\"\n\nimport type { ParsedContent, SeoAnalysis } from \"@/src/types/ai\"\n\ntype ChatMessage = {\n id: string\n role: \"user\" | \"assistant\"\n content: string\n}\n\n\n\nfunction seoScoreColor(score: number): string {\n if (score >= 80) return '#10b981'\n if (score >= 60) return '#f59e0b'\n if (score >= 40) return '#f97316'\n return '#ef4444'\n}\n\nfunction seoGradeColor(grade: string): string {\n if (grade === 'A') return '#10b981'\n if (grade === 'B') return '#3b82f6'\n if (grade === 'C') return '#f59e0b'\n if (grade === 'D') return '#f97316'\n return '#ef4444'\n}\n\nconst ACTION_ICONS: Record<string, typeof FileText> = {\n recreate_article: RefreshCcw,\n create_summary: ListChecks,\n create_social_posts: Share2,\n create_blog_post: BookOpen,\n create_newsletter: Mail,\n extract_key_points: Key,\n}\n\nexport default function ChatWindow({\n messages,\n onSend,\n onSelectNews,\n isStreaming = false,\n activeField,\n analyzedData,\n onSelectAction,\n onResolveSeo,\n}: {\n messages: ChatMessage[]\n onSend: (message: string) => void\n onSelectNews?: (news: { title: string; content?: string; id?: string }) => void\n isStreaming?: boolean\n activeField?: string | null\n analyzedData?: {\n url: string\n content: string\n options: ContentOption[]\n messageId: string\n } | null\n onSelectAction?: (actionId: string, url: string, content: string) => void\n onResolveSeo?: (data: {\n title: string; subtitle: string; article: string\n metaDescription: string; metaKeywords: string[]\n seoAnalysis: NonNullable<import('@/src/types/ai').SeoAnalysis>\n language?: string; historyId?: string\n }) => void\n}) {\n const { showNewsPanel } = useTheme()\n const THEME_GRADIENT = 'linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%)'\n const bottomRef = useRef<HTMLDivElement>(null)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const dropdownRef = useRef<HTMLDivElement>(null)\n const pillsRef = useRef<HTMLDivElement>(null)\n const [input, setInput] = useState(\"\")\n const [copiedId, setCopiedId] = useState<string | null>(null)\n const [showNewsDropdown, setShowNewsDropdown] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [trendingNews, setTrendingNews] = useState<any[]>([])\n const [loadingNews, setLoadingNews] = useState(false)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [sources, setSources] = useState<any[]>([])\n const [selectedSource, setSelectedSource] = useState<string | null>(null)\n const [loadingSources, setLoadingSources] = useState(false)\n const [scraping, setScraping] = useState(false)\n const [editModal, setEditModal] = useState<{\n isOpen: boolean\n title: string\n subtitle: string\n content: string\n metaDescription: string\n metaKeywords: string[]\n messageId: string\n featuredImage: string\n seoAnalysis: SeoAnalysis | null\n }>({ isOpen: false, title: \"\", subtitle: \"\", content: \"\", metaDescription: \"\", metaKeywords: [], messageId: \"\", featuredImage: \"\", seoAnalysis: null })\n\n // selected image per message: messageId → image URL (empty = none selected)\n const [selectedImages, setSelectedImages] = useState<Record<string, string>>({})\n // SEO panel open per message\n const [seoOpen, setSeoOpen] = useState<Record<string, boolean>>({})\n // SEO suggestions expanded per message\n const [seoSugOpen, setSeoSugOpen] = useState<Record<string, boolean>>({})\n const [isPosting, setIsPosting] = useState(false)\n\n\n\n // Resizable split panel\n const [splitPct, setSplitPct] = useState(50)\n const wrapperRef = useRef<HTMLDivElement>(null)\n const isDragging = useRef(false)\n\n const handleDragStart = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n isDragging.current = true\n const onMove = (ev: MouseEvent) => {\n if (!isDragging.current || !wrapperRef.current) return\n const rect = wrapperRef.current.getBoundingClientRect()\n const pct = ((ev.clientX - rect.left) / rect.width) * 100\n setSplitPct(Math.min(80, Math.max(20, pct)))\n }\n const onUp = () => {\n isDragging.current = false\n window.removeEventListener(\"mousemove\", onMove)\n window.removeEventListener(\"mouseup\", onUp)\n }\n window.addEventListener(\"mousemove\", onMove)\n window.addEventListener(\"mouseup\", onUp)\n }, [])\n\n\n const handleCopy = async (parsed: ParsedContent, messageId: string) => {\n try {\n const tempDiv = document.createElement(\"div\")\n let textContent = \"\"\n\n if (parsed.title) textContent += parsed.title + \"\\n\\n\"\n if (parsed.subtitle) textContent += parsed.subtitle + \"\\n\\n\"\n if (parsed.articleHtml) {\n tempDiv.innerHTML = parsed.articleHtml\n textContent += tempDiv.textContent || tempDiv.innerText || \"\"\n }\n if (parsed.metaDescription) textContent += \"\\n\\nMeta Description:\\n\" + parsed.metaDescription\n\n await navigator.clipboard.writeText(textContent)\n setCopiedId(messageId)\n setTimeout(() => setCopiedId(null), 2000)\n } catch (err) {\n console.error(\"Failed to copy:\", err)\n }\n }\n\n const handleEdit = (parsed: ParsedContent, messageId: string) => {\n setEditModal({\n isOpen: true,\n title: parsed.title || \"\",\n subtitle: parsed.subtitle || \"\",\n content: parsed.articleHtml || \"\",\n metaDescription: parsed.metaDescription || \"\",\n metaKeywords: parsed.metaKeywords,\n messageId,\n featuredImage: selectedImages[messageId] || \"\",\n seoAnalysis: parsed.seoAnalysis ?? null,\n })\n }\n\n const [downloadingKey, setDownloadingKey] = useState<string | null>(null)\n\n const handleCloseModal = () => {\n setEditModal({ isOpen: false, title: \"\", subtitle: \"\", content: \"\", metaDescription: \"\", metaKeywords: [], messageId: \"\", featuredImage: \"\", seoAnalysis: null })\n }\n\n const handleDownload = async (parsed: ParsedContent, messageId: string, format: 'docx' | 'pdf') => {\n const key = `${messageId}-${format}`\n setDownloadingKey(key)\n try {\n const apiUrl = getApiBaseUrl()\n const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null\n const apiKey = getApiKey()\n const res = await fetch(`${apiUrl}/contenify/rewrite/download`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify({\n title: parsed.title,\n subtitle: parsed.subtitle,\n article: parsed.articleHtml,\n metaDescription: parsed.metaDescription,\n metaKeywords: parsed.metaKeywords,\n format,\n }),\n })\n if (!res.ok) throw new Error('Download failed')\n const blob = await res.blob()\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `article.${format}`\n a.click()\n URL.revokeObjectURL(url)\n } catch (err) {\n console.error('Download failed:', err)\n } finally {\n setDownloadingKey(null)\n }\n }\n\n const handleDownloadFromModal = async (data: import('./EditModal').ArticleEditData, format: 'docx' | 'pdf') => {\n const key = `modal-${format}`\n setDownloadingKey(key)\n try {\n const apiUrl = getApiBaseUrl()\n const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null\n const apiKey = getApiKey()\n const res = await fetch(`${apiUrl}/contenify/rewrite/download`, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body: JSON.stringify({\n title: data.title,\n subtitle: data.subtitle,\n article: data.article,\n metaDescription: data.metaDescription,\n metaKeywords: data.keywords,\n format,\n }),\n })\n if (!res.ok) throw new Error('Download failed')\n const blob = await res.blob()\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = `article.${format}`\n a.click()\n URL.revokeObjectURL(url)\n } catch (err) {\n console.error('Download failed:', err)\n } finally {\n setDownloadingKey(null)\n }\n }\n\n const handlePostFromModal = (data: import('./EditModal').ArticleEditData) => {\n setIsPosting(true)\n try {\n console.log(\"Posting article with data:\", data);\n window.dispatchEvent(new CustomEvent('contenify-post-article', { detail: data }))\n } finally {\n setIsPosting(false)\n }\n }\n\n useLayoutEffect(() => {\n bottomRef.current?.scrollIntoView({ block: \"end\" })\n }, [messages])\n\n const handleSend = () => {\n if (!input.trim()) return\n onSend(input)\n setInput(\"\")\n if (textareaRef.current) {\n textareaRef.current.style.height = \"auto\"\n textareaRef.current.style.borderRadius = \"50px\"\n }\n }\n\n // Auto-resize textarea and adjust border-radius for multiline\n useEffect(() => {\n const textarea = textareaRef.current\n if (textarea) {\n textarea.style.height = \"auto\"\n textarea.style.height = `${textarea.scrollHeight}px`\n const isMultiline = textarea.scrollHeight > 48\n textarea.style.borderRadius = isMultiline ? \"1.25rem\" : \"50px\"\n }\n }, [input])\n\n const fetchSources = async () => {\n setLoadingSources(true)\n try {\n const data = await getNewsSources()\n setSources(data || [])\n } catch (err) {\n console.error(\"Failed to fetch sources:\", err)\n } finally {\n setLoadingSources(false)\n }\n }\n\n const fetchNews = async (sourceId: string | null) => {\n setLoadingNews(true)\n try {\n let data\n if (sourceId) {\n data = await getNewsBySource(sourceId)\n } else {\n data = await getTrendingNews()\n }\n setTrendingNews(data || [])\n } catch (err) {\n console.error(\"Failed to fetch news:\", err)\n setTrendingNews([])\n } finally {\n setLoadingNews(false)\n }\n }\n\n const handleScrape = async () => {\n if (!selectedSource) return\n setScraping(true)\n try {\n await scrapeNewsSource(selectedSource)\n await fetchNews(selectedSource)\n } catch (err) {\n console.error(\"Failed to scrape:\", err)\n } finally {\n setScraping(false)\n }\n }\n\n const handleSourceSelect = (sourceId: string | null) => {\n setSelectedSource(sourceId)\n fetchNews(sourceId)\n }\n\n const handleOpenNewsDropdown = () => {\n setShowNewsDropdown(true)\n if (sources.length === 0) {\n fetchSources()\n }\n if (trendingNews.length === 0) {\n fetchNews(selectedSource)\n }\n }\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setShowNewsDropdown(false)\n }\n }\n\n if (showNewsDropdown) {\n document.addEventListener(\"mousedown\", handleClickOutside)\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside)\n }\n }, [showNewsDropdown])\n\n // Convert vertical mouse-wheel to horizontal scroll on the pills row.\n // Depends on loadingSources too — the pills div only mounts after sources load.\n useEffect(() => {\n const el = pillsRef.current\n if (!el) return\n const onWheel = (e: WheelEvent) => {\n if (e.deltaY === 0) return\n e.preventDefault()\n el.scrollLeft += e.deltaY\n }\n el.addEventListener(\"wheel\", onWheel, { passive: false })\n return () => el.removeEventListener(\"wheel\", onWheel)\n }, [showNewsDropdown, loadingSources])\n\n\n\n const SUGGESTIONS = [\n { icon: <Link2 size={13} />, label: \"Paste a news URL to rewrite\" },\n { icon: <PenLine size={13} />, label: \"Write a blog post about AI\" },\n { icon: <LayoutList size={13} />, label: \"Summarize today's top stories\" },\n { icon: <Share2 size={13} />, label: \"Create social media posts\" },\n ]\n\n const isEmpty = messages.length === 0\n\n return (\n <div\n ref={wrapperRef}\n className={`cnfy-editor-wrapper${editModal.isOpen ? ' cnfy-editor-wrapper--editing' : ''}`}\n >\n {/* ── Chat pane ── */}\n <div\n className={`cnfy-chat cnfy-editor-chat-pane${isEmpty ? ' cnfy-chat--empty' : ''}`}\n style={editModal.isOpen ? { flex: `0 0 ${splitPct}%`, width: `${splitPct}%` } : undefined}\n >\n {/* Empty state — shown centered above input when no messages */}\n {isEmpty && (\n <div className=\"cnfy-empty-hero\">\n <div className=\"cnfy-empty-hero-icon\">\n <Sparkles size={22} />\n </div>\n <div>\n <p className=\"cnfy-empty-state-title\">AI News Assistant</p>\n <p className=\"cnfy-empty-state-subtitle\">Generate, rewrite and publish content in seconds</p>\n </div>\n </div>\n )}\n\n\n {/* Chat Area */}\n <div className=\"cnfy-chat-area\">\n <div className=\"cnfy-chat-scroll\">\n {messages.map(msg => {\n const parsed = formatAIContent(msg.content)\n\n return (\n <div key={msg.id} className=\"cnfy-msg\">\n <div className={msg.role === \"assistant\"?`cnfy-msg-body`:`cnfy-msg-body you`}>\n {/* Copy button + SEO toggle for article content */}\n {msg.role === \"assistant\" && parsed.isArticle && (\n <div className=\"cnfy-msg-copy-row\">\n {parsed.seoAnalysis && (!isStreaming || msg.id !== messages[messages.length - 1]?.id) && (\n <button\n type=\"button\"\n onClick={() => setSeoOpen(prev => ({ ...prev, [msg.id]: !prev[msg.id] }))}\n className={`cnfy-seo-toggle-btn${seoOpen[msg.id] ? ' cnfy-seo-toggle-btn--active' : ''}`}\n title=\"SEO Analysis\"\n >\n <BarChart2 size={13} />\n <span className=\"cnfy-seo-toggle-score\"\n style={{ color: seoScoreColor(parsed.seoAnalysis.overall) }}>\n {parsed.seoAnalysis.overall}%\n </span>\n </button>\n )}\n <button\n onClick={() => handleCopy(parsed, msg.id)}\n className=\"cnfy-copy-btn\"\n title=\"Copy to clipboard\"\n >\n {copiedId === msg.id ? (\n <Check size={16} className=\"cnfy-copy-icon--copied\" />\n ) : (\n <Copy size={16} />\n )}\n </button>\n </div>\n )}\n\n {/* Creating indicator - show when streaming and message is empty */}\n {msg.role === \"assistant\" && isStreaming && msg.id === messages[messages.length - 1]?.id && !parsed.isArticle && !parsed.plainText && (\n <div className=\"cnfy-creating-indicator\">\n <Loader2 size={16} className=\"cnfy-animate-spin\" />\n <span>Creating article...</span>\n </div>\n )}\n\n {/* SEO Analysis Panel — toggled by the header button */}\n {parsed.isArticle && parsed.seoAnalysis && seoOpen[msg.id] && (() => {\n const seo = parsed.seoAnalysis!\n const breakdown = [\n { key: 'title', label: 'Title', section: seo.breakdown.title },\n { key: 'meta', label: 'Meta', section: seo.breakdown.meta },\n { key: 'content', label: 'Content', section: seo.breakdown.content },\n { key: 'keywords', label: 'Keywords', section: seo.breakdown.keywords },\n { key: 'readability', label: 'Readability', section: seo.breakdown.readability },\n ]\n const allIssues = breakdown.flatMap(b => b.section?.issues ?? []).filter(Boolean)\n const sugOpen = !!seoSugOpen[msg.id]\n return (\n <div className=\"cnfy-seo-panel\">\n {/* Header */}\n <div className=\"cnfy-seo-header\">\n <div className=\"cnfy-seo-title\">\n <BarChart2 size={13} />\n SEO Analysis\n {seo.improvement != null && seo.improvement > 0 && (\n <span className=\"cnfy-seo-improvement-badge\">\n ↑ +{seo.improvement} pts\n </span>\n )}\n </div>\n <div className=\"cnfy-seo-score-info\">\n {seo.before && (\n <span className=\"cnfy-seo-before\">\n was {seo.before.overall}\n <span className=\"cnfy-seo-before-grade\" style={{ background: seoGradeColor(seo.before.grade) }}>\n {seo.before.grade}\n </span>\n </span>\n )}\n <span className=\"cnfy-seo-score-num\">{seo.overall}</span>\n <span className=\"cnfy-seo-score-denom\">/100</span>\n <div className=\"cnfy-seo-grade\" style={{ background: seoGradeColor(seo.grade) }}>\n {seo.grade}\n </div>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"cnfy-seo-body\">\n {/* Overall bar */}\n <div className=\"cnfy-seo-overall-bar\">\n <div\n className=\"cnfy-seo-overall-fill\"\n style={{ width: `${seo.overall}%`, background: seoScoreColor(seo.overall) }}\n />\n </div>\n\n {/* Per-category breakdown */}\n <div className=\"cnfy-seo-breakdown\">\n {breakdown.map(({ key, label, section }) => section && (\n <div key={key} className=\"cnfy-seo-breakdown-row\">\n <span className=\"cnfy-seo-bd-label\">{label}</span>\n <div className=\"cnfy-seo-bd-bar\">\n <div\n className=\"cnfy-seo-bd-fill\"\n style={{ width: `${section.score}%`, background: seoScoreColor(section.score) }}\n />\n </div>\n <span className=\"cnfy-seo-bd-score\" style={{ color: seoScoreColor(section.score) }}>\n {section.score}\n </span>\n {section.readingLabel && (\n <span className=\"cnfy-seo-bd-extra\">{section.readingLabel}</span>\n )}\n </div>\n ))}\n </div>\n\n {/* Issues */}\n {allIssues.length > 0 && (\n <div className=\"cnfy-seo-issues\">\n <div className=\"cnfy-seo-issues-title\">\n <AlertTriangle size={11} />\n {allIssues.length} {allIssues.length === 1 ? 'Issue' : 'Issues'}\n </div>\n {allIssues.map((issue, i) => (\n <div key={i} className=\"cnfy-seo-issue-item\">{issue}</div>\n ))}\n </div>\n )}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end', padding: '8px 0' }}>\n <button\n onClick={() => onResolveSeo?.({\n title: parsed.title,\n subtitle: parsed.subtitle,\n article: parsed.articleHtml,\n metaDescription: parsed.metaDescription,\n metaKeywords: parsed.metaKeywords,\n seoAnalysis: parsed.seoAnalysis!,\n language: parsed.article?.language,\n historyId: parsed.article?._id ?? parsed.article?.historyId,\n })}\n disabled={isStreaming}\n className=\"cnfy-btn-fix-seo\"\n >\n <Wand2 size={16} />\n Fix SEO\n </button>\n </div>\n\n {/* Suggestions */}\n {seo.suggestions.length > 0 && (\n <div className=\"cnfy-seo-suggestions\">\n <button\n type=\"button\"\n className=\"cnfy-seo-suggestions-toggle\"\n onClick={() => setSeoSugOpen(prev => ({ ...prev, [msg.id]: !prev[msg.id] }))}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <Lightbulb size={11} />\n {seo.suggestions.length} Suggestions\n </span>\n {sugOpen ? <ChevronUp size={12} /> : <ChevronDown size={12} />}\n </button>\n {sugOpen && (\n <div className=\"cnfy-seo-suggestions-list\">\n {seo.suggestions.map((s: string, i: number) => (\n <div key={i} className=\"cnfy-seo-suggestion-item\">{s}</div>\n ))}\n </div>\n )}\n\n \n {/* add button here... */}\n </div>\n )}\n </div>\n </div>\n )\n })()}\n\n {/* Content action options - show when URL was analyzed */}\n {msg.role === \"assistant\" && analyzedData?.messageId === msg.id && analyzedData.options.length > 0 && (\n <div className=\"cnfy-action-options\">\n {analyzedData.options.map((option) => {\n const IconComponent = ACTION_ICONS[option.id] || FileText\n return (\n <button\n key={option.id}\n onClick={() => onSelectAction?.(option.id, analyzedData.url, analyzedData.content)}\n className=\"cnfy-action-btn\"\n >\n <IconComponent size={16} />\n {option.name}\n </button>\n )\n })}\n </div>\n )}\n\n {/* Article content - structured rendering */}\n {parsed.isArticle ? (\n <>\n {/* Title — plain text */}\n {parsed.title && (\n <h1 className=\"cnfy-block-h1\">\n {parsed.title}\n {activeField === \"title\" && <span className=\"cnfy-cursor-blink\">|</span>}\n </h1>\n )}\n\n {parsed.subtitle && (\n <h2 className=\"cnfy-block-h2\">\n {parsed.subtitle}\n {activeField === \"subtitle\" && <span className=\"cnfy-cursor-blink\">|</span>}\n </h2>\n )}\n <hr className=\"cnfy-divider\" />\n {/* Article — streamed HTML, render directly */}\n {parsed.articleHtml && (\n <div\n className=\"cnfy-article-content\"\n dangerouslySetInnerHTML={{ __html: parsed.articleHtml }}\n />\n )}\n {activeField === \"article\" && <span className=\"cnfy-cursor-blink\">|</span>}\n </>\n ) : (\n /* Plain text messages (status, error, options, etc.) */\n parsed.plainText && (\n <p className=\"cnfy-block-p\">{parsed.plainText}</p>\n )\n )}\n\n {parsed.metaDescription && (\n <div className=\"cnfy-msg-keywords\">\n <div className=\"cnfy-msg-keywords-label\">Meta Description</div>\n <div className=\"cnfy-block-p\">\n {parsed.metaDescription}\n </div>\n </div>\n )}\n\n {/* Meta Keywords */}\n {parsed.metaKeywords.length > 0 && (\n <div className=\"cnfy-msg-keywords\">\n <div className=\"cnfy-msg-keywords-label\">Keywords</div>\n <div className=\"cnfy-msg-keywords-list\">\n {parsed.metaKeywords.map((tag, i) => (\n <span\n key={i}\n className=\"cnfy-msg-keyword-tag\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Image Slider — shown after keywords when images are available */}\n {parsed.isArticle && parsed.images.length > 0 && (\n <div className=\"cnfy-image-slider-wrap\">\n <div className=\"cnfy-image-slider-label\">Select a featured image</div>\n <div className=\"cnfy-image-slider\">\n {parsed.images.map((img, i) => {\n const isSelected = selectedImages[msg.id] === img.url\n return (\n <button\n key={i}\n type=\"button\"\n onClick={() =>\n setSelectedImages(prev => ({\n ...prev,\n [msg.id]: isSelected ? \"\" : img.url,\n }))\n }\n className={`cnfy-image-slider-item${isSelected ? \" cnfy-image-slider-item--selected\" : \"\"}`}\n title={img.photographer ? `Photo by ${img.photographer}` : undefined}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img src={img.thumb} alt={`Image ${i + 1}`} className=\"cnfy-image-slider-thumb\" />\n {isSelected && (\n <span className=\"cnfy-image-slider-check\">\n <Check size={12} />\n </span>\n )}\n </button>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Edit and Post buttons for AI responses - only show when streaming is complete */}\n {msg.role === \"assistant\" && parsed.isArticle && !analyzedData?.messageId && (!isStreaming || msg.id !== messages[messages.length - 1]?.id) && (\n <div className=\"cnfy-msg-actions\">\n <button\n onClick={() => handleEdit(parsed, msg.id)}\n className=\"cnfy-btn-edit\"\n >\n <Edit3 size={16} />\n Edit\n </button>\n \n <button\n onClick={() => handleDownload(parsed, msg.id, 'docx')}\n disabled={downloadingKey === `${msg.id}-docx`}\n className=\"cnfy-btn-download\"\n >\n {downloadingKey === `${msg.id}-docx` ? <Loader2 size={16} className=\"cnfy-animate-spin\" /> : <FileDown size={16} />}\n DOCX\n </button>\n <button\n onClick={() => handleDownload(parsed, msg.id, 'pdf')}\n disabled={downloadingKey === `${msg.id}-pdf`}\n className=\"cnfy-btn-download cnfy-btn-download--pdf\"\n style={{ background: THEME_GRADIENT, color: \"#fff\", border: 'none' }}\n >\n {downloadingKey === `${msg.id}-pdf` ? <Loader2 size={16} className=\"cnfy-animate-spin\" /> : <FileDown size={16} />}\n PDF\n </button>\n </div>\n )}\n </div>\n </div>\n )\n })}\n\n <div ref={bottomRef} />\n </div>\n </div>\n\n {/* Suggestion chips — only in empty state */}\n {isEmpty && (\n <div className=\"cnfy-suggestions\">\n {SUGGESTIONS.map((s) => (\n <button\n key={s.label}\n className=\"cnfy-suggestion-chip\"\n onClick={() => { setInput(s.label); textareaRef.current?.focus() }}\n >\n {s.icon}\n {s.label}\n </button>\n ))}\n </div>\n )}\n\n {/* Input */}\n <div className=\"cnfy-input-area\">\n <div className=\"cnfy-input-inner\">\n {/* Pulse Icon - Trending News */}\n <div ref={dropdownRef} className=\"cnfy-news-pulse-wrap\">\n <button\n onClick={handleOpenNewsDropdown}\n className=\"cnfy-news-pulse-btn cnfy-animate-pulse\"\n title=\"Select from trending news\"\n >\n <Zap size={16} />\n </button>\n\n {/* News Dropdown */}\n {showNewsDropdown && (\n <div className=\"cnfy-news-dropdown\">\n {/* Header */}\n <div className=\"cnfy-news-dropdown-header\" style={{ background: THEME_GRADIENT, color: \"#fff\" }}>\n <span className=\"cnfy-news-dropdown-title\">Select News</span>\n <button\n onClick={() => setShowNewsDropdown(false)}\n className=\"cnfy-news-dropdown-close\"\n style={{ background: \"transparent\", color: \"#fff\" }}\n >\n <X size={14} />\n </button>\n </div>\n\n {/* Source Pills */}\n <div className=\"cnfy-source-pills-wrap\">\n {loadingSources ? (\n <div className=\"cnfy-source-pills-loading\">\n <Loader2 size={14} className=\"cnfy-animate-spin\" /> Loading sources…\n </div>\n ) : (\n <div className=\"cnfy-source-pills\" ref={pillsRef}>\n <button\n className={`cnfy-source-pill ${!selectedSource ? 'cnfy-source-pill--active' : ''}`}\n style={!selectedSource ? { background: THEME_GRADIENT, borderColor: 'transparent', color: '#fff' } : {}}\n onClick={() => handleSourceSelect(null)}\n >\n All\n </button>\n {sources\n .map((source) => (\n <button\n key={source.id}\n className={`cnfy-source-pill ${selectedSource === source.id ? 'cnfy-source-pill--active' : ''}`}\n style={selectedSource === source.id ? { background: THEME_GRADIENT, borderColor: 'transparent', color: '#fff' } : {}}\n onClick={() => handleSourceSelect(source.id)}\n >\n {source.name}\n </button>\n ))}\n </div>\n )}\n <button\n onClick={() => selectedSource ? handleScrape() : fetchNews(null)}\n disabled={scraping || loadingNews}\n className=\"cnfy-source-refresh-btn\"\n title={selectedSource ? 'Fetch latest news' : 'Refresh'}\n >\n <RefreshCcw size={13} className={scraping || loadingNews ? 'cnfy-animate-spin' : ''} />\n </button>\n </div>\n\n {/* News List */}\n <div className=\"cnfy-news-dropdown-list\">\n {loadingNews ? (\n <div className=\"cnfy-news-dropdown-msg\">\n Loading news...\n </div>\n ) : trendingNews.length === 0 ? (\n <div className=\"cnfy-news-dropdown-msg\">\n <p>No news found.</p>\n {selectedSource && (\n <p className=\"cnfy-news-dropdown-hint\">Click "Scrape" to fetch latest news.</p>\n )}\n </div>\n ) : (\n <NewsList\n news={trendingNews.slice(0, 10)}\n onView={(item) => window.open(item.sourceUrl || item.link, \"_blank\")}\n onRecreate={(payload) => {\n setShowNewsDropdown(false)\n onSelectNews?.(payload)\n }}\n />\n )}\n </div>\n </div>\n )}\n </div>\n\n <textarea\n ref={textareaRef}\n value={input}\n onChange={e => setInput(e.target.value)}\n onKeyDown={e => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }}\n rows={1}\n placeholder=\"Ask AI something…\"\n className={`cnfy-chat-textarea ${!showNewsPanel ? 'cnfy-chat-textarea--with-trigger' : ''}`}\n style={{ maxHeight: \"200px\", overflowY: input.split(\"\\n\").length > 6 ? \"auto\" : \"hidden\" }}\n />\n <button\n onClick={handleSend}\n className=\"cnfy-send-btn\"\n style={{ background: THEME_GRADIENT, color: \"#fff\" }}\n >\n <SendHorizontal size={18} />\n </button>\n </div>\n </div>\n\n </div>\n\n {/* ── Drag handle (visible only when editing) ── */}\n {editModal.isOpen && (\n <div className=\"cnfy-resize-handle\" onMouseDown={handleDragStart}>\n <div className=\"cnfy-resize-handle-bar\" />\n </div>\n )}\n\n {/* ── Edit pane ── */}\n <div\n className=\"cnfy-editor-edit-pane\"\n style={editModal.isOpen ? { flex: `0 0 ${100 - splitPct}%`, width: `${100 - splitPct}%` } : undefined}\n >\n <EditModal\n isOpen={editModal.isOpen}\n inline\n initialTitle={editModal.title}\n initialSubtitle={editModal.subtitle}\n initialContent={editModal.content}\n initialMetaDescription={editModal.metaDescription}\n metaKeywords={editModal.metaKeywords}\n initialFeaturedImage={editModal.featuredImage}\n seoAnalysis={editModal.seoAnalysis}\n onClose={handleCloseModal}\n onDownload={handleDownloadFromModal}\n downloadingFormat={downloadingKey?.startsWith('modal-') ? (downloadingKey.replace('modal-', '') as 'docx' | 'pdf') : null}\n onPost={handlePostFromModal}\n isPosting={isPosting}\n />\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { X, FileDown, Loader2, BarChart2, AlertTriangle, Lightbulb, ChevronDown, ChevronUp, Send } from \"lucide-react\"\nimport { useEffect, useLayoutEffect, useState } from \"react\"\nimport RichTextEditor from \"./RichTextEditor\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport type { SeoAnalysis } from \"@/src/types/ai\"\n\nfunction seoScoreColor(score: number): string {\n if (score >= 80) return '#10b981'\n if (score >= 60) return '#f59e0b'\n if (score >= 40) return '#f97316'\n return '#ef4444'\n}\n\nfunction seoGradeColor(grade: string): string {\n if (grade === 'A') return '#10b981'\n if (grade === 'B') return '#3b82f6'\n if (grade === 'C') return '#f59e0b'\n if (grade === 'D') return '#f97316'\n return '#ef4444'\n}\n\nexport type ArticleEditData = {\n title: string\n subtitle: string\n article: string\n metaDescription: string\n slug: string\n keywords: string[]\n featuredImage?: string\n}\n\ntype EditModalProps = {\n isOpen: boolean\n inline?: boolean\n initialTitle?: string\n initialSubtitle?: string\n initialContent: string\n initialMetaDescription?: string\n metaKeywords: string[]\n initialFeaturedImage?: string\n seoAnalysis?: SeoAnalysis | null\n onClose: () => void\n onDownload?: (data: ArticleEditData, format: 'docx' | 'pdf') => void\n downloadingFormat?: 'docx' | 'pdf' | null\n onPost?: (data: ArticleEditData) => void\n isPosting?: boolean\n}\n\nfunction toSlug(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n}\n\nexport default function EditModal({\n isOpen,\n inline = false,\n initialTitle = \"\",\n initialSubtitle = \"\",\n initialContent,\n initialMetaDescription = \"\",\n metaKeywords,\n initialFeaturedImage = \"\",\n seoAnalysis = null,\n onClose,\n onDownload,\n downloadingFormat,\n onPost,\n isPosting = false,\n}: EditModalProps) {\n const { primaryColor } = useTheme()\n const [title, setTitle] = useState(\"\")\n const [seoSugOpen, setSeoSugOpen] = useState(false)\n const [subtitle, setSubtitle] = useState(\"\")\n const [slug, setSlug] = useState(\"\")\n const [slugEdited, setSlugEdited] = useState(false)\n const [metaDescription, setMetaDescription] = useState(\"\")\n const [content, setContent] = useState(\"\")\n const [keywords, setKeywords] = useState<string[]>(metaKeywords)\n const [newKeyword, setNewKeyword] = useState(\"\")\n const [featuredImage, setFeaturedImage] = useState(initialFeaturedImage)\n\n useLayoutEffect(() => {\n /* eslint-disable react-hooks/set-state-in-effect */\n setTitle(initialTitle)\n setSubtitle(initialSubtitle)\n setMetaDescription(initialMetaDescription)\n setSlug(toSlug(initialTitle))\n setSlugEdited(false)\n setContent(initialContent)\n setKeywords(metaKeywords)\n setFeaturedImage(initialFeaturedImage)\n /* eslint-enable react-hooks/set-state-in-effect */\n }, [initialTitle, initialSubtitle, initialContent, initialMetaDescription, metaKeywords, initialFeaturedImage])\n\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [isOpen])\n\n const handleTitleChange = (value: string) => {\n setTitle(value)\n if (!slugEdited) {\n setSlug(toSlug(value))\n }\n }\n\n const handleSlugChange = (value: string) => {\n setSlug(toSlug(value))\n setSlugEdited(true)\n }\n\n const handleAddKeyword = () => {\n if (newKeyword.trim() && !keywords.includes(newKeyword.trim())) {\n setKeywords([...keywords, newKeyword.trim()])\n setNewKeyword(\"\")\n }\n }\n\n const handleRemoveKeyword = (index: number) => {\n setKeywords(keywords.filter((_, i) => i !== index))\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n e.preventDefault()\n handleAddKeyword()\n }\n }\n\n const getEditData = (): ArticleEditData => ({\n title,\n subtitle,\n article: content,\n metaDescription,\n slug,\n keywords,\n featuredImage: featuredImage || undefined,\n })\n\n if (!isOpen) return null\n\n const editContent = (\n <>\n {/* Header */}\n <div className=\"cnfy-edit-modal-header\">\n <h2 className=\"cnfy-edit-modal-title\">Edit Article</h2>\n <button onClick={onClose} className=\"cnfy-edit-modal-close-btn\">\n <X size={20} className=\"cnfy-edit-modal-close-icon\" />\n </button>\n </div>\n\n {/* Content */}\n <div className=\"cnfy-edit-modal-body\">\n\n {/* Featured Image */}\n {featuredImage && (\n <div className=\"cnfy-edit-featured-image-wrap\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={featuredImage}\n alt=\"Featured\"\n className=\"cnfy-edit-featured-image\"\n />\n <button\n type=\"button\"\n onClick={() => setFeaturedImage(\"\")}\n className=\"cnfy-edit-featured-image-remove\"\n title=\"Remove image\"\n >\n <X size={14} />\n </button>\n </div>\n )}\n\n {/* Title */}\n <div>\n <label className=\"cnfy-edit-label\">Title</label>\n <input\n type=\"text\"\n value={title}\n onChange={e => handleTitleChange(e.target.value)}\n placeholder=\"Article title...\"\n className=\"cnfy-edit-input\"\n />\n </div>\n\n {/* Subtitle */}\n <div>\n <label className=\"cnfy-edit-label\">Subtitle</label>\n <input\n type=\"text\"\n value={subtitle}\n onChange={e => setSubtitle(e.target.value)}\n placeholder=\"Article subtitle...\"\n className=\"cnfy-edit-input\"\n />\n </div>\n\n {/* Slug */}\n <div>\n <label className=\"cnfy-edit-label\">Slug</label>\n <input\n type=\"text\"\n value={slug}\n onChange={e => handleSlugChange(e.target.value)}\n placeholder=\"article-url-slug\"\n className=\"cnfy-edit-input cnfy-edit-input--mono\"\n />\n </div>\n\n {/* Article Content - WYSIWYG Editor */}\n <div>\n <label className=\"cnfy-edit-label\">Article Content</label>\n <RichTextEditor\n content={content}\n onChange={setContent}\n placeholder=\"Start writing your article...\"\n />\n </div>\n\n {/* Meta Description */}\n <div>\n <label className=\"cnfy-edit-label\">Meta Description</label>\n <textarea\n value={metaDescription}\n onChange={e => setMetaDescription(e.target.value)}\n placeholder=\"Brief description for search engines...\"\n className=\"cnfy-edit-textarea\"\n rows={3}\n />\n </div>\n\n {/* Meta Keywords */}\n <div>\n <label className=\"cnfy-edit-label\">Meta Keywords</label>\n <div className=\"cnfy-keyword-list\">\n {keywords.map((keyword, index) => (\n <span key={index} className=\"cnfy-keyword-tag\">\n #{keyword}\n <button\n onClick={() => handleRemoveKeyword(index)}\n className=\"cnfy-keyword-remove-btn\"\n >\n <X size={14} />\n </button>\n </span>\n ))}\n </div>\n <div className=\"cnfy-keyword-input-row\">\n <input\n type=\"text\"\n value={newKeyword}\n onChange={e => setNewKeyword(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Add a keyword...\"\n className=\"cnfy-keyword-input\"\n />\n <button onClick={handleAddKeyword} className=\"cnfy-btn-add-keyword\">\n Add\n </button>\n </div>\n </div>\n\n {/* SEO Analysis */}\n {seoAnalysis && (() => {\n const seo = seoAnalysis\n const breakdown = [\n { key: 'title', label: 'Title', section: seo.breakdown.title },\n { key: 'meta', label: 'Meta', section: seo.breakdown.meta },\n { key: 'content', label: 'Content', section: seo.breakdown.content },\n { key: 'keywords', label: 'Keywords', section: seo.breakdown.keywords },\n { key: 'readability', label: 'Readability', section: seo.breakdown.readability },\n ]\n const allIssues = breakdown.flatMap(b => b.section?.issues ?? []).filter(Boolean)\n return (\n <div className=\"cnfy-seo-panel\">\n {/* Header */}\n <div className=\"cnfy-seo-header\">\n <div className=\"cnfy-seo-title\">\n <BarChart2 size={13} />\n SEO Analysis\n {seo.improvement != null && seo.improvement > 0 && (\n <span className=\"cnfy-seo-improvement-badge\">↑ +{seo.improvement} pts</span>\n )}\n </div>\n <div className=\"cnfy-seo-score-info\">\n {seo.before && (\n <span className=\"cnfy-seo-before\">\n was {seo.before.overall}\n <span className=\"cnfy-seo-before-grade\" style={{ background: seoGradeColor(seo.before.grade) }}>\n {seo.before.grade}\n </span>\n </span>\n )}\n <span className=\"cnfy-seo-score-num\">{seo.overall}</span>\n <span className=\"cnfy-seo-score-denom\">/100</span>\n <div className=\"cnfy-seo-grade\" style={{ background: seoGradeColor(seo.grade) }}>\n {seo.grade}\n </div>\n </div>\n </div>\n\n {/* Body */}\n <div className=\"cnfy-seo-body\">\n {/* Overall bar */}\n <div className=\"cnfy-seo-overall-bar\">\n <div\n className=\"cnfy-seo-overall-fill\"\n style={{ width: `${seo.overall}%`, background: seoScoreColor(seo.overall) }}\n />\n </div>\n\n {/* Breakdown */}\n <div className=\"cnfy-seo-breakdown\">\n {breakdown.map(({ key, label, section }) => section && (\n <div key={key} className=\"cnfy-seo-breakdown-row\">\n <span className=\"cnfy-seo-bd-label\">{label}</span>\n <div className=\"cnfy-seo-bd-bar\">\n <div\n className=\"cnfy-seo-bd-fill\"\n style={{ width: `${section.score}%`, background: seoScoreColor(section.score) }}\n />\n </div>\n <span className=\"cnfy-seo-bd-score\" style={{ color: seoScoreColor(section.score) }}>\n {section.score}\n </span>\n {section.readingLabel && (\n <span className=\"cnfy-seo-bd-extra\">{section.readingLabel}</span>\n )}\n </div>\n ))}\n </div>\n\n {/* Issues */}\n {allIssues.length > 0 && (\n <div className=\"cnfy-seo-issues\">\n <div className=\"cnfy-seo-issues-title\">\n <AlertTriangle size={11} />\n {allIssues.length} {allIssues.length === 1 ? 'Issue' : 'Issues'}\n </div>\n {allIssues.map((issue, i) => (\n <div key={i} className=\"cnfy-seo-issue-item\">{issue}</div>\n ))}\n </div>\n )}\n\n {/* Suggestions */}\n {seo.suggestions.length > 0 && (\n <div className=\"cnfy-seo-suggestions\">\n <button\n type=\"button\"\n className=\"cnfy-seo-suggestions-toggle\"\n onClick={() => setSeoSugOpen(v => !v)}\n >\n <span style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <Lightbulb size={11} />\n {seo.suggestions.length} Suggestions\n </span>\n {seoSugOpen ? <ChevronUp size={12} /> : <ChevronDown size={12} />}\n </button>\n {seoSugOpen && (\n <div className=\"cnfy-seo-suggestions-list\">\n {seo.suggestions.map((s: string, i: number) => (\n <div key={i} className=\"cnfy-seo-suggestion-item\">{s}</div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n })()}\n </div>\n\n {/* Footer */}\n <div className=\"cnfy-edit-modal-footer\">\n <button onClick={onClose} className=\"cnfy-btn-footer-cancel\">\n Cancel\n </button>\n <button\n onClick={() => onDownload?.(getEditData(), 'docx')}\n disabled={downloadingFormat === 'docx'}\n className=\"cnfy-btn-download\"\n >\n {downloadingFormat === 'docx' ? <Loader2 size={15} className=\"cnfy-animate-spin\" /> : <FileDown size={15} />}\n DOCX\n </button>\n <button\n onClick={() => onDownload?.(getEditData(), 'pdf')}\n disabled={downloadingFormat === 'pdf'}\n className=\"cnfy-btn-download cnfy-btn-download--pdf\"\n style={{ backgroundColor: primaryColor, color: \"#fff\", border: 'none' }}\n >\n {downloadingFormat === 'pdf' ? <Loader2 size={15} className=\"cnfy-animate-spin\" /> : <FileDown size={15} />}\n PDF\n </button>\n {onPost && (\n <button\n onClick={() => onPost(getEditData())}\n disabled={isPosting}\n className=\"cnfy-btn-download\"\n style={{\n background: \"linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%)\",\n color: \"#fff\",\n border: \"none\",\n opacity: isPosting ? 0.7 : 1,\n }}\n >\n {isPosting ? <Loader2 size={15} className=\"cnfy-animate-spin\" /> : <Send size={15} />}\n Post\n </button>\n )}\n </div>\n </>\n )\n\n if (inline) {\n return <div className=\"cnfy-edit-inline\">{editContent}</div>\n }\n\n return (\n <div className=\"cnfy-edit-modal-overlay\">\n <div className=\"cnfy-edit-modal-backdrop\" onClick={onClose} />\n <div className=\"cnfy-edit-modal\">{editContent}</div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEditor, EditorContent } from \"@tiptap/react\"\nimport StarterKit from \"@tiptap/starter-kit\"\nimport Placeholder from \"@tiptap/extension-placeholder\"\nimport {\n Bold,\n Italic,\n List,\n ListOrdered,\n Heading1,\n Heading2,\n Undo,\n Redo,\n Pilcrow,\n} from \"lucide-react\"\nimport { useEffect } from \"react\"\n\ntype RichTextEditorProps = {\n content: string\n onChange: (content: string) => void\n placeholder?: string\n}\n\nexport default function RichTextEditor({\n content,\n onChange,\n placeholder = \"Start writing your article...\",\n}: RichTextEditorProps) {\n const editor = useEditor({\n immediatelyRender: false, // Prevents SSR hydration mismatch\n extensions: [\n StarterKit.configure({\n heading: {\n levels: [1, 2],\n },\n }),\n Placeholder.configure({\n placeholder,\n }),\n ],\n content: content,\n editorProps: {\n attributes: {\n class: \"ProseMirror\",\n },\n },\n onUpdate: ({ editor }) => {\n onChange(editor.getHTML())\n },\n })\n\n // Update editor content when prop changes\n useEffect(() => {\n if (editor && content !== editor.getHTML()) {\n editor.commands.setContent(content)\n }\n }, [content, editor])\n\n if (!editor) {\n return (\n <div className=\"cnfy-editor-loading\">\n Loading editor...\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-editor\">\n {/* Toolbar */}\n <div className=\"cnfy-toolbar\">\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 1 }).run()}\n isActive={editor.isActive(\"heading\", { level: 1 })}\n title=\"Heading 1\"\n >\n <Heading1 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleHeading({ level: 2 }).run()}\n isActive={editor.isActive(\"heading\", { level: 2 })}\n title=\"Heading 2\"\n >\n <Heading2 size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().setParagraph().run()}\n isActive={editor.isActive(\"paragraph\")}\n title=\"Paragraph\"\n >\n <Pilcrow size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBold().run()}\n isActive={editor.isActive(\"bold\")}\n title=\"Bold\"\n >\n <Bold size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleItalic().run()}\n isActive={editor.isActive(\"italic\")}\n title=\"Italic\"\n >\n <Italic size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleBulletList().run()}\n isActive={editor.isActive(\"bulletList\")}\n title=\"Bullet List\"\n >\n <List size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().toggleOrderedList().run()}\n isActive={editor.isActive(\"orderedList\")}\n title=\"Numbered List\"\n >\n <ListOrdered size={18} />\n </ToolbarButton>\n\n <div className=\"cnfy-toolbar-divider\" />\n\n <ToolbarButton\n onClick={() => editor.chain().focus().undo().run()}\n disabled={!editor.can().undo()}\n title=\"Undo\"\n >\n <Undo size={18} />\n </ToolbarButton>\n\n <ToolbarButton\n onClick={() => editor.chain().focus().redo().run()}\n disabled={!editor.can().redo()}\n title=\"Redo\"\n >\n <Redo size={18} />\n </ToolbarButton>\n </div>\n\n {/* Editor */}\n <EditorContent editor={editor} className=\"cnfy-editor-content\" />\n </div>\n )\n}\n\ntype ToolbarButtonProps = {\n onClick: () => void\n isActive?: boolean\n disabled?: boolean\n title: string\n children: React.ReactNode\n}\n\nfunction ToolbarButton({\n onClick,\n isActive,\n disabled,\n title,\n children,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n title={title}\n className={`cnfy-toolbar-btn ${\n isActive ? \"cnfy-toolbar-btn--active\" : \"\"\n } ${disabled ? \"cnfy-toolbar-btn--disabled\" : \"\"}`}\n >\n {children}\n </button>\n )\n}\n","export function useTheme() {\n return {\n loading: false,\n primaryColor: '#10b981',\n secondaryColor: '#064e3b',\n botName: 'ContenifyAI Assistant',\n logoUrl: '/logo.png',\n theme: 'system',\n showSidebar: true,\n showHeader: true,\n activeThemePreset: null,\n showNewsPanel: true,\n }\n}\n","// Chatbot runtime configuration — values can be overridden via setConfig()\nlet _apiUrl = process.env.NEXT_PUBLIC_CONTENIFY_API_URL || 'http://localhost:8080/api'\nlet _apiKey = process.env.NEXT_PUBLIC_API_KEY || ''\nlet _domain = process.env.NEXT_PUBLIC_CONTENIFY_DOMAIN || ''\n\nexport function setConfig(config: { apiUrl?: string; apiKey?: string; domain?: string }) {\n if (config.apiUrl) _apiUrl = config.apiUrl\n if (config.apiKey) _apiKey = config.apiKey\n if (config.domain) _domain = config.domain\n}\n\nexport function getApiBaseUrl(): string {\n return _apiUrl\n}\n\nexport function getServerBaseUrl(): string {\n return _apiUrl.replace(/\\/api\\/?$/, '')\n}\n\nexport function getApiKey(): string {\n return _apiKey\n}\n\nexport function getDomain(): string {\n return _domain\n}\n","\"use client\"\nimport { useState } from \"react\"\nimport { Eye, RefreshCcw } from \"lucide-react\"\nimport { useTheme } from \"@/hooks/useTheme\"\nimport { lightenColor } from \"@/src/utils/util\"\n\nconst dateFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n day: \"2-digit\",\n month: \"short\",\n year: \"numeric\",\n})\n\nconst timeFormatter = new Intl.DateTimeFormat(\"en-GB\", {\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false,\n})\n\nfunction extractLinksFromContent(html?: string) {\n if (!html) return []\n\n const parser = new DOMParser()\n const doc = parser.parseFromString(html, \"text/html\")\n\n return Array.from(doc.querySelectorAll(\"li\")).map((li) => {\n const anchor = li.querySelector(\"a\")\n const source = li.querySelector(\"font\")\n\n return {\n title: anchor?.textContent || \"\",\n url: anchor?.getAttribute(\"href\") || \"#\",\n source: source?.textContent || \"\",\n }\n })\n}\n\nexport default function NewsList({\n news,\n onView,\n onRecreate,\n}: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n news: any[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n onView: (item: any) => void\n onRecreate: (payload: { title: string; content?: string; id?: string }) => void\n}) {\n\n const { primaryColor } = useTheme();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [primaryColorState] = useState<any>(primaryColor);\n\n return (\n <div className=\"cnfy-news-list\">\n {news.flatMap((item) => {\n const publishedDate = new Date(item.publishedAt)\n const links = extractLinksFromContent(item.content)\n\n // CHILD CARDS\n if (links.length > 0) {\n return links.map((link, idx) => (\n <div\n key={`${item._id}-link-${idx}`}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {link.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n background: 'linear-gradient(135deg, rgba(139,92,246,0.12), rgba(236,72,153,0.10))',\n color: '#8b5cf6',\n border: '1px solid rgba(139,92,246,0.2)',\n }}\n >\n {link.source || item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => window.open(link.url, \"_blank\")}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: link.title,\n content: link.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n ))\n }\n\n // PARENT CARD\n return (\n <div\n key={item._id}\n className=\"cnfy-news-card\"\n >\n {/* LEFT CONTENT */}\n <div className=\"cnfy-news-card-content\">\n <p className=\"cnfy-news-card-title\">\n {item.title}\n </p>\n\n <div className=\"cnfy-news-card-meta\">\n <span\n className=\"cnfy-news-badge\"\n style={{\n backgroundColor: lightenColor(primaryColorState, 95),\n color: primaryColor,\n borderColor: lightenColor(primaryColorState, 95),\n }}\n >\n {item.sourceName}\n </span>\n\n <span>•</span>\n <span className=\"cnfy-news-card-category\">{item.category}</span>\n <span>•</span>\n\n <span>\n {dateFormatter.format(publishedDate)}{\" \"}\n {timeFormatter.format(publishedDate)}\n </span>\n </div>\n </div>\n\n {/* RIGHT ACTIONS */}\n <div className=\"cnfy-news-card-actions\">\n <button\n onClick={() => onView(item)}\n className=\"cnfy-news-action-btn\"\n title=\"View\"\n >\n <Eye size={16} />\n </button>\n\n <button\n onClick={() =>\n onRecreate({\n title: item.title,\n content: item.content || item.title,\n id: item._id,\n })\n }\n className=\"cnfy-news-action-btn\"\n title=\"Recreate\"\n >\n <RefreshCcw size={16} />\n </button>\n </div>\n </div>\n )\n })}\n </div>\n )\n}\n","\n\nexport const lightenColor = (hex: string, amount: number): string => {\n const sanitized = hex.replace(\"#\", \"\")\n const r = parseInt(sanitized.substring(0, 2), 16)\n const g = parseInt(sanitized.substring(2, 4), 16)\n const b = parseInt(sanitized.substring(4, 6), 16)\n const mix = amount / 100\n const lr = Math.round(r + (255 - r) * mix)\n const lg = Math.round(g + (255 - g) * mix)\n const lb = Math.round(b + (255 - b) * mix)\n return `#${lr.toString(16).padStart(2, \"0\")}${lg.toString(16).padStart(2, \"0\")}${lb.toString(16).padStart(2, \"0\")}`\n}\n\nexport const hexToRgba = (hex: string, opacity: number) => {\n const sanitizedHex = hex.replace(\"#\", \"\");\n\n const r = parseInt(sanitizedHex.substring(0, 2), 16);\n const g = parseInt(sanitizedHex.substring(2, 4), 16);\n const b = parseInt(sanitizedHex.substring(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n};\n\n\n\n","import axios from 'axios'\nimport { getApiBaseUrl, getApiKey } from './config'\n\nexport class ApiKeyInvalidError extends Error {\n readonly isApiKeyInvalid = true\n constructor() {\n super('Invalid or expired subscription key')\n this.name = 'ApiKeyInvalidError'\n }\n}\n\nfunction emitApiKeyInvalid() {\n if (typeof window !== 'undefined') {\n window.dispatchEvent(new CustomEvent('api-key-invalid'))\n }\n}\n\nconst api = axios.create({\n withCredentials: true,\n timeout: 15000, // 15 s — prevents requests hanging indefinitely\n headers: {\n 'Content-Type': 'application/json',\n },\n})\n\n// Request middleware — picks up the latest baseURL, apiKey, and JWT token on every request\napi.interceptors.request.use(\n (config) => {\n config.baseURL = getApiBaseUrl()\n const apiKey = getApiKey()\n if (!apiKey) {\n emitApiKeyInvalid()\n return Promise.reject(new ApiKeyInvalidError())\n }\n config.headers['x-api-key'] = apiKey\n if (typeof window !== 'undefined') {\n const token = localStorage.getItem('token')\n if (token) {\n config.headers['Authorization'] = `Bearer ${token}`\n }\n }\n return config\n },\n (error) => Promise.reject(error),\n)\n\n// Response interceptor — normalise errors and surface invalid key\napi.interceptors.response.use(\n (response) => {\n // Detect soft-fail: { success: false, message: \"Invalid or expired subscription key\" }\n const data = response.data\n if (\n data &&\n data.success === false &&\n typeof data.message === 'string' &&\n data.message.toLowerCase().includes('subscription key')\n ) {\n emitApiKeyInvalid()\n }\n return response\n },\n (error) => {\n const status: number | undefined = error.response?.status\n\n if (status === 401 || status === 403) {\n emitApiKeyInvalid()\n return Promise.reject(new ApiKeyInvalidError())\n }\n\n const message =\n error.response?.data?.message || error.message || 'Something went wrong'\n const err = new Error(message) as Error & { status?: number }\n err.status = status\n return Promise.reject(err)\n },\n)\n\nexport default api\n","import api from \"@/lib/api\"\n\nexport const getTrendingNews = async () => {\n const { data } = await api.get(\"/news/trending\")\n return data.data\n}\n\n/**\n * Get list of available news sources (RSS feeds)\n */\nexport const getNewsSources = async () => {\n const { data } = await api.get(\"/news/sources\")\n return data.data\n}\n\n/**\n * Scrape top 10 news from a specific source\n */\nexport const scrapeNewsSource = async (sourceId: string) => {\n const { data } = await api.post(\"/news/source\", { sourceId })\n return data.data\n}\n\n/**\n * Get previously scraped news by source\n */\nexport const getNewsBySource = async (sourceId: string) => {\n const { data } = await api.get(`/news/by-source/${sourceId}`)\n return data.data\n}\n","\"use client\"\n\nimport { useEffect } from \"react\"\nimport { X } from \"lucide-react\"\n\nexport default function Drawer({\n open,\n onClose,\n title,\n children,\n}: {\n open: boolean\n onClose: () => void\n title?: string\n children: React.ReactNode\n}) {\n // Prevent body scroll when drawer is open\n useEffect(() => {\n if (open) {\n document.body.style.overflow = \"hidden\"\n } else {\n document.body.style.overflow = \"\"\n }\n return () => {\n document.body.style.overflow = \"\"\n }\n }, [open])\n\n if (!open) return null\n\n return (\n <div className=\"cnfy-drawer-overlay\">\n {/* Backdrop */}\n <div className=\"cnfy-drawer-backdrop\" onClick={onClose} />\n\n {/* Panel */}\n <div className=\"cnfy-drawer-panel\">\n <div className=\"cnfy-drawer-header\">\n {title && <h2 className=\"cnfy-drawer-title\">{title}</h2>}\n <button onClick={onClose} className=\"cnfy-drawer-close-btn\">\n <X size={20} />\n </button>\n </div>\n\n <div className=\"cnfy-drawer-body\">\n {children}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\nimport { useState, useEffect } from \"react\"\nimport toast from \"react-hot-toast\"\nimport { triggerScrape, getScrapeStatus } from \"@/services/settings.service\"\nimport { hexToRgba } from \"@/src/utils/util\"\n\ninterface ScrapeStatus {\n isRunning: boolean\n lastRun?: string\n nextScheduled?: string\n totalScraped?: number\n}\n\nconst STATE_OPTIONS = [\n { value: \"Uttar Pradesh\", label: \"Uttar Pradesh\" }\n]\n\nconst CITY_OPTIONS = [\n \"Agra\",\n \"Aligarh\",\n \"Ayodhya\",\n \"Bareilly\",\n \"Bijnor\",\n \"Bulandshahr\",\n \"Etawah\",\n \"Firozabad\",\n \"Ghaziabad\",\n \"Gorakhpur\",\n \"Jhansi\",\n \"Kanpur\",\n \"Lucknow\",\n \"Mathura\",\n \"Meerut\",\n \"Moradabad\",\n \"Muzaffarnagar\",\n \"Noida\",\n \"Prayagraj\",\n \"Rampur\",\n \"Saharanpur\",\n \"Sitapur\",\n \"Unnao\",\n \"Varanasi\"\n].map(city => ({ value: city, label: city }))\n\nconst LANGUAGE_OPTIONS = [\n { value: \"en\", label: \"English\" },\n { value: \"hi\", label: \"Hindi\" },\n]\n\nexport default function PreferencesPage() {\n const primaryColor = \"#10b981\"\n\n const [botName, setBotName] = useState(\"\")\n const [logo, setLogo] = useState<File | null>(null)\n const [logoUrl, setLogoUrl] = useState<string | null>(null)\n const [state, setState] = useState<{ value: string; label: string } | null>(null)\n const [cities, setCities] = useState<{ value: string; label: string }[]>([])\n const [language, setLanguage] = useState<{ value: string; label: string } | null>(null)\n\n const [saving, setSaving] = useState(false)\n\n // News Scraping state\n const [scraping, setScraping] = useState(false)\n const [scrapeStatus, setScrapeStatus] = useState<ScrapeStatus | null>(null)\n const [loadingStatus, setLoadingStatus] = useState(true)\n\n // Store original values for comparison\n const [originalValues, setOriginalValues] = useState<{\n botName: string\n state: string | undefined\n cities: string[]\n language: string | undefined\n }>({\n botName: \"\",\n state: undefined,\n cities: [],\n language: undefined,\n })\n\n // Fetch scrape status on mount\n useEffect(() => {\n const fetchScrapeStatus = async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (error) {\n console.log(\"Failed to fetch scrape status:\", error)\n } finally {\n setLoadingStatus(false)\n }\n }\n fetchScrapeStatus()\n }, [])\n\n const handleScrape = async () => {\n setScraping(true)\n try {\n await triggerScrape({\n state: state?.value,\n cities: cities.map(c => c.value),\n })\n toast.success(\"News scraping started successfully!\")\n setTimeout(async () => {\n try {\n const data = await getScrapeStatus()\n setScrapeStatus(data)\n } catch (e) {\n console.log(\"Failed to refresh scrape status:\", e)\n }\n }, 2000)\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to trigger news scraping\")\n } finally {\n setScraping(false)\n }\n }\n\n\n const handleSave = async () => {\n if (!botName) {\n toast.error(\"Chatbot name is required\")\n return\n }\n\n setSaving(true)\n\n try {\n // Build payload with only changed fields\n const payload: {\n botName?: string\n logo?: File | null\n state?: string\n cities?: string[]\n language?: string\n } = {}\n\n // Check each field for changes\n if (botName !== originalValues.botName) {\n payload.botName = botName\n }\n\n if (logo) {\n payload.logo = logo\n }\n\n const currentState = state?.value\n if (currentState !== originalValues.state) {\n payload.state = currentState\n }\n\n const currentCities = cities.map(c => c.value)\n const citiesChanged =\n currentCities.length !== originalValues.cities.length ||\n currentCities.some((city, index) => city !== originalValues.cities[index])\n if (citiesChanged) {\n payload.cities = currentCities\n }\n\n const currentLanguage = language?.value\n if (currentLanguage !== originalValues.language) {\n payload.language = currentLanguage\n }\n\n // If no changes detected, show message\n if (Object.keys(payload).length === 0) {\n toast.error(\"No changes to save\")\n setSaving(false)\n return\n }\n\n setLogo(null) // Clear logo after successful save\n toast.success(\"Preferences saved successfully!\")\n } catch (error) {\n console.error(error)\n toast.error(\"Failed to save preferences\")\n } finally {\n setSaving(false)\n }\n }\n\n\n return (\n <div className=\"cnfy-dash-page\">\n {/* Chatbot Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Chatbot Settings</h2>\n\n {/* Chatbot Name */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Name</label>\n <input\n value={botName}\n onChange={(e) => setBotName(e.target.value)}\n className=\"cnfy-dash-input\"\n placeholder=\"Contenify AI\"\n />\n </div>\n\n {/* Logo */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Chatbot Logo</label>\n <div className=\"cnfy-logo-upload\">\n <div className=\"cnfy-logo-preview\">\n {logo ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={URL.createObjectURL(logo)}\n alt=\"Logo preview\"\n className=\"cnfy-logo-img\"\n />\n ) : logoUrl ? (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={logoUrl}\n alt=\"Current logo\"\n className=\"cnfy-logo-img\"\n />\n ) : (\n <span className=\"cnfy-logo-placeholder\">No logo</span>\n )}\n </div>\n\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={(e) => setLogo(e.target.files?.[0] || null)}\n className=\"cnfy-file-input\"\n />\n </div>\n </div>\n\n </div>\n\n\n {/* News Scraping */}\n <div className=\"cnfy-dash-card\">\n <div className=\"cnfy-dash-card-header\">\n <h2 className=\"cnfy-dash-card-title-inline\">News Scraping</h2>\n <p className=\"cnfy-dash-card-desc\">\n Scrape latest news from your configured locations\n </p>\n </div>\n\n {!loadingStatus && scrapeStatus && (\n <div className=\"cnfy-dash-grid cnfy-dash-grid--sm\">\n <div>\n <span className=\"cnfy-dash-label-muted\">Status:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.isRunning ? (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--yellow\">Running</span>\n ) : (\n <span className=\"cnfy-dash-badge cnfy-dash-badge--green\">Idle</span>\n )}\n </p>\n </div>\n\n {scrapeStatus.lastRun && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Last Run:</span>\n <p className=\"cnfy-dash-label-bold\">\n {new Date(scrapeStatus.lastRun).toLocaleString()}\n </p>\n </div>\n )}\n\n {scrapeStatus.totalScraped !== undefined && (\n <div>\n <span className=\"cnfy-dash-label-muted\">Total Scraped:</span>\n <p className=\"cnfy-dash-label-bold\">\n {scrapeStatus.totalScraped.toLocaleString()} articles\n </p>\n </div>\n )}\n </div>\n )}\n\n <div>\n <p className=\"cnfy-dash-info-text\">\n Current configuration: <strong>{state?.value}</strong>\n {cities.length > 0 && (\n <> - {cities.map(c => c.label).join(\", \")}</>\n )}\n </p>\n <button\n onClick={handleScrape}\n disabled={scraping || scrapeStatus?.isRunning}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: hexToRgba(primaryColor, 0.8) }}\n >\n {scraping ? \"Starting Scrape...\" : scrapeStatus?.isRunning ? \"Scraping in Progress...\" : \"Start Scraping\"}\n </button>\n </div>\n </div>\n\n {/* Localization Settings */}\n <div className=\"cnfy-dash-card\">\n <h2 className=\"cnfy-dash-card-title\">Localization Settings</h2>\n\n {/* State */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">State</label>\n <select\n className=\"cnfy-dash-input\"\n value={state?.value || \"\"}\n onChange={(e) => setState(STATE_OPTIONS.find(o => o.value === e.target.value) || null)}\n >\n <option value=\"\">Select state</option>\n {STATE_OPTIONS.map(opt => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n </div>\n\n {/* City */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Cities</label>\n <select\n multiple\n className=\"cnfy-dash-input\"\n value={cities.map(c => c.value)}\n disabled={!state}\n onChange={(e) => setCities(Array.from(e.target.selectedOptions).map(o => ({ value: o.value, label: o.text })))}\n >\n {CITY_OPTIONS.map(opt => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n </div>\n\n {/* Language */}\n <div className=\"cnfy-dash-field\">\n <label className=\"cnfy-dash-label\">Language</label>\n <select\n className=\"cnfy-dash-input\"\n value={language?.value || \"\"}\n onChange={(e) => setLanguage(LANGUAGE_OPTIONS.find(o => o.value === e.target.value) || null)}\n >\n <option value=\"\">Select language</option>\n {LANGUAGE_OPTIONS.map(opt => <option key={opt.value} value={opt.value}>{opt.label}</option>)}\n </select>\n </div>\n </div>\n\n \n\n {/* Save Button */}\n <div className=\"cnfy-dash-actions\">\n <button\n onClick={handleSave}\n disabled={saving}\n className=\"cnfy-dash-btn-save\"\n style={{ backgroundColor: primaryColor }}\n >\n {saving ? \"Saving...\" : \"Save Preferences\"}\n </button>\n </div>\n </div>\n )\n}\n","import api from \"@/lib/api\"\n\n/**\n * Trigger news scraping\n */\n\nexport const triggerScrape = async ({\n state,\n cities,\n}: {\n state?: string\n cities?: string[]\n}) => {\n const { data } = await api.post(\"/news/trigger\", {\n state,\n cities,\n })\n return data\n}\n\n/**\n * Get scraping status\n */\nexport const getScrapeStatus = async () => {\n const { data } = await api.get(\"/news/status\")\n return data.data\n}\n\n/**\n * Reset user data (daily limits, etc.)\n */\nexport const resetUserData = async () => {\n const { data } = await api.post(\"/users/reset\")\n return data\n}\n","\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { Trash2, Loader2, ChevronDown, AlertCircle, FileText, SquarePen, History, PanelLeftOpen, PanelLeftClose } from \"lucide-react\"\nimport {\n getHistory,\n deleteHistoryItem,\n type HistoryItem,\n type HistoryPagination,\n} from \"@/services/history.service\"\n\ntype HistoryPanelProps = {\n onSelect: (id: string) => Promise<void>\n onNewChat?: () => void\n}\n\nfunction formatDate(iso: string): string {\n const d = new Date(iso)\n const now = new Date()\n const diffMs = now.getTime() - d.getTime()\n const diffDays = Math.floor(diffMs / 86400000)\n if (diffDays === 0) return \"Today\"\n if (diffDays === 1) return \"Yesterday\"\n if (diffDays < 7) return `${diffDays} days ago`\n return d.toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" })\n}\n\nfunction groupByDate(items: HistoryItem[]): { label: string; items: HistoryItem[] }[] {\n const groups: Record<string, HistoryItem[]> = {}\n for (const item of items) {\n const label = formatDate(item.createdAt)\n if (!groups[label]) groups[label] = []\n groups[label].push(item)\n }\n return Object.entries(groups).map(([label, items]) => ({ label, items }))\n}\n\nexport default function HistoryPanel({ onSelect, onNewChat }: HistoryPanelProps) {\n const [collapsed, setCollapsed] = useState(false)\n const [items, setItems] = useState<HistoryItem[]>([])\n const [pagination, setPagination] = useState<HistoryPagination | null>(null)\n const [page, setPage] = useState(1)\n const [loading, setLoading] = useState(false)\n const [loadingMore, setLoadingMore] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [deletingId, setDeletingId] = useState<string | null>(null)\n const [selectingId, setSelectingId] = useState<string | null>(null)\n const [hoveredId, setHoveredId] = useState<string | null>(null)\n\n const fetchPage = useCallback(async (p: number, replace: boolean) => {\n if (p === 1) setLoading(true)\n else setLoadingMore(true)\n setError(null)\n try {\n const result = await getHistory(p, 20)\n setItems(prev => replace ? result.items : [...prev, ...result.items])\n setPagination(result.pagination)\n setPage(p)\n } catch {\n setError(\"Failed to load history\")\n } finally {\n setLoading(false)\n setLoadingMore(false)\n }\n }, [])\n\n useEffect(() => {\n fetchPage(1, true)\n }, [fetchPage])\n\n const handleDelete = async (e: React.MouseEvent, id: string) => {\n e.stopPropagation()\n setDeletingId(id)\n try {\n await deleteHistoryItem(id)\n setItems(prev => prev.filter(i => i._id !== id))\n setPagination(prev => prev ? { ...prev, total: prev.total - 1 } : prev)\n } catch {\n // silently ignore\n } finally {\n setDeletingId(null)\n }\n }\n\n const handleSelect = async (id: string) => {\n setSelectingId(id)\n try {\n await onSelect(id)\n setCollapsed(true)\n } finally {\n setSelectingId(null)\n }\n }\n\n const hasMore = pagination ? page < pagination.pages : false\n const groups = groupByDate(items)\n\n if (collapsed) {\n return (\n <div className=\"cnfy-history-panel cnfy-history-panel--collapsed\">\n <button\n className=\"cnfy-history-icon-btn\"\n onClick={() => setCollapsed(false)}\n title=\"Expand history\"\n >\n <PanelLeftOpen size={18} />\n </button>\n <button\n className=\"cnfy-history-icon-btn\"\n onClick={onNewChat}\n title=\"New chat\"\n >\n <SquarePen size={18} />\n </button>\n <div className=\"cnfy-history-icon-divider\" />\n <button\n className=\"cnfy-history-icon-btn\"\n onClick={() => setCollapsed(false)}\n title=\"History\"\n >\n <History size={18} />\n </button>\n </div>\n )\n }\n\n return (\n <div className=\"cnfy-history-panel\">\n {/* Header */}\n <div className=\"cnfy-history-header\">\n <button\n className=\"cnfy-history-icon-btn\"\n onClick={() => setCollapsed(true)}\n title=\"Collapse sidebar\"\n >\n <PanelLeftClose size={18} />\n </button>\n <button\n className=\"cnfy-history-icon-btn\"\n onClick={onNewChat}\n title=\"New chat\"\n >\n <SquarePen size={18} />\n </button>\n </div>\n\n {/* Body */}\n <div className=\"cnfy-history-body\">\n {loading && (\n <div className=\"cnfy-history-loading\">\n <Loader2 size={18} className=\"cnfy-animate-spin\" />\n </div>\n )}\n\n {!loading && error && (\n <div className=\"cnfy-history-error\">\n <AlertCircle size={15} />\n <span>{error}</span>\n <button onClick={() => fetchPage(1, true)} className=\"cnfy-history-retry-btn\">Retry</button>\n </div>\n )}\n\n {!loading && !error && items.length === 0 && (\n <div className=\"cnfy-history-empty\">\n <FileText size={24} className=\"cnfy-history-empty-icon\" />\n <p>No history yet</p>\n </div>\n )}\n\n {!loading && groups.map(group => (\n <div key={group.label} className=\"cnfy-history-group\">\n <div className=\"cnfy-history-group-label\">{group.label}</div>\n {group.items.map(item => (\n <div\n key={item._id}\n className={`cnfy-history-item${selectingId ? ' cnfy-history-item--disabled' : ''}`}\n onClick={() => !selectingId && handleSelect(item._id)}\n onMouseEnter={() => setHoveredId(item._id)}\n onMouseLeave={() => setHoveredId(null)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && !selectingId && handleSelect(item._id)}\n >\n <span className=\"cnfy-history-item-title\">\n {selectingId === item._id\n ? <Loader2 size={12} className=\"cnfy-animate-spin cnfy-history-item-spinner\" />\n : null}\n {item.title || \"Untitled\"}\n </span>\n {(hoveredId === item._id || deletingId === item._id) && (\n <button\n className=\"cnfy-history-delete-btn\"\n onClick={(e) => handleDelete(e, item._id)}\n disabled={deletingId === item._id}\n title=\"Delete\"\n >\n {deletingId === item._id\n ? <Loader2 size={12} className=\"cnfy-animate-spin\" />\n : <Trash2 size={12} />}\n </button>\n )}\n </div>\n ))}\n </div>\n ))}\n\n {hasMore && !loading && (\n <button\n onClick={() => fetchPage(page + 1, false)}\n disabled={loadingMore}\n className=\"cnfy-history-load-more\"\n >\n {loadingMore\n ? <><Loader2 size={13} className=\"cnfy-animate-spin\" /> Loading…</>\n : <><ChevronDown size={13} /> Load more</>}\n </button>\n )}\n </div>\n </div>\n )\n}\n","import { getApiBaseUrl, getApiKey } from '@/lib/config'\n\nfunction getHeaders(): Record<string, string> {\n const token = typeof window !== 'undefined' ? localStorage.getItem('token') : null\n const apiKey = getApiKey()\n return {\n 'Content-Type': 'application/json',\n ...(token ? { Authorization: `Bearer ${token}` } : {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n }\n}\n\nexport type HistoryItem = {\n _id: string\n title: string\n subtitle: string\n metaDescription: string\n metaKeywords: string[]\n language: string\n wordCount: number\n readingTimeMin: number\n tokensUsed: number\n sourceUrl: string\n createdAt: string\n}\n\nexport type HistoryFullItem = HistoryItem & { article: string }\n\nexport type HistoryPagination = {\n total: number\n page: number\n limit: number\n pages: number\n}\n\nexport async function getHistory(\n page = 1,\n limit = 20,\n): Promise<{ items: HistoryItem[]; pagination: HistoryPagination }> {\n const apiUrl = getApiBaseUrl()\n const res = await fetch(`${apiUrl}/contenify/history?page=${page}&limit=${limit}`, {\n credentials: 'include',\n headers: getHeaders(),\n })\n if (!res.ok) throw new Error('Failed to fetch history')\n const { data } = await res.json()\n return data\n}\n\nexport async function getHistoryItem(id: string): Promise<HistoryFullItem> {\n const apiUrl = getApiBaseUrl()\n const res = await fetch(`${apiUrl}/contenify/history/${id}`, {\n credentials: 'include',\n headers: getHeaders(),\n })\n if (!res.ok) throw new Error('Failed to fetch history item')\n const { data } = await res.json()\n return data\n}\n\nexport async function deleteHistoryItem(id: string): Promise<void> {\n const apiUrl = getApiBaseUrl()\n const res = await fetch(`${apiUrl}/contenify/history/${id}`, {\n method: 'DELETE',\n credentials: 'include',\n headers: getHeaders(),\n })\n if (!res.ok) throw new Error('Failed to delete history item')\n}\n\nexport async function clearHistory(): Promise<void> {\n const apiUrl = getApiBaseUrl()\n const res = await fetch(`${apiUrl}/contenify/history`, {\n method: 'DELETE',\n credentials: 'include',\n headers: getHeaders(),\n })\n if (!res.ok) throw new Error('Failed to clear history')\n}\n","import api from '@/lib/api'\nimport { getApiBaseUrl, getApiKey } from '@/lib/config'\n\n/* ─── Types ─── */\n\nexport interface ContentOption {\n id: string\n name: string\n description?: string\n icon?: string\n}\n\nexport interface RecreateSettings {\n tones: string[]\n styles: string[]\n wordCounts?: string[]\n}\n\nexport interface AnalyzeInputResponse {\n hasUrl: boolean\n url?: string\n content?: string\n wordCount?: number\n options: ContentOption[]\n recreateSettings?: RecreateSettings\n}\n\nexport interface CreateContentPayload {\n url: string\n content: string\n actionId: string\n settings?: {\n tone?: string\n style?: string\n wordCount?: string\n }\n}\n\nexport interface StreamCallbacks {\n onFieldStart?: (field: string) => void\n onContent: (field: string, chunk: string) => void\n onKeywords?: (keywords: string[]) => void\n onFieldEnd?: (field: string) => void\n onComplete?: (data: {\n title: string\n subtitle?: string\n article: string\n metaDescription?: string\n metaKeywords: string[]\n }) => void\n onError?: (error: Error) => void\n}\n\n/* ─── Helpers ─── */\n\nfunction getHeaders(): Record<string, string> {\n const apiKey = getApiKey()\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (apiKey) headers['x-api-key'] = apiKey\n if (typeof window !== 'undefined') {\n const token = localStorage.getItem('token')\n if (token) headers['Authorization'] = `Bearer ${token}`\n }\n return headers\n}\n\nasync function processSSEStream(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n callbacks: StreamCallbacks,\n) {\n const decoder = new TextDecoder()\n let buffer = ''\n\n const processLines = (lines: string[]) => {\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed.startsWith('data: ')) continue\n const data = trimmed.slice(6).trim()\n try {\n const event = JSON.parse(data)\n switch (event.type) {\n case 'start': break\n // Structured streaming (articleId present): field-scoped chunks\n case 'field_start': callbacks.onFieldStart?.(event.field); break\n case 'content': callbacks.onContent(event.field, event.content); break\n case 'keywords': callbacks.onKeywords?.(event.content); break\n case 'field_end': callbacks.onFieldEnd?.(event.field); break\n case 'done': callbacks.onComplete?.(event.data); return true\n // Plain token streaming (no articleId): route directly to article body\n case 'token': callbacks.onContent('article', event.content ?? ''); break\n case 'error': callbacks.onError?.(new Error(event.message)); return true\n }\n } catch { /* skip unparseable */ }\n }\n return false\n }\n\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n if (processLines(lines)) return\n }\n if (buffer.trim()) processLines([buffer])\n}\n\n/* ─── API endpoints ─── */\n\nexport const analyzeInputApi = async (input: string): Promise<AnalyzeInputResponse> => {\n const { data } = await api.post('/contenify/analyze-input', { input })\n return data.data\n}\n\nexport const createContentApi = async (payload: CreateContentPayload) => {\n const { data } = await api.post('/contenify/create-content', payload)\n return data.data\n}\n\nexport const createContentStreamApi = async ({\n url, content, actionId, settings,\n onFieldStart, onContent, onKeywords, onFieldEnd, onComplete, onError,\n}: CreateContentPayload & StreamCallbacks) => {\n const API_BASE_URL = getApiBaseUrl()\n const response = await fetch(`${API_BASE_URL}/contenify/create-content/stream`, {\n method: 'POST',\n headers: getHeaders(),\n credentials: 'include',\n body: JSON.stringify({ url, content, actionId, settings }),\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader available')\n await processSSEStream(reader, { onFieldStart, onContent, onKeywords, onFieldEnd, onComplete, onError })\n}\n\nexport const getContentOptionsApi = async () => {\n const { data } = await api.get('/contenify/content-options')\n return data.data\n}\n\nexport const rewriteNewsStreamApi = async ({\n article, language = 'English', articleId, tone, style, wordCount,\n includeQuotes, includeFAQ, targetAudience,\n onFieldStart, onContent, onKeywords, onFieldEnd, onComplete, onError,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n} & StreamCallbacks) => {\n const payload: Record<string, string | number | boolean | string[]> = { article, language, temperature: 1 }\n if (articleId) payload.articleId = articleId\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n\n try {\n const API_BASE_URL = getApiBaseUrl()\n const response = await fetch(`${API_BASE_URL}/contenify/rewrite/stream`, {\n method: 'POST',\n headers: getHeaders(),\n credentials: 'include',\n body: JSON.stringify(payload),\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n const contentType = response.headers.get('content-type') || ''\n if (contentType.includes('application/json')) {\n const json = await response.json()\n const d = json.data || json\n onComplete?.({\n title: d.title || '', subtitle: d.subtitle || '', article: d.article || '',\n metaDescription: d.metaDescription || '',\n metaKeywords: Array.isArray(d.metaKeywords) ? d.metaKeywords : [],\n })\n return\n }\n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader available')\n await processSSEStream(reader, { onFieldStart, onContent, onKeywords, onFieldEnd, onComplete, onError })\n } catch (error) {\n onError?.(error instanceof Error ? error : new Error(String(error)))\n throw error\n }\n}\n\nexport const resolveSeoStreamApi = async ({\n historyId, title, subtitle, metaDescription, metaKeywords, article, language,\n seoAnalysis,\n onFieldStart, onContent, onKeywords, onFieldEnd, onComplete, onError,\n}: {\n historyId?: string\n title: string\n subtitle?: string\n metaDescription?: string\n metaKeywords?: string[]\n article: string\n language?: string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n seoAnalysis: Record<string, any>\n} & StreamCallbacks) => {\n const API_BASE_URL = getApiBaseUrl()\n const response = await fetch(`${API_BASE_URL}/seo-engine/resolve/stream`, {\n method: 'POST',\n headers: getHeaders(),\n credentials: 'include',\n body: JSON.stringify({ historyId, title, subtitle, metaDescription, metaKeywords, article, language, seoAnalysis }),\n })\n if (!response.ok) {\n const errorText = await response.text()\n throw new Error(`HTTP error! status: ${response.status} - ${errorText}`)\n }\n const reader = response.body?.getReader()\n if (!reader) throw new Error('No reader available')\n await processSSEStream(reader, { onFieldStart, onContent, onKeywords, onFieldEnd, onComplete, onError })\n}\n\nexport const rewriteNewsApi = async ({\n article, language = 'English', articleId, tone, style, wordCount,\n includeQuotes, includeFAQ, targetAudience,\n}: {\n article: string\n language?: string\n articleId?: string\n tone?: string\n style?: string\n wordCount?: string\n includeQuotes?: boolean\n includeFAQ?: boolean\n targetAudience?: string\n}) => {\n const payload: Record<string, string | number | boolean | string[]> = { article, language, temperature: 1 }\n if (articleId) payload.articleId = articleId\n if (tone) payload.tone = tone\n if (style) payload.style = style\n if (wordCount) payload.wordCount = wordCount\n if (includeQuotes !== undefined) payload.includeQuotes = includeQuotes\n if (includeFAQ !== undefined) payload.includeFAQ = includeFAQ\n if (targetAudience) payload.targetAudience = targetAudience\n const { data } = await api.post('/contenify/rewrite', payload)\n return data.data\n}\n"],"mappings":"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","names":["import_react","import_react","import_lucide_react","import_react","import_lucide_react","import_react","import_react","StarterKit","Placeholder","editor","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","axios","import_jsx_runtime","seoScoreColor","seoGradeColor","_a","_b","_c","import_react","import_lucide_react","import_jsx_runtime","import_react","import_jsx_runtime","toast","import_react","import_lucide_react","import_jsx_runtime","items","e","getHeaders","getHeaders","import_react_hot_toast","import_lucide_react","import_jsx_runtime","toast","import_jsx_runtime"]}
|