veza/apps/web/src/features/settings/components/NotificationSettings.tsx
senke 0c8cd43303 feat(notifications): N1 Web Push subscribe, preferences, badge
- notificationService: subscribePush, getPreferences, updatePreferences
- PushPreferencesSection: API-connected toggles, subscribe button
- usePushSubscribe: permission, pushManager.subscribe, POST to API
- NotificationMenu: document.title badge (N1.4)
- sw.js: payload compat (link/url)
- MSW: push/subscribe, preferences handlers
2026-02-21 16:43:48 +01:00

189 lines
6.6 KiB
TypeScript

import { Checkbox } from '@/components/ui/checkbox';
import { Label } from '@/components/ui/label';
import { NotificationSettings as NotificationSettingsType } from '../types/settings';
import { PushPreferencesSection } from './PushPreferencesSection';
interface NotificationSettingsProps {
notifications: NotificationSettingsType;
onChange: (notifications: NotificationSettingsType) => void;
}
export function NotificationSettings({
notifications,
onChange,
}: NotificationSettingsProps) {
const handleChange = (
field: keyof NotificationSettingsType,
value: boolean,
) => {
onChange({
...notifications,
[field]: value,
});
};
return (
<div className="space-y-6">
<div>
<h3 className="text-lg font-semibold mb-4">Notifications par email</h3>
<div className="space-y-4">
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_notifications">Notifications email</Label>
<p className="text-sm text-muted-foreground">
Recevoir des notifications par email
</p>
</div>
<Checkbox
id="email_notifications"
checked={notifications.email_notifications}
onCheckedChange={(checked) =>
handleChange('email_notifications', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="push_notifications">Notifications push</Label>
<p className="text-sm text-muted-foreground">
Recevoir des notifications push
</p>
</div>
<Checkbox
id="push_notifications"
checked={notifications.push_notifications}
onCheckedChange={(checked) =>
handleChange('push_notifications', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="browser_notifications">
Notifications navigateur
</Label>
<p className="text-sm text-muted-foreground">
Recevoir des notifications dans le navigateur
</p>
</div>
<Checkbox
id="browser_notifications"
checked={notifications.browser_notifications}
onCheckedChange={(checked) =>
handleChange('browser_notifications', checked === true)
}
/>
</div>
</div>
</div>
<div>
<h3 className="text-lg font-semibold mb-4">Notifications d'activité</h3>
<div className="space-y-4">
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_on_follow">Email lors d'un follow</Label>
<p className="text-sm text-muted-foreground">
Recevoir un email quand quelqu'un vous suit
</p>
</div>
<Checkbox
id="email_on_follow"
checked={notifications.email_on_follow}
onCheckedChange={(checked) =>
handleChange('email_on_follow', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_on_like">Email lors d'un like</Label>
<p className="text-sm text-muted-foreground">
Recevoir un email quand quelqu'un aime votre contenu
</p>
</div>
<Checkbox
id="email_on_like"
checked={notifications.email_on_like}
onCheckedChange={(checked) =>
handleChange('email_on_like', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_on_comment">
Email lors d'un commentaire
</Label>
<p className="text-sm text-muted-foreground">
Recevoir un email quand quelqu'un commente votre contenu
</p>
</div>
<Checkbox
id="email_on_comment"
checked={notifications.email_on_comment}
onCheckedChange={(checked) =>
handleChange('email_on_comment', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_on_message">Email lors d'un message</Label>
<p className="text-sm text-muted-foreground">
Recevoir un email quand vous recevez un message
</p>
</div>
<Checkbox
id="email_on_message"
checked={notifications.email_on_message}
onCheckedChange={(checked) =>
handleChange('email_on_message', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_on_mention">Email lors d'une mention</Label>
<p className="text-sm text-muted-foreground">
Recevoir un email quand quelqu'un vous mentionne
</p>
</div>
<Checkbox
id="email_on_mention"
checked={notifications.email_on_mention}
onCheckedChange={(checked) =>
handleChange('email_on_mention', checked === true)
}
/>
</div>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<Label htmlFor="email_marketing">Email marketing</Label>
<p className="text-sm text-muted-foreground">
Recevoir des emails promotionnels et des actualités
</p>
</div>
<Checkbox
id="email_marketing"
checked={notifications.email_marketing}
onCheckedChange={(checked) =>
handleChange('email_marketing', checked === true)
}
/>
</div>
</div>
</div>
{/* N1.3: Push preferences from API */}
<PushPreferencesSection />
</div>
);
}