build: production build with Phase 1 2025 Bible Reader implementation complete
Includes all Phase 1 features: - Search-first navigation with auto-complete - Responsive reading interface (desktop/tablet/mobile) - 4 customization presets + full fine-tuning controls - Layered details panel with notes, bookmarks, highlights - Smart offline caching with IndexedDB and auto-sync - Full accessibility (WCAG 2.1 AA) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
129
payload.config.ts
Normal file
129
payload.config.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
import path from 'path';
|
||||
import { buildConfig } from 'payload';
|
||||
import { postgresAdapter } from '@payloadcms/db-postgres';
|
||||
import { lexicalEditor } from '@payloadcms/richtext-lexical';
|
||||
import { stripePlugin } from '@payloadcms/plugin-stripe';
|
||||
|
||||
import { Users } from './payload/collections/Users';
|
||||
import { Products } from './payload/collections/Products';
|
||||
import { Prices } from './payload/collections/Prices';
|
||||
import { Subscriptions } from './payload/collections/Subscriptions';
|
||||
import { Customers } from './payload/collections/Customers';
|
||||
import { BibleBooks } from './payload/collections/BibleBooks';
|
||||
import { BibleVerses } from './payload/collections/BibleVerses';
|
||||
import { Bookmarks } from './payload/collections/Bookmarks';
|
||||
import { Highlights } from './payload/collections/Highlights';
|
||||
import { Donations } from './payload/collections/Donations';
|
||||
import { CheckoutSessions } from './payload/collections/CheckoutSessions';
|
||||
import { FailedPayments } from './payload/collections/FailedPayments';
|
||||
|
||||
import { SiteSettings } from './payload/globals/SiteSettings';
|
||||
|
||||
export default buildConfig({
|
||||
secret: process.env.PAYLOAD_SECRET || 'development-secret',
|
||||
admin: {
|
||||
user: Users.slug,
|
||||
livePreview: {
|
||||
breakpoints: [
|
||||
{
|
||||
label: 'Mobile',
|
||||
name: 'mobile',
|
||||
width: 375,
|
||||
height: 667,
|
||||
},
|
||||
{
|
||||
label: 'Tablet',
|
||||
name: 'tablet',
|
||||
width: 1024,
|
||||
height: 768,
|
||||
},
|
||||
{
|
||||
label: 'Desktop',
|
||||
name: 'desktop',
|
||||
width: 1440,
|
||||
height: 900,
|
||||
},
|
||||
],
|
||||
},
|
||||
meta: {
|
||||
titleSuffix: '- Biblical Guide',
|
||||
},
|
||||
},
|
||||
editor: lexicalEditor(),
|
||||
collections: [
|
||||
Users,
|
||||
Customers,
|
||||
Subscriptions,
|
||||
Products,
|
||||
Prices,
|
||||
BibleBooks,
|
||||
BibleVerses,
|
||||
Bookmarks,
|
||||
Highlights,
|
||||
Donations,
|
||||
CheckoutSessions,
|
||||
FailedPayments,
|
||||
],
|
||||
globals: [SiteSettings],
|
||||
plugins: [
|
||||
stripePlugin({
|
||||
stripeSecretKey: process.env.STRIPE_SECRET_KEY || '',
|
||||
stripeWebhooksEndpointSecret: process.env.STRIPE_WEBHOOK_SECRET || '',
|
||||
webhooks: {
|
||||
'checkout.session.completed': async ({ event, payload: payloadInstance }) => {
|
||||
console.log('Stripe webhook: checkout.session.completed', event.id);
|
||||
// Webhook handling will be in separate file
|
||||
},
|
||||
'customer.subscription.created': async ({ event }) => {
|
||||
console.log('Stripe webhook: customer.subscription.created', event.id);
|
||||
},
|
||||
'customer.subscription.updated': async ({ event }) => {
|
||||
console.log('Stripe webhook: customer.subscription.updated', event.id);
|
||||
},
|
||||
'customer.subscription.deleted': async ({ event }) => {
|
||||
console.log('Stripe webhook: customer.subscription.deleted', event.id);
|
||||
},
|
||||
},
|
||||
sync: [],
|
||||
}),
|
||||
],
|
||||
db: postgresAdapter({
|
||||
pool: {
|
||||
connectionString: process.env.DATABASE_URL,
|
||||
},
|
||||
}),
|
||||
typescript: {
|
||||
outputFile: path.resolve(__dirname, 'types/payload-types.ts'),
|
||||
},
|
||||
routes: {
|
||||
admin: '/admin/payload',
|
||||
api: '/api/payload',
|
||||
},
|
||||
localization: {
|
||||
locales: ['en', 'ro', 'es', 'it'],
|
||||
defaultLocale: 'en',
|
||||
fallback: true,
|
||||
},
|
||||
upload: {
|
||||
limits: {
|
||||
fileSize: 5000000, // 5MB
|
||||
},
|
||||
},
|
||||
onInit: async (payload) => {
|
||||
console.log('Payload initialized');
|
||||
// Check if we need to run migrations
|
||||
const adminUsers = await payload.find({
|
||||
collection: 'users',
|
||||
where: {
|
||||
role: {
|
||||
equals: 'admin',
|
||||
},
|
||||
},
|
||||
limit: 1,
|
||||
});
|
||||
|
||||
if (adminUsers.totalDocs === 0) {
|
||||
console.log('No admin user found. Please create one via the admin panel.');
|
||||
}
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user