@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 +17 -0
- package/README.md +34 -0
- package/dist/HTTP/Auth.d.ts +87 -0
- package/dist/HTTP/Auth.js +1 -0
- package/dist/Models/Activity.d.ts +51 -0
- package/dist/Models/Activity.js +1 -0
- package/dist/Models/Availability.d.ts +2 -0
- package/dist/Models/Availability.js +1 -0
- package/dist/Models/Block.d.ts +9 -0
- package/dist/Models/Block.js +1 -0
- package/dist/Models/Conversation.d.ts +20 -0
- package/dist/Models/Conversation.js +1 -0
- package/dist/Models/Intention.d.ts +25 -0
- package/dist/Models/Intention.js +240 -0
- package/dist/Models/Match.d.ts +34 -0
- package/dist/Models/Match.js +1 -0
- package/dist/Models/Notification.d.ts +10 -0
- package/dist/Models/Notification.js +1 -0
- package/dist/Models/Profile.d.ts +25 -0
- package/dist/Models/Profile.js +1 -0
- package/dist/Models/Report.d.ts +2 -0
- package/dist/Models/Report.js +1 -0
- package/dist/Models/Search.d.ts +14 -0
- package/dist/Models/Search.js +1 -0
- package/dist/Models/Settings.d.ts +33 -0
- package/dist/Models/Settings.js +17 -0
- package/dist/Models/Subscription.d.ts +40 -0
- package/dist/Models/Subscription.js +20 -0
- package/dist/Models/Tag.d.ts +9 -0
- package/dist/Models/Tag.js +1 -0
- package/dist/Models/User.d.ts +23 -0
- package/dist/Models/User.js +1 -0
- package/dist/Models/index.d.ts +19 -0
- package/dist/Models/index.js +5 -0
- package/dist/WS/Request.d.ts +794 -0
- package/dist/WS/Request.js +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/package.json +59 -0
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 @@
|
|
|
1
|
+
export const PREFERRED_PERIODS = ['morning', 'noon', 'evening', 'any'];
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|
+
};
|