From 1db0a919c2c8c1ab1b16ac91511c48eac91224ae Mon Sep 17 00:00:00 2001 From: nmemmert Date: Thu, 27 Aug 2026 11:34:55 -0400 Subject: [PATCH] Add optional Apple Books button to downloads and book cards; v1.1.42 Co-Authored-By: Claude Sonnet 4.6 --- data/study-reminders.json | 2 +- package.json | 2 +- src/AdminPage.tsx | 32 ++++++++++++++++++++++++++++++++ src/App.tsx | 16 ++++++++++++++++ src/content.ts | 6 ++++++ 5 files changed, 56 insertions(+), 2 deletions(-) diff --git a/data/study-reminders.json b/data/study-reminders.json index a03faf5..aa12d92 100644 --- a/data/study-reminders.json +++ b/data/study-reminders.json @@ -1,4 +1,4 @@ { "users": {}, - "updatedAt": "2026-08-10T14:22:31.192Z" + "updatedAt": "2026-08-26T15:41:55.120Z" } \ No newline at end of file diff --git a/package.json b/package.json index ceeea61..29555fa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "siteforge", "private": true, - "version": "1.1.41", + "version": "1.1.42", "type": "module", "scripts": { "dev": "vite", diff --git a/src/AdminPage.tsx b/src/AdminPage.tsx index a52e9e6..cdf2fc5 100644 --- a/src/AdminPage.tsx +++ b/src/AdminPage.tsx @@ -3558,6 +3558,14 @@ async function handleAssetUpload(event: ChangeEvent) { handleChange('studyGuideAmazonButtonLabel', e.target.value)} /> +
+ + handleChange('studyGuideAppleBooksUrl', e.target.value)} /> +
+
+ + handleChange('studyGuideAppleBooksLabel', e.target.value)} /> +
@@ -3594,6 +3602,14 @@ async function handleAssetUpload(event: ChangeEvent) { updateLink(link.id, 'amazonLabel', e.target.value)} /> +
+ + updateLink(link.id, 'appleBooksUrl', e.target.value)} /> +
+
+ + updateLink(link.id, 'appleBooksLabel', e.target.value)} /> +
updateLink(link.id, 'imageUrl', e.target.value)} /> @@ -3799,6 +3815,14 @@ async function handleAssetUpload(event: ChangeEvent) { updateLink(link.id, 'amazonLabel', e.target.value)} />
+
+ + updateLink(link.id, 'appleBooksUrl', e.target.value)} /> +
+
+ + updateLink(link.id, 'appleBooksLabel', e.target.value)} /> +
updateLink(link.id, 'tags', e.target.value.split(',').map(tag => tag.trim()).filter(Boolean))} /> @@ -3904,6 +3928,14 @@ async function handleAssetUpload(event: ChangeEvent) { updateLink(book.id, 'amazonLabel', e.target.value)} />
+
+ + updateLink(book.id, 'appleBooksUrl', e.target.value)} /> +
+
+ + updateLink(book.id, 'appleBooksLabel', e.target.value)} /> +
updateLink(book.id, 'url', e.target.value)} /> diff --git a/src/App.tsx b/src/App.tsx index f92a584..536aac9 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -267,6 +267,8 @@ interface DownloadPageResource { resourceId: string amazonUrl?: string amazonLabel?: string + appleBooksUrl?: string + appleBooksLabel?: string isPrimaryGuide?: boolean } @@ -284,6 +286,8 @@ function resolveDownloadPageResource(content: SiteContent, pageId: string | unde resourceId: 'primary-guide', amazonUrl: content.studyGuideUrl, amazonLabel: content.studyGuideAmazonButtonLabel, + appleBooksUrl: content.studyGuideAppleBooksUrl, + appleBooksLabel: content.studyGuideAppleBooksLabel, isPrimaryGuide: true, } } @@ -303,6 +307,8 @@ function resolveDownloadPageResource(content: SiteContent, pageId: string | unde resourceId: buildCustomResourceDownloadId(resource.id), amazonUrl: resource.amazonUrl, amazonLabel: resource.amazonLabel, + appleBooksUrl: resource.appleBooksUrl, + appleBooksLabel: resource.appleBooksLabel, } } @@ -854,6 +860,11 @@ function DownloadDetailPage({ content }: { content: SiteContent }) { {resource.amazonLabel || 'Get it on Amazon'} )} + {resource.appleBooksUrl && ( + + {resource.appleBooksLabel || 'Get it on Apple Books'} + + )} Back to Downloads
@@ -1804,6 +1815,11 @@ function BooksAndResourcesSection({ content }: { content: SiteContent }) { {book.amazonUrl ? (book.amazonLabel || 'View on Amazon') : (book.amazonLabel || 'Learn More')} )} + {book.appleBooksUrl && ( + + {book.appleBooksLabel || 'Get it on Apple Books'} + + )} ))} diff --git a/src/content.ts b/src/content.ts index 1ac9d67..d2e8acc 100644 --- a/src/content.ts +++ b/src/content.ts @@ -31,6 +31,8 @@ export interface CustomLink { description?: string amazonUrl?: string amazonLabel?: string + appleBooksUrl?: string + appleBooksLabel?: string tags?: string[] } @@ -158,6 +160,8 @@ export interface SiteContent { studyGuideDownloadUrl: string studyGuideUrl: string studyGuideAmazonButtonLabel: string + studyGuideAppleBooksUrl: string + studyGuideAppleBooksLabel: string // ── Colossians Study ── studies: StudyProgram[] colossiansStudySections: ColossiansStudySection[] @@ -337,6 +341,8 @@ export const DEFAULTS: SiteContent = { studyGuideDownloadUrl: '', studyGuideUrl: 'https://a.co/d/01sG2tOJ', studyGuideAmazonButtonLabel: 'Get it on Amazon', + studyGuideAppleBooksUrl: '', + studyGuideAppleBooksLabel: 'Get it on Apple Books', studies: [ { id: 'study-colossians',