From a8772e8b4c8f7b2df39c9babfad1a7f93f2fa0d9 Mon Sep 17 00:00:00 2001 From: Test Date: Tue, 31 Mar 2026 17:34:35 +0100 Subject: [PATCH] Fix profile dashboard build encoding --- app/actions/user.ts | 3 ++- app/profile/page.tsx | 7 ++++-- components/PromptShell.tsx | 41 +++++++++++++++++----------------- components/UsageMetricCard.tsx | 3 ++- lib/profile-usage.ts | 3 ++- lib/usage-events.ts | 3 ++- lib/web-search-usage.ts | 3 ++- 7 files changed, 36 insertions(+), 27 deletions(-) diff --git a/app/actions/user.ts b/app/actions/user.ts index f89498e..2306761 100644 --- a/app/actions/user.ts +++ b/app/actions/user.ts @@ -1,4 +1,4 @@ -'use server' +'use server' import { getUserProfileServer, checkAndResetUsageServer } from '@/lib/usage-tracking-server' import { buildProfileUsageSummary } from '@/lib/profile-usage' @@ -209,3 +209,4 @@ export async function fetchHistoryPageData(userId: string, page: number = 1, pag return { sessions: [], hasMore: false } } } + diff --git a/app/profile/page.tsx b/app/profile/page.tsx index 5a249f2..f8c2cc2 100644 --- a/app/profile/page.tsx +++ b/app/profile/page.tsx @@ -1,4 +1,4 @@ -'use client' +'use client' import { useCallback, useEffect, useState } from 'react' import Link from 'next/link' @@ -378,7 +378,7 @@ export default function ProfilePage() { recentSessions.map((session) => (

{session.title || 'Untitled session'}

-

{session.tool || 'Universal'} � {new Date(session.created_at).toLocaleDateString()}

+

{session.tool || 'Universal'} · {new Date(session.created_at).toLocaleDateString()}

)) ) : ( @@ -390,3 +390,6 @@ export default function ProfilePage() { ) } + + + diff --git a/components/PromptShell.tsx b/components/PromptShell.tsx index 18b532c..dcfe88a 100644 --- a/components/PromptShell.tsx +++ b/components/PromptShell.tsx @@ -1,4 +1,4 @@ -"use client" +"use client" import React, { ChangeEvent, useCallback, useEffect, useRef, useState, useTransition } from 'react' import Image from 'next/image' @@ -573,7 +573,7 @@ export default function PromptShell({ // Check if this request is still valid (hasn't been stopped or superseded) if (currentRequestId !== requestIdRef.current) { - console.log('🛑 Request cancelled/superseded, ignoring response') + console.log('🛑 Request cancelled/superseded, ignoring response') return } @@ -720,7 +720,7 @@ export default function PromptShell({ prompt: messageToSend, attachments: [...pendingAttachments] } - console.log('🔴 SAVING to localStorage:', messageData) + console.log('🔴 SAVING to localStorage:', messageData) localStorage.setItem('tera_queued_message', JSON.stringify(messageData)) } setAttachmentMessage('Sign in to send your message. It will be posted automatically once you authenticate.') @@ -732,7 +732,7 @@ export default function PromptShell({ prompt: messageToSend, attachments: [...pendingAttachments] }) - setAttachmentMessage('Hang tight—finalizing your account before sending.') + setAttachmentMessage('Hang tight—finalizing your account before sending.') return } @@ -746,37 +746,37 @@ export default function PromptShell({ useEffect(() => { // Always check for persisted message on mount - console.log('🟢 MOUNT EFFECT: Checking localStorage...') + console.log('🟢 MOUNT EFFECT: Checking localStorage...') if (typeof window !== 'undefined' && !queuedMessage) { const savedMessage = localStorage.getItem('tera_queued_message') - console.log('🟢 localStorage value:', savedMessage) + console.log('🟢 localStorage value:', savedMessage) if (savedMessage) { try { - console.log('🟢 Found queued message, parsing...') + console.log('🟢 Found queued message, parsing...') const parsed = JSON.parse(savedMessage) - console.log('🟢 Parsed message:', parsed) + console.log('🟢 Parsed message:', parsed) setQueuedMessage(parsed) - console.log('🟢 Set queuedMessage state') + console.log('🟢 Set queuedMessage state') } catch (e) { - console.error('🔴 Failed to parse queued message', e) + console.error('🔴 Failed to parse queued message', e) localStorage.removeItem('tera_queued_message') } } else { - console.log('🟢 No saved message found in localStorage') + console.log('🟢 No saved message found in localStorage') } } else { - console.log('🟢 Skipping restore (window undefined or queuedMessage already set)') + console.log('🟢 Skipping restore (window undefined or queuedMessage already set)') } }, []) // Run once on mount useEffect(() => { - console.log('🔵 PROCESS EFFECT: userReady=', userReady, 'queuedMessage=', queuedMessage) + console.log('🔵 PROCESS EFFECT: userReady=', userReady, 'queuedMessage=', queuedMessage) if (userReady && queuedMessage) { - console.log('🔵 Processing queued message:', queuedMessage) + console.log('🔵 Processing queued message:', queuedMessage) processMessage(queuedMessage.prompt, queuedMessage.attachments) // Clean up - console.log('🔵 Cleaning up localStorage and queuedMessage state') + console.log('🔵 Cleaning up localStorage and queuedMessage state') localStorage.removeItem('tera_queued_message') setQueuedMessage(null) } @@ -873,7 +873,7 @@ export default function PromptShell({ if (data.plan) { setCurrentUserPlan(data.plan) } - console.log(`🔍 Web Search Status: ${data.remaining}/${data.total} (${data.plan?.toUpperCase()})`) + console.log(`🔍 Web Search Status: ${data.remaining}/${data.total} (${data.plan?.toUpperCase()})`) } } catch (err) { console.warn('Failed to fetch web search status:', err) @@ -992,7 +992,7 @@ export default function PromptShell({
{entry.userMessage.attachments.map((att, idx) => (
- {att.type === 'image' ? '🖼️' : '📄'} + {att.type === 'image' ? '🖼️' : '📄'} {att.name}
))} @@ -1002,7 +1002,7 @@ export default function PromptShell({ {/* Timestamp and checkmarks */}
{formatTimestamp(entry.userMessage.timestamp)} - ✓✓ + ✓✓
@@ -1179,7 +1179,7 @@ export default function PromptShell({ className="absolute right-2 top-2 flex h-7 w-7 items-center justify-center rounded-full border border-white/10 bg-black/70 text-white opacity-0 transition-all group-hover:opacity-100 hover:bg-red-500" title="Remove" > - × + × ))} @@ -1367,7 +1367,7 @@ export default function PromptShell({ onClick={() => setSearchHistoryOpen(false)} className="absolute -top-10 right-0 text-white/80 hover:text-white" > - Close × + Close × ) } + diff --git a/lib/profile-usage.ts b/lib/profile-usage.ts index 71c8118..d01dbf0 100644 --- a/lib/profile-usage.ts +++ b/lib/profile-usage.ts @@ -1,4 +1,4 @@ -import { getPlanConfig, type PlanType } from './plan-config' +import { getPlanConfig, type PlanType } from './plan-config' export type UsageLimit = number | 'unlimited' @@ -79,3 +79,4 @@ export function buildProfileUsageSummary(source: ProfileUsageSource): ProfileUsa ), } } + diff --git a/lib/usage-events.ts b/lib/usage-events.ts index eff71e6..477e3bd 100644 --- a/lib/usage-events.ts +++ b/lib/usage-events.ts @@ -1,7 +1,8 @@ -export const TERA_USAGE_REFRESH_EVENT = 'tera:usage-refresh' +export const TERA_USAGE_REFRESH_EVENT = 'tera:usage-refresh' export function dispatchUsageRefresh(reason: 'messages' | 'uploads' | 'web-search' | 'profile') { if (typeof window === 'undefined') return window.dispatchEvent(new CustomEvent(TERA_USAGE_REFRESH_EVENT, { detail: { reason, at: Date.now() } })) } + diff --git a/lib/web-search-usage.ts b/lib/web-search-usage.ts index 8c8101e..8bdfcb0 100644 --- a/lib/web-search-usage.ts +++ b/lib/web-search-usage.ts @@ -1,4 +1,4 @@ -/** +/** * Web Search Usage Tracking * Tracks and limits web searches based on subscription plan: * - Free: 5/month @@ -218,3 +218,4 @@ export function getWebSearchLimitMessage(remaining: number, total: number): stri export const WEB_SEARCH_LIMITS = MONTHLY_WEB_SEARCH_LIMITS export const getDefaultLimit = (plan: PlanType = 'free') => MONTHLY_WEB_SEARCH_LIMITS[plan] +