@oxyfoo/whymeet-types 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ GNU GENERAL PUBLIC LICENSE
2
+ Version 3, 29 June 2007
3
+
4
+ Copyright (C) 2024 Gerem66
5
+
6
+ This program is free software: you can redistribute it and/or modify
7
+ it under the terms of the GNU General Public License as published by
8
+ the Free Software Foundation, either version 3 of the License, or
9
+ (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
package/README.md ADDED
@@ -0,0 +1,34 @@
1
+ # WhyMeet Types
2
+
3
+ Shared TypeScript types for the WhyMeet project — used by both the client (React Native) and the server (Node.js).
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @whymeet/types
9
+ ```
10
+
11
+ ## Development
12
+
13
+ ```bash
14
+ npm install
15
+ npm run build # Compile TypeScript → dist/
16
+ npm run lint # ESLint check
17
+ npm test # Type check (tsc --noEmit)
18
+ ```
19
+
20
+ ## Publishing
21
+
22
+ Published automatically via GitHub Actions on release creation. See `.github/workflows/npm-publish.yml`.
23
+
24
+ ## Structure
25
+
26
+ ```
27
+ Models/ # Domain models (User, Profile, Match, Conversation, etc.)
28
+ WS/ # WebSocket protocol types (request/response)
29
+ index.ts # Barrel export
30
+ ```
31
+
32
+ ## License
33
+
34
+ GPL-3.0
@@ -0,0 +1,87 @@
1
+ import { Profile } from '../Models/Profile.js';
2
+ export interface HTTPRequest_Device {
3
+ uuid?: string;
4
+ sessionToken?: string;
5
+ }
6
+ export type HTTPResponse_Device = {
7
+ status: 'new';
8
+ uuid: string;
9
+ sessionToken: string;
10
+ } | {
11
+ status: 'returning';
12
+ newSessionToken: string;
13
+ };
14
+ export interface HTTPRequest_Enter {
15
+ email: string;
16
+ deviceUUID: string;
17
+ sessionToken: string;
18
+ username?: string;
19
+ }
20
+ export type HTTPResponse_Enter = {
21
+ status: 'no-account';
22
+ } | {
23
+ status: 'authenticated';
24
+ wsToken: string;
25
+ newSessionToken: string;
26
+ user: Profile;
27
+ } | {
28
+ status: 'wait-mail';
29
+ message: string;
30
+ };
31
+ export interface HTTPRequest_GoogleSignIn {
32
+ idToken: string;
33
+ deviceUUID: string;
34
+ }
35
+ export type HTTPResponse_GoogleSignIn = {
36
+ status: 'authenticated';
37
+ wsToken: string;
38
+ newSessionToken: string;
39
+ user: Profile;
40
+ } | {
41
+ status: 'no-account';
42
+ email: string;
43
+ };
44
+ export interface HTTPRequest_AppleSignIn {
45
+ idToken: string;
46
+ deviceUUID: string;
47
+ }
48
+ export type HTTPResponse_AppleSignIn = {
49
+ status: 'authenticated';
50
+ wsToken: string;
51
+ newSessionToken: string;
52
+ user: Profile;
53
+ } | {
54
+ status: 'no-account';
55
+ email: string;
56
+ };
57
+ export interface HTTPResponse_ValidateEmail {
58
+ success: boolean;
59
+ message: string;
60
+ }
61
+ export interface HTTPRequest_RefreshWSToken {
62
+ deviceUUID: string;
63
+ sessionToken: string;
64
+ }
65
+ export interface HTTPResponse_RefreshWSToken {
66
+ wsToken: string;
67
+ newSessionToken: string;
68
+ user: Profile;
69
+ }
70
+ export interface HTTPResponse_DeviceStatus {
71
+ status: 'pending' | 'active';
72
+ }
73
+ export interface HTTPRequest_ResendEmail {
74
+ deviceUUID: string;
75
+ sessionToken: string;
76
+ }
77
+ export interface HTTPResponse_ResendEmail {
78
+ success: boolean;
79
+ message: string;
80
+ }
81
+ export interface HTTPRequest_SignOut {
82
+ deviceUUID: string;
83
+ sessionToken: string;
84
+ }
85
+ export interface HTTPResponse_SignOut {
86
+ success: boolean;
87
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ import type { User } from './User.js';
2
+ import type { InterestCategoryKey } from './Intention.js';
3
+ export interface ActivityPhoto {
4
+ id: string;
5
+ key: string;
6
+ position: number;
7
+ }
8
+ export interface Activity {
9
+ id: string;
10
+ host: User;
11
+ title: string;
12
+ description: string;
13
+ category: InterestCategoryKey;
14
+ dateTime: string | null;
15
+ locationName: string;
16
+ latitude: number | null;
17
+ longitude: number | null;
18
+ maxParticipants: number | null;
19
+ participantCount: number;
20
+ participants: User[];
21
+ photos: ActivityPhoto[];
22
+ conversationId: string | null;
23
+ isCancelled: boolean;
24
+ isArchived: boolean;
25
+ isParticipant: boolean;
26
+ isHost: boolean;
27
+ distance?: string;
28
+ distanceKm?: number;
29
+ createdAt: string;
30
+ updatedAt: string;
31
+ }
32
+ export interface ActivitySummary {
33
+ id: string;
34
+ title: string;
35
+ category: InterestCategoryKey;
36
+ dateTime: string | null;
37
+ locationName: string;
38
+ participantCount: number;
39
+ maxParticipants: number | null;
40
+ photoKey: string | null;
41
+ hostName: string;
42
+ distance?: string;
43
+ distanceKm?: number;
44
+ }
45
+ export interface ActivitySearchFilters {
46
+ category?: InterestCategoryKey;
47
+ maxDistance?: number;
48
+ dateFrom?: string;
49
+ dateTo?: string;
50
+ query?: string;
51
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export type PreferredPeriod = 'morning' | 'noon' | 'evening' | 'any';
2
+ export declare const PREFERRED_PERIODS: readonly PreferredPeriod[];
@@ -0,0 +1 @@
1
+ export const PREFERRED_PERIODS = ['morning', 'noon', 'evening', 'any'];
@@ -0,0 +1,9 @@
1
+ export interface BlockedUser {
2
+ id: string;
3
+ user: {
4
+ id: string;
5
+ name: string;
6
+ photoKey?: string;
7
+ };
8
+ blockedAt: string;
9
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import { User } from './User.js';
2
+ export interface Conversation {
3
+ id: string;
4
+ participant: User;
5
+ lastMessage?: string;
6
+ lastMessageTime?: string;
7
+ unreadCount: number;
8
+ isGroup: boolean;
9
+ activityId?: string;
10
+ activityTitle?: string;
11
+ participantCount?: number;
12
+ participants?: User[];
13
+ }
14
+ export interface Message {
15
+ id: string;
16
+ text: string;
17
+ senderId: string;
18
+ timestamp: string;
19
+ read: boolean;
20
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ export declare const INTENTION_KEYS: readonly ["dating", "friendship", "networking", "activities", "discussion"];
2
+ export type IntentionKey = (typeof INTENTION_KEYS)[number];
3
+ export interface Intention {
4
+ key: IntentionKey;
5
+ label: string;
6
+ emoji: string;
7
+ description: string;
8
+ }
9
+ export declare const INTENTIONS: readonly Intention[];
10
+ export interface SubIntention {
11
+ key: string;
12
+ label: string;
13
+ emoji: string;
14
+ tags: string[];
15
+ }
16
+ export declare const SUB_INTENTIONS: Record<IntentionKey, SubIntention[]>;
17
+ export declare const INTEREST_CATEGORY_KEYS: readonly ["sports", "music", "nightlife", "gaming", "food", "culture", "outdoors", "wellness", "travel", "creative", "learning"];
18
+ export type InterestCategoryKey = (typeof INTEREST_CATEGORY_KEYS)[number];
19
+ export interface InterestCategory {
20
+ key: InterestCategoryKey;
21
+ label: string;
22
+ emoji: string;
23
+ description: string;
24
+ }
25
+ export declare const INTEREST_CATEGORIES: readonly InterestCategory[];
@@ -0,0 +1,240 @@
1
+ export const INTENTION_KEYS = ['dating', 'friendship', 'networking', 'activities', 'discussion'];
2
+ export const INTENTIONS = [
3
+ { key: 'dating', label: 'Dating', emoji: '💕', description: 'Rencontrer quelqu\u2019un de spécial' },
4
+ { key: 'friendship', label: 'Amitié', emoji: '🤝', description: 'Se faire de nouveaux amis' },
5
+ { key: 'networking', label: 'Networking', emoji: '💼', description: 'Élargir son réseau professionnel' },
6
+ {
7
+ key: 'activities',
8
+ label: 'Activités',
9
+ emoji: '🎯',
10
+ description: 'Trouver quelqu\u2019un pour des activités ensemble'
11
+ },
12
+ { key: 'discussion', label: 'Discussion', emoji: '💬', description: 'Discuter sans prise de tête' }
13
+ ];
14
+ export const SUB_INTENTIONS = {
15
+ dating: [
16
+ {
17
+ key: 'cafe_verre',
18
+ label: 'Café & verre',
19
+ emoji: '☕',
20
+ tags: ['Café', 'Bar', 'Afterwork', 'Terrace', 'Cocktails', 'Tchin']
21
+ },
22
+ {
23
+ key: 'promenade',
24
+ label: 'Promenade',
25
+ emoji: '🚶',
26
+ tags: ['Balade', 'Parc', 'Nature', 'Plage', 'Pique-nique', 'Sunset']
27
+ },
28
+ {
29
+ key: 'dinner',
30
+ label: 'Dîner',
31
+ emoji: '🍽️',
32
+ tags: ['Restaurant', 'Cuisine', 'Gastronomie', 'Street food', 'Sushi', 'Brunch']
33
+ },
34
+ {
35
+ key: 'cine_culture',
36
+ label: 'Ciné & culture',
37
+ emoji: '🎬',
38
+ tags: ['Cinéma', 'Musée', 'Théâtre', 'Expo', 'Concert', 'Opéra']
39
+ },
40
+ { key: 'sortie', label: 'Soirée', emoji: '🌃', tags: ['Club', 'Bar', 'Live', 'DJ', 'Afterparty', 'Rooftop'] },
41
+ {
42
+ key: 'escapade',
43
+ label: 'Escapade',
44
+ emoji: '🌍',
45
+ tags: ['Week-end', 'Road trip', 'Voyage', 'Aventure', 'Hôtel', 'Camping']
46
+ },
47
+ {
48
+ key: 'online',
49
+ label: 'En ligne',
50
+ emoji: '💻',
51
+ tags: ['Vidéo', 'Chat', 'Jeux', 'Netflix', 'Long distance', 'Appel']
52
+ }
53
+ ],
54
+ friendship: [
55
+ {
56
+ key: 'cafe_detente',
57
+ label: 'Café & détente',
58
+ emoji: '☕',
59
+ tags: ['Café', 'Terrasse', 'Brunch', 'Discussion', 'Board games', 'Lecture']
60
+ },
61
+ {
62
+ key: 'gaming',
63
+ label: 'Gaming',
64
+ emoji: '🎮',
65
+ tags: ['PC', 'Console', 'Multijoueur', 'Tournoi', 'Retrogaming', 'VR']
66
+ },
67
+ {
68
+ key: 'sport',
69
+ label: 'Sport',
70
+ emoji: '🏃',
71
+ tags: ['Course', 'Salle', 'Foot', 'Basket', 'Tennis', 'Escalade']
72
+ },
73
+ {
74
+ key: 'sorties',
75
+ label: 'Sorties',
76
+ emoji: '🎉',
77
+ tags: ['Bar', 'Concert', 'Festival', 'Karaoké', 'Bowling', 'Karting']
78
+ },
79
+ {
80
+ key: 'creative',
81
+ label: 'Créatif',
82
+ emoji: '🎨',
83
+ tags: ['Art', 'Photo', 'Musique', 'Écriture', 'DIY', 'Craft']
84
+ },
85
+ {
86
+ key: 'online',
87
+ label: 'En ligne',
88
+ emoji: '💻',
89
+ tags: ['Discord', 'Gaming online', 'Podcasts', 'Séries', 'Watch party', 'Co-working']
90
+ }
91
+ ],
92
+ networking: [
93
+ {
94
+ key: 'startup',
95
+ label: 'Startup & Entreprise',
96
+ emoji: '💡',
97
+ tags: ['Entrepreneuriat', 'MVP', 'Levée de fonds', 'B2B', 'SaaS', 'Scale-up']
98
+ },
99
+ {
100
+ key: 'tech',
101
+ label: 'Tech & Digital',
102
+ emoji: '💻',
103
+ tags: ['Dev', 'IA', 'Produit', 'UX', 'Data', 'Cybersécurité']
104
+ },
105
+ {
106
+ key: 'creative_pro',
107
+ label: 'Créatif & Médias',
108
+ emoji: '🎨',
109
+ tags: ['Design', 'Brand', 'Contenu', 'Photo', 'Vidéo', 'Marketing']
110
+ },
111
+ {
112
+ key: 'freelance',
113
+ label: 'Freelance',
114
+ emoji: '🔧',
115
+ tags: ['Consulting', 'Missions', 'Indépendant', 'Portage', 'Auto-entrepreneur', 'Remote']
116
+ },
117
+ {
118
+ key: 'finance',
119
+ label: 'Finance & Invest',
120
+ emoji: '📈',
121
+ tags: ['VC', 'Angel', 'Trading', 'Crypto', 'Immobilier', 'Fintech']
122
+ },
123
+ {
124
+ key: 'mentoring',
125
+ label: 'Mentorat',
126
+ emoji: '🎓',
127
+ tags: ['Mentor', 'Mentoré', 'Reconversion', 'Carrière', 'Coaching', 'Académique']
128
+ }
129
+ ],
130
+ activities: [
131
+ {
132
+ key: 'sport',
133
+ label: 'Sport',
134
+ emoji: '🏃',
135
+ tags: ['Running', 'Salle', 'Foot', 'Basket', 'Tennis', 'Natation', 'Escalade', 'Yoga']
136
+ },
137
+ {
138
+ key: 'gaming',
139
+ label: 'Gaming',
140
+ emoji: '🎮',
141
+ tags: ['PC', 'Console', 'Multijoueur', 'RPG', 'FPS', 'Tournoi', 'Board games']
142
+ },
143
+ {
144
+ key: 'food_cuisine',
145
+ label: 'Food & Cuisine',
146
+ emoji: '🍳',
147
+ tags: ['Cuisine', 'Restaurant', 'Brunch', 'Street food', 'Pâtisserie', 'Vin']
148
+ },
149
+ {
150
+ key: 'outdoors',
151
+ label: 'Plein air',
152
+ emoji: '🏕️',
153
+ tags: ['Randonnée', 'Camping', 'Nature', 'Vélo', 'Kayak', 'Escalade']
154
+ },
155
+ {
156
+ key: 'music',
157
+ label: 'Musique',
158
+ emoji: '🎵',
159
+ tags: ['Concert', 'Festival', 'Instrument', 'DJ', 'Chant', 'Composition']
160
+ },
161
+ { key: 'creative', label: 'Créatif', emoji: '🎨', tags: ['Art', 'Photo', 'Vidéo', 'DIY', 'Craft', 'Peinture'] },
162
+ {
163
+ key: 'cinema_series',
164
+ label: 'Ciné & Séries',
165
+ emoji: '🎬',
166
+ tags: ['Cinéma', 'Série', 'Watch party', 'Ciné-club', 'Documentaire', 'Anime']
167
+ },
168
+ {
169
+ key: 'travel',
170
+ label: 'Voyage',
171
+ emoji: '✈️',
172
+ tags: ['Road trip', 'Backpacking', 'Week-end', 'City trip', 'Aventure', 'Photos de voyage']
173
+ }
174
+ ],
175
+ discussion: [
176
+ {
177
+ key: 'culture_actu',
178
+ label: 'Culture & Actu',
179
+ emoji: '🌍',
180
+ tags: ['Politique', 'Économie', 'Société', 'Histoire', 'Géopolitique', 'Environnement']
181
+ },
182
+ {
183
+ key: 'cinema_series',
184
+ label: 'Films & Séries',
185
+ emoji: '🎬',
186
+ tags: ['Cinéma', 'Série', 'Netflix', 'Animation', 'Critiques', 'Recommandations']
187
+ },
188
+ { key: 'gaming', label: 'Gaming', emoji: '🎮', tags: ['JV', 'Retrogaming', 'Esport', 'Tests', 'RPG', 'Indé'] },
189
+ {
190
+ key: 'tech_sciences',
191
+ label: 'Tech & Sciences',
192
+ emoji: '💻',
193
+ tags: ['IA', 'Espace', 'Physique', 'Biotech', 'Futurisme', 'Open Source']
194
+ },
195
+ {
196
+ key: 'travel_stories',
197
+ label: 'Voyages',
198
+ emoji: '✈️',
199
+ tags: ['Récits', 'Tips', 'Destinations', 'Cultures', 'Gastronomie', 'Aventures']
200
+ },
201
+ {
202
+ key: 'philosophy',
203
+ label: 'Société & Philo',
204
+ emoji: '🤔',
205
+ tags: ['Philo', 'Éthique', 'Débat', 'Spiritualité', 'Psychologie', 'Stoïcisme']
206
+ },
207
+ {
208
+ key: 'humor',
209
+ label: 'Humour',
210
+ emoji: '😂',
211
+ tags: ['Mèmes', 'Stand-up', 'Impro', 'Culture internet', 'Absurde', 'Sketches']
212
+ }
213
+ ]
214
+ };
215
+ export const INTEREST_CATEGORY_KEYS = [
216
+ 'sports',
217
+ 'music',
218
+ 'nightlife',
219
+ 'gaming',
220
+ 'food',
221
+ 'culture',
222
+ 'outdoors',
223
+ 'wellness',
224
+ 'travel',
225
+ 'creative',
226
+ 'learning'
227
+ ];
228
+ export const INTEREST_CATEGORIES = [
229
+ { key: 'sports', label: 'Sports', emoji: '⚽', description: 'Football, running, fitness…' },
230
+ { key: 'music', label: 'Musique', emoji: '🎵', description: 'Concerts, instruments, genres…' },
231
+ { key: 'nightlife', label: 'Sorties', emoji: '🌙', description: 'Bars, clubs, soirées…' },
232
+ { key: 'gaming', label: 'Gaming', emoji: '🎮', description: 'Jeux vidéo, board games…' },
233
+ { key: 'food', label: 'Food', emoji: '🍕', description: 'Restaurants, cuisine, food trips…' },
234
+ { key: 'culture', label: 'Culture', emoji: '🎭', description: 'Musées, cinéma, théâtre…' },
235
+ { key: 'outdoors', label: 'Plein air', emoji: '🏔️', description: 'Rando, escalade, nature…' },
236
+ { key: 'wellness', label: 'Bien-être', emoji: '🧘', description: 'Yoga, méditation, spa…' },
237
+ { key: 'travel', label: 'Voyages', emoji: '✈️', description: 'Découvrir de nouveaux endroits' },
238
+ { key: 'creative', label: 'Créatif', emoji: '🎨', description: 'Art, photo, écriture, DIY…' },
239
+ { key: 'learning', label: 'Apprentissage', emoji: '📚', description: 'Langues, tech, sciences…' }
240
+ ];
@@ -0,0 +1,34 @@
1
+ import { User } from './User.js';
2
+ import { IntentionKey } from './Intention.js';
3
+ export interface MatchCandidate {
4
+ id: string;
5
+ user: User;
6
+ intentions: IntentionKey[];
7
+ bio: string;
8
+ interests: string[];
9
+ skills: string[];
10
+ distance: string;
11
+ distanceKm?: number;
12
+ mutualFriends?: number;
13
+ score?: number;
14
+ blurred?: boolean;
15
+ alreadyInteracted?: boolean;
16
+ }
17
+ export interface Match {
18
+ id: string;
19
+ user: User;
20
+ matchContext: string;
21
+ intentionKey: IntentionKey;
22
+ matchedAt: string;
23
+ lastMessage?: string;
24
+ lastMessageTime?: string;
25
+ unread: number;
26
+ isNew: boolean;
27
+ }
28
+ export interface MatchRequest {
29
+ id: string;
30
+ sender: User;
31
+ intentions: IntentionKey[];
32
+ matchContext: string;
33
+ sentAt: string;
34
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ export interface Notification {
2
+ id: string;
3
+ type: 'match' | 'message' | 'like' | 'system' | 'activity_reminder';
4
+ title: string;
5
+ body: string;
6
+ read: boolean;
7
+ createdAt: string;
8
+ activityId?: string;
9
+ metadata?: Record<string, string>;
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,25 @@
1
+ import { User } from './User.js';
2
+ import { IntentionKey } from './Intention.js';
3
+ import { Tag } from './Tag.js';
4
+ export type SocialVibe = 'reserved' | 'calm' | 'balanced' | 'outgoing' | 'very_social';
5
+ export declare const SOCIAL_VIBES: readonly SocialVibe[];
6
+ export interface Profile extends User {
7
+ bio: string;
8
+ interests: Tag[];
9
+ skills: Tag[];
10
+ socialVibe: SocialVibe;
11
+ intentions: IntentionKey[];
12
+ spokenLanguages: string[];
13
+ location: {
14
+ country: string;
15
+ region: string;
16
+ city: string;
17
+ latitude: number | null;
18
+ longitude: number | null;
19
+ };
20
+ stats: {
21
+ connections: number;
22
+ matches: number;
23
+ vibes: number;
24
+ };
25
+ }
@@ -0,0 +1 @@
1
+ export const SOCIAL_VIBES = ['reserved', 'calm', 'balanced', 'outgoing', 'very_social'];
@@ -0,0 +1,2 @@
1
+ export type ReportReason = 'spam' | 'fake_profile' | 'inappropriate' | 'hate_speech' | 'underage' | 'misleading' | 'dangerous' | 'other';
2
+ export type ReportSourceType = 'profile' | 'conversation' | 'activity';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ import { IntentionKey, InterestCategoryKey } from './Intention.js';
2
+ export interface SearchFilters {
3
+ intentions?: IntentionKey[];
4
+ interestCategory?: InterestCategoryKey;
5
+ interestCategories?: InterestCategoryKey[];
6
+ tags?: string[];
7
+ ageRange?: [number, number];
8
+ distance?: number;
9
+ maxDistance?: number;
10
+ remote?: boolean;
11
+ languages?: string[];
12
+ verified?: boolean;
13
+ query?: string;
14
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import type { IntentionKey } from './Intention.js';
2
+ export type Language = 'fr' | 'en';
3
+ export type Theme = 'light' | 'dark';
4
+ export type Gender = 'male' | 'female' | 'non_binary' | 'other' | 'prefer_not_to_say';
5
+ export declare const GENDERS: readonly Gender[];
6
+ export interface DiscoveryPreferences {
7
+ ageRange: [number, number];
8
+ genders: Gender[];
9
+ intentions: IntentionKey[];
10
+ maxDistance: number;
11
+ remoteMode: boolean;
12
+ verifiedOnly: boolean;
13
+ photosOnly: boolean;
14
+ }
15
+ export interface VisibilityPreferences {
16
+ ageRange: [number, number];
17
+ genders: Gender[];
18
+ intentions: IntentionKey[];
19
+ maxDistance: number;
20
+ remoteMode: boolean;
21
+ }
22
+ export interface UserSettings {
23
+ language: Language;
24
+ theme: Theme;
25
+ notifNewMatch: boolean;
26
+ notifLikes: boolean;
27
+ notifMessages: boolean;
28
+ notifNearbyPeople: boolean;
29
+ notifActivityReminder24h: boolean;
30
+ notifActivityReminder1h: boolean;
31
+ }
32
+ export declare const DEFAULT_DISCOVERY: DiscoveryPreferences;
33
+ export declare const DEFAULT_VISIBILITY: VisibilityPreferences;
@@ -0,0 +1,17 @@
1
+ export const GENDERS = ['male', 'female', 'non_binary', 'other', 'prefer_not_to_say'];
2
+ export const DEFAULT_DISCOVERY = {
3
+ ageRange: [18, 99],
4
+ genders: ['male', 'female', 'non_binary', 'other', 'prefer_not_to_say'],
5
+ intentions: [],
6
+ maxDistance: 50,
7
+ remoteMode: false,
8
+ verifiedOnly: false,
9
+ photosOnly: false
10
+ };
11
+ export const DEFAULT_VISIBILITY = {
12
+ ageRange: [18, 99],
13
+ genders: ['male', 'female', 'non_binary', 'other', 'prefer_not_to_say'],
14
+ intentions: [],
15
+ maxDistance: 50,
16
+ remoteMode: false
17
+ };