feat: add Recapt analytics, remove push-notifications extension, UI fixes

- Integrate Recapt session tracking with user identity in dashboard layout
- Remove push-notifications extension from settings, panel registry, and toggle list
- Fix journal entry preview overflow on narrow viewports
- Update transaction manual booking button label
- Clarify invoice email error message to reference env vars

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jakob Wennberg
2026-03-05 10:12:26 +01:00
co-authored by Claude Opus 4.6
parent 325c930839
commit 497ef876bb
9 changed files with 64 additions and 32 deletions
+6
View File
@@ -2,6 +2,7 @@ import { createClient } from '@/lib/supabase/server'
import { redirect } from 'next/navigation'
import DashboardNav from '@/components/dashboard/DashboardNav'
import { ChatWidget } from '@/components/chat'
import { RecaptIdentify } from '@/components/RecaptIdentify'
import type { EntityType } from '@/types'
export default async function DashboardLayout({
@@ -55,6 +56,11 @@ export default async function DashboardLayout({
</div>
</main>
<ChatWidget />
<RecaptIdentify
userId={user.id}
email={user.email}
displayName={settings.company_name || undefined}
/>
</div>
)
}
+1 -23
View File
@@ -35,7 +35,6 @@ import type { CompanySettings } from '@/types'
import { CalendarFeedSettings } from '@/components/settings/CalendarFeedSettings'
import { getSettingsPanel } from '@/lib/extensions/settings-panel-registry'
const NotificationPanel = getSettingsPanel('push-notifications')
const BankingPanel = getSettingsPanel('enable-banking')
export default function SettingsPage() {
@@ -48,7 +47,6 @@ export default function SettingsPage() {
const [isSaving, setIsSaving] = useState(false)
const [settings, setSettings] = useState<CompanySettings | null>(null)
const [hasBankingExtension, setHasBankingExtension] = useState(false)
const [hasNotificationExtension, setHasNotificationExtension] = useState(false)
const [hasCalendarExtension, setHasCalendarExtension] = useState(false)
const [showDeleteDialog, setShowDeleteDialog] = useState(false)
const [deleteConfirmText, setDeleteConfirmText] = useState('')
@@ -127,9 +125,8 @@ export default function SettingsPage() {
setSettings(settingsData)
// Check extension toggles in parallel
const [bankingToggleRes, notificationToggleRes, calendarToggleRes] = await Promise.all([
const [bankingToggleRes, calendarToggleRes] = await Promise.all([
fetch('/api/extensions/toggles/general/enable-banking').catch(() => null),
fetch('/api/extensions/toggles/general/push-notifications').catch(() => null),
fetch('/api/extensions/toggles/general/calendar').catch(() => null),
])
@@ -147,11 +144,6 @@ export default function SettingsPage() {
setHasBankingExtension((connections && connections.length > 0) || false)
}
if (notificationToggleRes?.ok) {
const { data } = await notificationToggleRes.json()
setHasNotificationExtension(data?.enabled || false)
}
if (calendarToggleRes?.ok) {
const { data } = await calendarToggleRes.json()
setHasCalendarExtension(data?.enabled || false)
@@ -271,11 +263,6 @@ export default function SettingsPage() {
<TabsTrigger value="banking">
Bank (PSD2)
</TabsTrigger>
{hasNotificationExtension && (
<TabsTrigger value="notifications">
Aviseringar
</TabsTrigger>
)}
{hasCalendarExtension && (
<TabsTrigger value="calendar">
Kalender
@@ -532,15 +519,6 @@ export default function SettingsPage() {
)}
</TabsContent>
{/* Notification settings — loaded dynamically from extension */}
{hasNotificationExtension && (
<TabsContent value="notifications">
{NotificationPanel ? (
<NotificationPanel />
) : null}
</TabsContent>
)}
{/* Calendar feed settings */}
{hasCalendarExtension && (
<TabsContent value="calendar">
+1 -1
View File
@@ -748,7 +748,7 @@ export default function TransactionsPage() {
/>
<div className="pt-2 border-t">
<Button variant="ghost" size="sm" className="w-full text-muted-foreground" onClick={handleManualBooking}>
Bokför manuellt utan mall...
Ange konton manuellt...
</Button>
</div>
</DialogContent>
+1 -1
View File
@@ -33,7 +33,7 @@ export async function POST(
const emailService = getEmailService()
if (!emailService.isConfigured()) {
return NextResponse.json(
{ error: 'E-posttjänsten är inte konfigurerad. Aktivera e-posttillägget i inställningar.' },
{ error: 'E-posttjänsten är inte konfigurerad. Kontrollera att RESEND_API_KEY och RESEND_FROM_EMAIL är satta i miljövariablerna.' },
{ status: 503 }
)
}
+7
View File
@@ -62,6 +62,13 @@ export default function RootLayout({
<Toaster />
</ThemeProvider>
<Script src="/sw-register.js" strategy="afterInteractive" />
<Script
src="https://cdn.recapt.app/browser/glimt.js"
strategy="afterInteractive"
data-public-key="pk_8de220ce34c81413de154d10ff681a9eb3a5a9c12d28bd6c7bc2613c9f5acfbb"
data-persist
data-enable-user-comments
/>
</body>
</html>
);