create-nextblock 0.16.1 → 0.16.3
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/docker-template/.dockerignore +1 -1
- package/libs/db/tsconfig.lib.json +3 -3
- package/libs/editor/tsconfig.lib.json +3 -3
- package/libs/ui/tsconfig.lib.json +3 -3
- package/libs/utils/tsconfig.json +3 -3
- package/package.json +50 -50
- package/project.json +19 -19
- package/templates/nextblock-template/.dockerignore +1 -1
- package/templates/nextblock-template/.swcrc +30 -30
- package/templates/nextblock-template/AGENTS.md +9 -9
- package/templates/nextblock-template/CLAUDE.md +1 -1
- package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
- package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -16
- package/templates/nextblock-template/app/ToasterProvider.tsx +26 -26
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
- package/templates/nextblock-template/app/actions/contactSellerActions.test.ts +280 -280
- package/templates/nextblock-template/app/actions/contactSellerActions.ts +222 -222
- package/templates/nextblock-template/app/actions/email-retry.test.ts +62 -62
- package/templates/nextblock-template/app/actions/email.ts +241 -241
- package/templates/nextblock-template/app/actions/formActions.ts +245 -245
- package/templates/nextblock-template/app/actions/interactions.ts +489 -489
- package/templates/nextblock-template/app/actions/threadActions.ts +166 -166
- package/templates/nextblock-template/app/actions/visibilityActions.ts +210 -210
- package/templates/nextblock-template/app/api/ai/seo/alt-text/route.ts +221 -221
- package/templates/nextblock-template/app/api/ai/seo/metadata/route.ts +186 -186
- package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -29
- package/templates/nextblock-template/app/api/checkout/route.ts +162 -162
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +4 -4
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +4542 -2904
- package/templates/nextblock-template/app/api/mcp/route.ts +415 -415
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
- package/templates/nextblock-template/app/api/search/route.ts +43 -43
- package/templates/nextblock-template/app/api/view/route.ts +114 -114
- package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -47
- package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -47
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
- package/templates/nextblock-template/app/cart/page.tsx +7 -7
- package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -20
- package/templates/nextblock-template/app/checkout/page.tsx +57 -57
- package/templates/nextblock-template/app/cms/CmsClientLayout.tsx +558 -558
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +241 -241
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
- package/templates/nextblock-template/app/cms/blocks/editors/FormBlockEditor.tsx +304 -304
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +406 -406
- package/templates/nextblock-template/app/cms/components/ContactReminderBanner.tsx +75 -75
- package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -23
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
- package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +254 -254
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
- package/templates/nextblock-template/app/cms/components/PaymentsReminderBanner.tsx +58 -58
- package/templates/nextblock-template/app/cms/components/SeoScoreBadge.tsx +40 -0
- package/templates/nextblock-template/app/cms/components/TablePagination.tsx +136 -0
- package/templates/nextblock-template/app/cms/components/VisibilityBadge.tsx +62 -62
- package/templates/nextblock-template/app/cms/components/VisibilityControl.tsx +542 -542
- package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -16
- package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -16
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -200
- package/templates/nextblock-template/app/cms/inquiries/actions.ts +66 -66
- package/templates/nextblock-template/app/cms/inquiries/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/interactions/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/layout.tsx +101 -101
- package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
- package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
- package/templates/nextblock-template/app/cms/messages/MessagesClient.tsx +661 -661
- package/templates/nextblock-template/app/cms/messages/actions.ts +404 -404
- package/templates/nextblock-template/app/cms/messages/loadInbox.ts +333 -333
- package/templates/nextblock-template/app/cms/messages/page.tsx +87 -87
- package/templates/nextblock-template/app/cms/messages/require-admin.ts +37 -37
- package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
- package/templates/nextblock-template/app/cms/pages/components/PageForm.tsx +649 -649
- package/templates/nextblock-template/app/cms/pages/page.tsx +273 -227
- package/templates/nextblock-template/app/cms/posts/[id]/edit/page.tsx +2 -0
- package/templates/nextblock-template/app/cms/posts/components/PostForm.tsx +624 -618
- package/templates/nextblock-template/app/cms/posts/page.tsx +251 -194
- package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +370 -370
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
- package/templates/nextblock-template/app/cms/revisions/actions.ts +332 -332
- package/templates/nextblock-template/app/cms/revisions/service.test.ts +498 -498
- package/templates/nextblock-template/app/cms/revisions/service.ts +569 -569
- package/templates/nextblock-template/app/cms/revisions/utils.ts +304 -304
- package/templates/nextblock-template/app/cms/settings/cortex-ai/CortexAiSettingsClient.tsx +948 -948
- package/templates/nextblock-template/app/cms/settings/cortex-ai/McpServerSettingsCard.tsx +628 -628
- package/templates/nextblock-template/app/cms/settings/cortex-ai/mcp-actions.ts +230 -230
- package/templates/nextblock-template/app/cms/settings/cortex-ai/require-admin.ts +34 -34
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
- package/templates/nextblock-template/app/cms/settings/email/components/EmailForm.tsx +227 -227
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
- package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +276 -276
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
- package/templates/nextblock-template/app/cms/settings/global-css/components/ThemeEditor.tsx +382 -382
- package/templates/nextblock-template/app/cms/settings/global-css/components/ThemeManager.tsx +267 -267
- package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +40 -40
- package/templates/nextblock-template/app/cms/settings/global-css/theme-actions.ts +259 -259
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/seo/RedirectsCard.tsx +514 -514
- package/templates/nextblock-template/app/cms/settings/seo/RobotsCard.tsx +529 -529
- package/templates/nextblock-template/app/cms/settings/seo/SeoSettingsClient.tsx +57 -57
- package/templates/nextblock-template/app/cms/settings/seo/actions.ts +448 -448
- package/templates/nextblock-template/app/cms/settings/seo/mappers.ts +93 -93
- package/templates/nextblock-template/app/cms/settings/seo/page.tsx +46 -46
- package/templates/nextblock-template/app/cms/settings/seo/require-admin.ts +47 -47
- package/templates/nextblock-template/app/cms/settings/site-scripts/page.tsx +51 -51
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/layout.tsx +671 -671
- package/templates/nextblock-template/app/lib/seo.ts +319 -319
- package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -190
- package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -56
- package/templates/nextblock-template/app/product/[slug]/page.tsx +502 -502
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
- package/templates/nextblock-template/app/profile/account-links.ts +22 -22
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
- package/templates/nextblock-template/app/providers.tsx +96 -96
- package/templates/nextblock-template/app/robots.ts +123 -123
- package/templates/nextblock-template/app/thread/ThreadView.tsx +164 -164
- package/templates/nextblock-template/app/thread/[token]/route.ts +57 -57
- package/templates/nextblock-template/app/thread/layout.tsx +15 -15
- package/templates/nextblock-template/app/thread/page.tsx +98 -98
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -38
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -68
- package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -34
- package/templates/nextblock-template/components/BlockRenderer.tsx +312 -312
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
- package/templates/nextblock-template/components/CartTranslator.tsx +210 -210
- package/templates/nextblock-template/components/ContactSellerSection.tsx +188 -188
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
- package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -51
- package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -68
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
- package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
- package/templates/nextblock-template/components/GlobalSearch.tsx +557 -557
- package/templates/nextblock-template/components/Header.tsx +38 -38
- package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- package/templates/nextblock-template/components/PostCommentsSection.tsx +378 -378
- package/templates/nextblock-template/components/ProductReviewsSection.tsx +426 -426
- package/templates/nextblock-template/components/SiteScripts.tsx +56 -56
- package/templates/nextblock-template/components/StaffReplies.tsx +102 -102
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
- package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +48 -48
- package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +9 -9
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
- package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -25
- package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -92
- package/templates/nextblock-template/components/blocks/renderers/CartBlockRenderer.tsx +18 -18
- package/templates/nextblock-template/components/blocks/renderers/CheckoutBlockRenderer.tsx +20 -20
- package/templates/nextblock-template/components/blocks/renderers/FeaturedProductBlockRenderer.tsx +25 -25
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +385 -385
- package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +24 -24
- package/templates/nextblock-template/components/blocks/renderers/ProductDetailsBlockRenderer.tsx +157 -157
- package/templates/nextblock-template/components/blocks/renderers/ProductGridBlockRenderer.tsx +34 -34
- package/templates/nextblock-template/components/blocks/renderers/SectionBlockRenderer.tsx +612 -612
- package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -57
- package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +2 -2
- package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +2 -2
- package/templates/nextblock-template/components/blocks/types.ts +7 -7
- package/templates/nextblock-template/components/commerce/PaymentReadinessBoundary.tsx +32 -32
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -32
- package/templates/nextblock-template/components/seo/GenerateMetaButton.tsx +137 -137
- package/templates/nextblock-template/components/seo/PageSeoAuditSection.tsx +251 -244
- package/templates/nextblock-template/components/seo/SeoAuditPanel.tsx +749 -749
- package/templates/nextblock-template/components/seo/SeoIssueList.tsx +195 -195
- package/templates/nextblock-template/components/seo/SeoScoreDial.tsx +144 -144
- package/templates/nextblock-template/components/seo/SocialPreview.tsx +243 -243
- package/templates/nextblock-template/components/seo/SocialPreviewDialog.tsx +110 -110
- package/templates/nextblock-template/components/submit-button.tsx +23 -23
- package/templates/nextblock-template/components/theme-icon.tsx +78 -78
- package/templates/nextblock-template/components/theme-switcher.tsx +85 -85
- package/templates/nextblock-template/context/AuthContext.tsx +23 -23
- package/templates/nextblock-template/context/ThemeCatalogContext.tsx +44 -44
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +77 -77
- package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +372 -372
- package/templates/nextblock-template/docs/14-MESSAGES-INBOX.md +309 -309
- package/templates/nextblock-template/docs/README.md +42 -42
- package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12506 -12506
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
- package/templates/nextblock-template/index.d.ts +7 -7
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
- package/templates/nextblock-template/lib/blocks/blockColors.test.ts +134 -134
- package/templates/nextblock-template/lib/blocks/blockColors.ts +175 -175
- package/templates/nextblock-template/lib/blocks/blockRegistry.ts +761 -761
- package/templates/nextblock-template/lib/blocks/inlineScriptNonce.ts +20 -20
- package/templates/nextblock-template/lib/cms/contact-reminder.ts +64 -64
- package/templates/nextblock-template/lib/cms/payments-reminder.test.ts +135 -0
- package/templates/nextblock-template/lib/cms/payments-reminder.ts +30 -23
- package/templates/nextblock-template/lib/cms/unread-messages.ts +42 -42
- package/templates/nextblock-template/lib/commerce/seller-contact.ts +162 -162
- package/templates/nextblock-template/lib/config/email-settings.ts +323 -323
- package/templates/nextblock-template/lib/config/email-tls.test.ts +57 -57
- package/templates/nextblock-template/lib/cortex-ai/alt-text-request.ts +86 -86
- package/templates/nextblock-template/lib/cortex-ai/sandbox-headers.ts +60 -60
- package/templates/nextblock-template/lib/email/placeholder-address.test.ts +59 -59
- package/templates/nextblock-template/lib/email/placeholder-address.ts +39 -39
- package/templates/nextblock-template/lib/messages/thread-reference.test.ts +70 -70
- package/templates/nextblock-template/lib/messages/thread-token.test.ts +93 -93
- package/templates/nextblock-template/lib/messages/thread-token.ts +157 -157
- package/templates/nextblock-template/lib/messages/threads.ts +579 -579
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
- package/templates/nextblock-template/lib/publishing/viewUrl.ts +26 -26
- package/templates/nextblock-template/lib/search/types.ts +27 -27
- package/templates/nextblock-template/lib/seo/alt-text-write-back.test.ts +154 -154
- package/templates/nextblock-template/lib/seo/alt-text-write-back.ts +109 -109
- package/templates/nextblock-template/lib/seo/block-content.ts +123 -123
- package/templates/nextblock-template/lib/seo/fix-prompts.test.ts +242 -242
- package/templates/nextblock-template/lib/seo/fix-prompts.ts +204 -204
- package/templates/nextblock-template/lib/seo/page-audit-context.tsx +157 -140
- package/templates/nextblock-template/lib/seo/page-document.test.ts +384 -350
- package/templates/nextblock-template/lib/seo/page-document.ts +463 -412
- package/templates/nextblock-template/lib/seo/redirect-store.test.ts +479 -479
- package/templates/nextblock-template/lib/seo/redirect-store.ts +466 -466
- package/templates/nextblock-template/lib/seo/robots-settings-signature.test.ts +102 -102
- package/templates/nextblock-template/lib/seo/robots-settings-signature.ts +41 -41
- package/templates/nextblock-template/lib/seo/robots-txt.test.ts +370 -370
- package/templates/nextblock-template/lib/seo/robots-txt.ts +510 -510
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +37 -22
- package/templates/nextblock-template/lib/site-scripts/revisions.ts +71 -71
- package/templates/nextblock-template/lib/site-scripts/types.ts +46 -46
- package/templates/nextblock-template/lib/site-url.test.ts +89 -89
- package/templates/nextblock-template/lib/site-url.ts +102 -102
- package/templates/nextblock-template/lib/themes/buildThemeCss.ts +124 -124
- package/templates/nextblock-template/lib/themes/tokenColor.ts +31 -31
- package/templates/nextblock-template/lib/themes/tokens.ts +143 -143
- package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -105
- package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -42
- package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -143
- package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -94
- package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -81
- package/templates/nextblock-template/lib/zod-config.ts +5 -5
- package/templates/nextblock-template/next-env.d.ts +1 -2
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/postcss.config.js +6 -6
- package/templates/nextblock-template/scripts/backup.js +115 -115
- package/templates/nextblock-template/scripts/restore.js +385 -385
- package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -112
- package/templates/nextblock-template/tailwind.config.js +25 -25
- package/templates/nextblock-template/tools/build-migrate.mjs +102 -102
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
- package/templates/nextblock-template/tools/deploy-supabase.js +159 -159
- package/templates/nextblock-template/tools/lib/migrate-core.mjs +569 -569
- package/templates/nextblock-template/tools/update.mjs +1303 -1303
- package/tsconfig.base.json +3 -3
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import Link from 'next/link';
|
|
4
|
-
import { useState } from 'react';
|
|
5
|
-
import { Button } from '@nextblock-cms/ui';
|
|
6
|
-
import { MailWarning, X } from 'lucide-react';
|
|
7
|
-
import { useAuth } from '../../../context/AuthContext';
|
|
8
|
-
import type { ContactReminder } from '../../../lib/cms/contact-reminder';
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Shown when a contact form is addressed to a placeholder, or when nothing resolves to a
|
|
12
|
-
* deliverable address at all.
|
|
13
|
-
*
|
|
14
|
-
* Worth interrupting for, because this failure is completely silent: the visitor is
|
|
15
|
-
* thanked, the mail server accepts the message, and it goes to a reserved domain that can
|
|
16
|
-
* never receive it. The messages are safely stored either way — the problem is that
|
|
17
|
-
* nobody is being *told* they arrived.
|
|
18
|
-
*/
|
|
19
|
-
export default function ContactReminderBanner({ reminder }: { reminder: ContactReminder }) {
|
|
20
|
-
const { isAdmin } = useAuth();
|
|
21
|
-
const [dismissed, setDismissed] = useState(false);
|
|
22
|
-
|
|
23
|
-
if (!isAdmin || dismissed) return null;
|
|
24
|
-
|
|
25
|
-
const { placeholderForms, noFallback } = reminder;
|
|
26
|
-
const first = placeholderForms[0];
|
|
27
|
-
|
|
28
|
-
return (
|
|
29
|
-
<div className="mb-6 flex items-start gap-3 rounded-lg border border-amber-300 bg-amber-50 px-4 py-3 text-amber-900 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-200">
|
|
30
|
-
<MailWarning className="mt-0.5 h-5 w-5 shrink-0" />
|
|
31
|
-
<div className="min-w-0 flex-1">
|
|
32
|
-
<p className="text-sm font-medium">
|
|
33
|
-
{placeholderForms.length > 0
|
|
34
|
-
? 'Your contact form is still using the example address.'
|
|
35
|
-
: 'Nobody is being notified when someone contacts you.'}
|
|
36
|
-
</p>
|
|
37
|
-
<p className="text-xs opacity-90">
|
|
38
|
-
{placeholderForms.length > 0 ? (
|
|
39
|
-
<>
|
|
40
|
-
“{first?.label}” sends to <strong>{first?.recipient}</strong>, a
|
|
41
|
-
reserved address that can never receive mail
|
|
42
|
-
{placeholderForms.length > 1
|
|
43
|
-
? ` (and ${placeholderForms.length - 1} other form${
|
|
44
|
-
placeholderForms.length > 2 ? 's' : ''
|
|
45
|
-
} like it)`
|
|
46
|
-
: ''}
|
|
47
|
-
. {noFallback ? 'No fallback address is set either. ' : ''}
|
|
48
|
-
Messages are still saved under Messages — but no one is told they arrived.
|
|
49
|
-
</>
|
|
50
|
-
) : (
|
|
51
|
-
<>
|
|
52
|
-
No contact address is configured anywhere, so notifications have nowhere to
|
|
53
|
-
go. Messages are still saved under Messages — but no one is told they
|
|
54
|
-
arrived.
|
|
55
|
-
</>
|
|
56
|
-
)}
|
|
57
|
-
</p>
|
|
58
|
-
</div>
|
|
59
|
-
<div className="flex shrink-0 items-center gap-2">
|
|
60
|
-
<Button asChild size="sm" variant="outline" className="border-amber-400">
|
|
61
|
-
<Link href="/cms/messages">Set an address</Link>
|
|
62
|
-
</Button>
|
|
63
|
-
<Button
|
|
64
|
-
variant="ghost"
|
|
65
|
-
size="icon"
|
|
66
|
-
onClick={() => setDismissed(true)}
|
|
67
|
-
aria-label="Dismiss for now"
|
|
68
|
-
className="h-8 w-8"
|
|
69
|
-
>
|
|
70
|
-
<X className="h-4 w-4" />
|
|
71
|
-
</Button>
|
|
72
|
-
</div>
|
|
73
|
-
</div>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { Button } from '@nextblock-cms/ui';
|
|
6
|
+
import { MailWarning, X } from 'lucide-react';
|
|
7
|
+
import { useAuth } from '../../../context/AuthContext';
|
|
8
|
+
import type { ContactReminder } from '../../../lib/cms/contact-reminder';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Shown when a contact form is addressed to a placeholder, or when nothing resolves to a
|
|
12
|
+
* deliverable address at all.
|
|
13
|
+
*
|
|
14
|
+
* Worth interrupting for, because this failure is completely silent: the visitor is
|
|
15
|
+
* thanked, the mail server accepts the message, and it goes to a reserved domain that can
|
|
16
|
+
* never receive it. The messages are safely stored either way — the problem is that
|
|
17
|
+
* nobody is being *told* they arrived.
|
|
18
|
+
*/
|
|
19
|
+
export default function ContactReminderBanner({ reminder }: { reminder: ContactReminder }) {
|
|
20
|
+
const { isAdmin } = useAuth();
|
|
21
|
+
const [dismissed, setDismissed] = useState(false);
|
|
22
|
+
|
|
23
|
+
if (!isAdmin || dismissed) return null;
|
|
24
|
+
|
|
25
|
+
const { placeholderForms, noFallback } = reminder;
|
|
26
|
+
const first = placeholderForms[0];
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<div className="mb-6 flex items-start gap-3 rounded-lg border border-amber-300 bg-amber-50 px-4 py-3 text-amber-900 dark:border-amber-700/60 dark:bg-amber-900/20 dark:text-amber-200">
|
|
30
|
+
<MailWarning className="mt-0.5 h-5 w-5 shrink-0" />
|
|
31
|
+
<div className="min-w-0 flex-1">
|
|
32
|
+
<p className="text-sm font-medium">
|
|
33
|
+
{placeholderForms.length > 0
|
|
34
|
+
? 'Your contact form is still using the example address.'
|
|
35
|
+
: 'Nobody is being notified when someone contacts you.'}
|
|
36
|
+
</p>
|
|
37
|
+
<p className="text-xs opacity-90">
|
|
38
|
+
{placeholderForms.length > 0 ? (
|
|
39
|
+
<>
|
|
40
|
+
“{first?.label}” sends to <strong>{first?.recipient}</strong>, a
|
|
41
|
+
reserved address that can never receive mail
|
|
42
|
+
{placeholderForms.length > 1
|
|
43
|
+
? ` (and ${placeholderForms.length - 1} other form${
|
|
44
|
+
placeholderForms.length > 2 ? 's' : ''
|
|
45
|
+
} like it)`
|
|
46
|
+
: ''}
|
|
47
|
+
. {noFallback ? 'No fallback address is set either. ' : ''}
|
|
48
|
+
Messages are still saved under Messages — but no one is told they arrived.
|
|
49
|
+
</>
|
|
50
|
+
) : (
|
|
51
|
+
<>
|
|
52
|
+
No contact address is configured anywhere, so notifications have nowhere to
|
|
53
|
+
go. Messages are still saved under Messages — but no one is told they
|
|
54
|
+
arrived.
|
|
55
|
+
</>
|
|
56
|
+
)}
|
|
57
|
+
</p>
|
|
58
|
+
</div>
|
|
59
|
+
<div className="flex shrink-0 items-center gap-2">
|
|
60
|
+
<Button asChild size="sm" variant="outline" className="border-amber-400">
|
|
61
|
+
<Link href="/cms/messages">Set an address</Link>
|
|
62
|
+
</Button>
|
|
63
|
+
<Button
|
|
64
|
+
variant="ghost"
|
|
65
|
+
size="icon"
|
|
66
|
+
onClick={() => setDismissed(true)}
|
|
67
|
+
aria-label="Dismiss for now"
|
|
68
|
+
className="h-8 w-8"
|
|
69
|
+
>
|
|
70
|
+
<X className="h-4 w-4" />
|
|
71
|
+
</Button>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React, { createContext, useContext } from "react";
|
|
4
|
-
|
|
5
|
-
const CortexAiActiveContext = createContext<boolean>(false);
|
|
6
|
-
|
|
7
|
-
export function CortexAiActiveProvider({
|
|
8
|
-
children,
|
|
9
|
-
isActive,
|
|
10
|
-
}: {
|
|
11
|
-
children: React.ReactNode;
|
|
12
|
-
isActive: boolean;
|
|
13
|
-
}) {
|
|
14
|
-
return (
|
|
15
|
-
<CortexAiActiveContext.Provider value={isActive}>
|
|
16
|
-
{children}
|
|
17
|
-
</CortexAiActiveContext.Provider>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function useCortexAiActive() {
|
|
22
|
-
return useContext(CortexAiActiveContext);
|
|
23
|
-
}
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { createContext, useContext } from "react";
|
|
4
|
+
|
|
5
|
+
const CortexAiActiveContext = createContext<boolean>(false);
|
|
6
|
+
|
|
7
|
+
export function CortexAiActiveProvider({
|
|
8
|
+
children,
|
|
9
|
+
isActive,
|
|
10
|
+
}: {
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
isActive: boolean;
|
|
13
|
+
}) {
|
|
14
|
+
return (
|
|
15
|
+
<CortexAiActiveContext.Provider value={isActive}>
|
|
16
|
+
{children}
|
|
17
|
+
</CortexAiActiveContext.Provider>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function useCortexAiActive() {
|
|
22
|
+
return useContext(CortexAiActiveContext);
|
|
23
|
+
}
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
|
|
3
|
-
import React, { createContext, useContext, useEffect, useMemo, useState } from "react";
|
|
4
|
-
|
|
5
|
-
export type CortexAiContentType = "page" | "post" | "product";
|
|
6
|
-
|
|
7
|
-
export type CortexAiPageContext = {
|
|
8
|
-
contentType: CortexAiContentType;
|
|
9
|
-
currentEditor?: {
|
|
10
|
-
blockId?: number | string | null;
|
|
11
|
-
blockType?: string | null;
|
|
12
|
-
field?: string | null;
|
|
13
|
-
};
|
|
14
|
-
entityId: number | string;
|
|
15
|
-
languageId?: number | null;
|
|
16
|
-
slug?: string | null;
|
|
17
|
-
title?: string | null;
|
|
18
|
-
translationGroupId?: string | null;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
type CortexAiPageContextValue = {
|
|
22
|
-
pageContext: CortexAiPageContext | null;
|
|
23
|
-
setPageContext: (context: CortexAiPageContext | null) => void;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const CortexAiPageContextStore = createContext<CortexAiPageContextValue | null>(null);
|
|
27
|
-
|
|
28
|
-
export function CortexAiPageContextProvider({ children }: { children: React.ReactNode }) {
|
|
29
|
-
const [pageContext, setPageContext] = useState<CortexAiPageContext | null>(null);
|
|
30
|
-
const value = useMemo(() => ({ pageContext, setPageContext }), [pageContext]);
|
|
31
|
-
|
|
32
|
-
return (
|
|
33
|
-
<CortexAiPageContextStore.Provider value={value}>
|
|
34
|
-
{children}
|
|
35
|
-
</CortexAiPageContextStore.Provider>
|
|
36
|
-
);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function useCortexAiPageContext() {
|
|
40
|
-
return useContext(CortexAiPageContextStore);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function CortexAiPageContextRegistrar({
|
|
44
|
-
context,
|
|
45
|
-
}: {
|
|
46
|
-
context: CortexAiPageContext;
|
|
47
|
-
}) {
|
|
48
|
-
const store = useCortexAiPageContext();
|
|
49
|
-
const setPageContext = store?.setPageContext;
|
|
50
|
-
const serializedContext = JSON.stringify(context);
|
|
51
|
-
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
setPageContext?.(context);
|
|
54
|
-
return () => setPageContext?.(null);
|
|
55
|
-
}, [serializedContext, setPageContext]);
|
|
56
|
-
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import React, { createContext, useContext, useEffect, useMemo, useState } from "react";
|
|
4
|
+
|
|
5
|
+
export type CortexAiContentType = "page" | "post" | "product";
|
|
6
|
+
|
|
7
|
+
export type CortexAiPageContext = {
|
|
8
|
+
contentType: CortexAiContentType;
|
|
9
|
+
currentEditor?: {
|
|
10
|
+
blockId?: number | string | null;
|
|
11
|
+
blockType?: string | null;
|
|
12
|
+
field?: string | null;
|
|
13
|
+
};
|
|
14
|
+
entityId: number | string;
|
|
15
|
+
languageId?: number | null;
|
|
16
|
+
slug?: string | null;
|
|
17
|
+
title?: string | null;
|
|
18
|
+
translationGroupId?: string | null;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
type CortexAiPageContextValue = {
|
|
22
|
+
pageContext: CortexAiPageContext | null;
|
|
23
|
+
setPageContext: (context: CortexAiPageContext | null) => void;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const CortexAiPageContextStore = createContext<CortexAiPageContextValue | null>(null);
|
|
27
|
+
|
|
28
|
+
export function CortexAiPageContextProvider({ children }: { children: React.ReactNode }) {
|
|
29
|
+
const [pageContext, setPageContext] = useState<CortexAiPageContext | null>(null);
|
|
30
|
+
const value = useMemo(() => ({ pageContext, setPageContext }), [pageContext]);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<CortexAiPageContextStore.Provider value={value}>
|
|
34
|
+
{children}
|
|
35
|
+
</CortexAiPageContextStore.Provider>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function useCortexAiPageContext() {
|
|
40
|
+
return useContext(CortexAiPageContextStore);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function CortexAiPageContextRegistrar({
|
|
44
|
+
context,
|
|
45
|
+
}: {
|
|
46
|
+
context: CortexAiPageContext;
|
|
47
|
+
}) {
|
|
48
|
+
const store = useCortexAiPageContext();
|
|
49
|
+
const setPageContext = store?.setPageContext;
|
|
50
|
+
const serializedContext = JSON.stringify(context);
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
setPageContext?.(context);
|
|
54
|
+
return () => setPageContext?.(null);
|
|
55
|
+
}, [serializedContext, setPageContext]);
|
|
56
|
+
|
|
57
|
+
return null;
|
|
58
|
+
}
|