Merge remote-tracking branch 'origin/main' into cloudflare
This commit is contained in:
commit
b55613b471
@ -15,7 +15,7 @@ import { websiteConfig } from '@/config/website';
|
|||||||
import { useCredits } from '@/hooks/use-credits';
|
import { useCredits } from '@/hooks/use-credits';
|
||||||
import { useMounted } from '@/hooks/use-mounted';
|
import { useMounted } from '@/hooks/use-mounted';
|
||||||
import { usePayment } from '@/hooks/use-payment';
|
import { usePayment } from '@/hooks/use-payment';
|
||||||
import { LocaleLink, useLocaleRouter } from '@/i18n/navigation';
|
import { useLocaleRouter } from '@/i18n/navigation';
|
||||||
import { formatDate } from '@/lib/formatter';
|
import { formatDate } from '@/lib/formatter';
|
||||||
import { cn } from '@/lib/utils';
|
import { cn } from '@/lib/utils';
|
||||||
import { Routes } from '@/routes';
|
import { Routes } from '@/routes';
|
||||||
@ -104,7 +104,7 @@ export default function CreditsBalanceCard() {
|
|||||||
// Clean up URL parameters
|
// Clean up URL parameters
|
||||||
const url = new URL(window.location.href);
|
const url = new URL(window.location.href);
|
||||||
url.searchParams.delete('credits_session_id');
|
url.searchParams.delete('credits_session_id');
|
||||||
localeRouter.replace(Routes.SettingsBilling + url.search);
|
localeRouter.replace(Routes.SettingsCredits + url.search);
|
||||||
}
|
}
|
||||||
}, [searchParams, localeRouter, fetchCredits, fetchCreditStats, t]);
|
}, [searchParams, localeRouter, fetchCredits, fetchCreditStats, t]);
|
||||||
|
|
||||||
@ -135,9 +135,7 @@ export default function CreditsBalanceCard() {
|
|||||||
<Skeleton className="h-6 w-3/5" />
|
<Skeleton className="h-6 w-3/5" />
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
<CardFooter className="mt-2 px-6 py-4 flex justify-end items-center bg-background rounded-none">
|
<CardFooter className="">{/* show nothing */}</CardFooter>
|
||||||
<Skeleton className="h-10 w-1/2" />
|
|
||||||
</CardFooter>
|
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -227,12 +225,12 @@ export default function CreditsBalanceCard() {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
</CardContent>
|
</CardContent>
|
||||||
<CardFooter className="mt-2 px-6 py-4 flex justify-end items-center bg-background rounded-none">
|
<CardFooter className="">
|
||||||
<Button variant="default" className="cursor-pointer" asChild>
|
{/* <Button variant="default" className="cursor-pointer" asChild>
|
||||||
<LocaleLink href={Routes.SettingsCredits}>
|
<LocaleLink href={Routes.SettingsCredits}>
|
||||||
{t('viewTransactions')}
|
{t('viewTransactions')}
|
||||||
</LocaleLink>
|
</LocaleLink>
|
||||||
</Button>
|
</Button> */}
|
||||||
</CardFooter>
|
</CardFooter>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
@ -22,7 +22,7 @@ export default function CreditsPageClient() {
|
|||||||
</TabsTrigger>
|
</TabsTrigger>
|
||||||
</TabsList>
|
</TabsList>
|
||||||
|
|
||||||
<TabsContent value="balance" className="mt-2 flex flex-col gap-4">
|
<TabsContent value="balance" className="mt-4 flex flex-col gap-8">
|
||||||
{/* Credits Balance Card */}
|
{/* Credits Balance Card */}
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
|
||||||
<CreditsBalanceCard />
|
<CreditsBalanceCard />
|
||||||
@ -34,7 +34,7 @@ export default function CreditsPageClient() {
|
|||||||
</div>
|
</div>
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
|
||||||
<TabsContent value="transactions" className="mt-2">
|
<TabsContent value="transactions" className="mt-4">
|
||||||
{/* Credit Transactions */}
|
{/* Credit Transactions */}
|
||||||
<CreditTransactions />
|
<CreditTransactions />
|
||||||
</TabsContent>
|
</TabsContent>
|
||||||
|
@ -13,13 +13,23 @@ import { CREDIT_TRANSACTION_TYPE } from './types';
|
|||||||
* @returns User's current credit balance
|
* @returns User's current credit balance
|
||||||
*/
|
*/
|
||||||
export async function getUserCredits(userId: string): Promise<number> {
|
export async function getUserCredits(userId: string): Promise<number> {
|
||||||
const db = await getDb();
|
try {
|
||||||
const record = await db
|
const db = await getDb();
|
||||||
.select()
|
|
||||||
.from(userCredit)
|
// Optimized query: only select the needed field
|
||||||
.where(eq(userCredit.userId, userId))
|
// This can benefit from covering index if we add one later
|
||||||
.limit(1);
|
const record = await db
|
||||||
return record[0]?.currentCredits || 0;
|
.select({ currentCredits: userCredit.currentCredits })
|
||||||
|
.from(userCredit)
|
||||||
|
.where(eq(userCredit.userId, userId))
|
||||||
|
.limit(1);
|
||||||
|
|
||||||
|
return record[0]?.currentCredits || 0;
|
||||||
|
} catch (error) {
|
||||||
|
console.error('getUserCredits, error:', error);
|
||||||
|
// Return 0 on error to prevent UI from breaking
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,11 +38,15 @@ export async function getUserCredits(userId: string): Promise<number> {
|
|||||||
* @param credits - New credit balance
|
* @param credits - New credit balance
|
||||||
*/
|
*/
|
||||||
export async function updateUserCredits(userId: string, credits: number) {
|
export async function updateUserCredits(userId: string, credits: number) {
|
||||||
const db = await getDb();
|
try {
|
||||||
await db
|
const db = await getDb();
|
||||||
.update(userCredit)
|
await db
|
||||||
.set({ currentCredits: credits, updatedAt: new Date() })
|
.update(userCredit)
|
||||||
.where(eq(userCredit.userId, userId));
|
.set({ currentCredits: credits, updatedAt: new Date() })
|
||||||
|
.where(eq(userCredit.userId, userId));
|
||||||
|
} catch (error) {
|
||||||
|
console.error('updateUserCredits, error:', error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,11 +55,15 @@ export async function updateUserCredits(userId: string, credits: number) {
|
|||||||
* @param date - Last refresh time
|
* @param date - Last refresh time
|
||||||
*/
|
*/
|
||||||
export async function updateUserLastRefreshAt(userId: string, date: Date) {
|
export async function updateUserLastRefreshAt(userId: string, date: Date) {
|
||||||
const db = await getDb();
|
try {
|
||||||
await db
|
const db = await getDb();
|
||||||
.update(userCredit)
|
await db
|
||||||
.set({ lastRefreshAt: date, updatedAt: new Date() })
|
.update(userCredit)
|
||||||
.where(eq(userCredit.userId, userId));
|
.set({ lastRefreshAt: date, updatedAt: new Date() })
|
||||||
|
.where(eq(userCredit.userId, userId));
|
||||||
|
} catch (error) {
|
||||||
|
console.error('updateUserLastRefreshAt, error:', error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user