Docfile commited on
Commit
23f07ff
·
verified ·
1 Parent(s): c0834c0

Update templates/index.html

Browse files
Files changed (1) hide show
  1. templates/index.html +138 -156
templates/index.html CHANGED
@@ -1,172 +1,154 @@
1
  <!DOCTYPE html>
2
  <html lang="fr">
3
  <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Mariam AI</title>
7
- <!-- Intégration de Tailwind CSS -->
8
- <script src="https://cdn.tailwindcss.com"></script>
9
- <!-- Intégration d'Animate.css pour les animations -->
10
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"/>
11
- <style>
12
- /* Loader personnalisé */
13
- .loader {
14
- border-top-color: #3498db;
15
- animation: spin 1s linear infinite;
16
- }
17
- @keyframes spin {
18
- to { transform: rotate(360deg); }
19
- }
20
- </style>
21
  </head>
22
- <body class="bg-gradient-to-r from-blue-500 to-purple-600 min-h-screen flex items-center justify-center">
23
- <div class="bg-white rounded-xl shadow-2xl overflow-hidden w-full max-w-4xl">
24
- <!-- En-tête -->
25
- <header class="bg-gradient-to-r from-purple-600 to-blue-500 p-6 flex justify-between items-center">
26
- <h1 class="text-white text-3xl font-bold">Mariam AI</h1>
27
- <div class="flex space-x-4">
28
- <label class="flex items-center text-white">
29
- <input type="checkbox" id="webSearchToggle" class="mr-2">
30
- Activer la recherche web
31
- </label>
32
- <button onclick="clearChat()" class="bg-red-500 hover:bg-red-600 text-white px-4 py-2 rounded transition duration-200">
33
- Effacer le chat
34
- </button>
35
- </div>
36
- </header>
 
37
 
38
- <!-- Contenu principal -->
39
- <main class="p-6 flex flex-col h-96">
40
- <!-- Upload de fichier -->
41
- <div class="mb-4 flex items-center">
42
- <input type="file" id="fileUpload" class="hidden" accept=".jpg,.jpeg,.png,.pdf,.txt,.mp3,.mp4">
43
- <label for="fileUpload" class="cursor-pointer bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded transition duration-200">
44
- Télécharger un fichier
45
- </label>
46
- <span id="fileName" class="ml-2 text-gray-600"></span>
47
- </div>
48
- <!-- Zone des messages -->
49
- <div id="chatMessages" class="flex-1 overflow-y-auto space-y-4 mb-4">
50
- {% for message in messages %}
51
- <div class="flex {% if message.role == 'user' %}justify-end{% else %}justify-start{% endif %} animate__animated animate__fadeIn">
52
- <div class="max-w-3/4 p-3 rounded-lg {% if message.role == 'user' %}bg-blue-500 text-white{% else %}bg-gray-200 text-gray-800{% endif %}">
53
- {{ message.content }}
54
- </div>
55
- </div>
56
- {% endfor %}
57
- </div>
58
- <!-- Loader animé -->
59
- <div id="loader" class="hidden flex justify-center my-4">
60
- <div class="loader border-8 border-t-8 border-gray-200 rounded-full h-12 w-12"></div>
61
- </div>
62
- <!-- Zone de saisie -->
63
- <div class="border-t pt-4">
64
- <div class="flex space-x-4">
65
- <input type="text" id="messageInput" class="flex-1 border rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="Écrivez votre message...">
66
- <button onclick="sendMessage()" class="bg-blue-500 hover:bg-blue-600 text-white px-6 py-2 rounded-lg transition duration-200 transform hover:scale-105">
67
- Envoyer
68
- </button>
 
69
  </div>
70
- </div>
71
- </main>
72
- </div>
73
 
74
- <!-- Scripts -->
75
- <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.0.2/marked.min.js"></script>
76
- <script>
77
- const messageInput = document.getElementById('messageInput');
78
- const chatMessages = document.getElementById('chatMessages');
79
- const webSearchToggle = document.getElementById('webSearchToggle');
80
- const fileUpload = document.getElementById('fileUpload');
81
- const fileName = document.getElementById('fileName');
82
- const loader = document.getElementById('loader');
83
 
84
- function addMessage(content, isUser = false) {
85
- const messageDiv = document.createElement('div');
86
- messageDiv.className = `flex ${isUser ? 'justify-end' : 'justify-start'} animate__animated animate__fadeIn`;
87
-
88
- const innerDiv = document.createElement('div');
89
- innerDiv.className = `max-w-3/4 p-3 rounded-lg ${isUser ? 'bg-blue-500 text-white' : 'bg-gray-200 text-gray-800'}`;
90
- innerDiv.innerHTML = marked.parse(content);
91
-
92
- messageDiv.appendChild(innerDiv);
93
- chatMessages.appendChild(messageDiv);
94
- chatMessages.scrollTop = chatMessages.scrollHeight;
95
- }
96
 
97
- async function sendMessage() {
98
- const message = messageInput.value.trim();
99
- if (!message) return;
100
-
101
- addMessage(message, true);
102
- messageInput.value = '';
103
-
104
- loader.classList.remove('hidden'); // Afficher le loader
105
-
106
- try {
107
- const response = await fetch('/send_message', {
108
- method: 'POST',
109
- headers: { 'Content-Type': 'application/json' },
110
- body: JSON.stringify({
111
- message: message,
112
- web_search: webSearchToggle.checked
113
- })
114
- });
115
-
116
- const data = await response.json();
117
- loader.classList.add('hidden'); // Masquer le loader
118
-
119
- if (data.error) {
120
- addMessage(`Erreur: ${data.error}`);
121
- } else {
122
- addMessage(data.response);
 
 
123
  }
124
- } catch (error) {
125
- loader.classList.add('hidden');
126
- addMessage(`Erreur: ${error.message}`);
127
- }
128
- }
129
 
130
- messageInput.addEventListener('keypress', (e) => {
131
- if (e.key === 'Enter') {
132
- sendMessage();
133
- }
134
- });
 
 
 
 
 
 
 
 
135
 
136
- fileUpload.addEventListener('change', async (e) => {
137
- const file = e.target.files[0];
138
- if (!file) return;
139
-
140
- fileName.textContent = file.name;
141
- const formData = new FormData();
142
- formData.append('file', file);
143
-
144
- try {
145
- const response = await fetch('/upload', {
146
- method: 'POST',
147
- body: formData
 
 
 
148
  });
149
-
150
- const data = await response.json();
151
- if (data.error) {
152
- alert(`Erreur: ${data.error}`);
153
- } else {
154
- addMessage(`Fichier téléchargé: ${file.name}`);
155
- }
156
- } catch (error) {
157
- alert(`Erreur: ${error.message}`);
158
- }
159
- });
160
 
161
- async function clearChat() {
162
- try {
163
- await fetch('/clear_chat', { method: 'POST' });
164
- chatMessages.innerHTML = '';
165
- location.reload();
166
- } catch (error) {
167
- alert(`Erreur: ${error.message}`);
168
- }
169
- }
170
- </script>
171
  </body>
172
  </html>
 
1
  <!DOCTYPE html>
2
  <html lang="fr">
3
  <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Mariam AI</title>
7
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
8
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/marked/4.0.2/marked.min.js"></script>
 
 
 
 
 
 
 
 
 
 
 
 
9
  </head>
10
+ <body class="bg-gray-100 h-screen">
11
+ <div class="container mx-auto p-4 h-full flex flex-col">
12
+ <div class="bg-white rounded-lg shadow-lg p-6 h-full flex flex-col">
13
+ <!-- Header -->
14
+ <div class="flex justify-between items-center mb-6">
15
+ <h1 class="text-2xl font-bold">Mariam AI</h1>
16
+ <div class="flex space-x-4">
17
+ <label class="flex items-center">
18
+ <input type="checkbox" id="webSearchToggle" class="mr-2">
19
+ Activer la recherche web
20
+ </label>
21
+ <button onclick="clearChat()" class="bg-red-500 text-white px-4 py-2 rounded hover:bg-red-600">
22
+ Effacer le chat
23
+ </button>
24
+ </div>
25
+ </div>
26
 
27
+ <!-- File Upload -->
28
+ <div class="mb-4">
29
+ <input type="file" id="fileUpload" class="hidden" accept=".jpg,.jpeg,.png,.pdf,.txt,.mp3,.mp4">
30
+ <label for="fileUpload" class="cursor-pointer bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">
31
+ Télécharger un fichier
32
+ </label>
33
+ <span id="fileName" class="ml-2 text-gray-600"></span>
34
+ </div>
35
+
36
+ <!-- Chat Messages -->
37
+ <div id="chatMessages" class="flex-1 overflow-y-auto mb-4 space-y-4">
38
+ {% for message in messages %}
39
+ <div class="flex {% if message.role == 'user' %}justify-end{% endif %}">
40
+ <div class="max-w-3/4 p-3 rounded-lg {% if message.role == 'user' %}bg-blue-500 text-white{% else %}bg-gray-200{% endif %}">
41
+ {{ message.content }}
42
+ </div>
43
+ </div>
44
+ {% endfor %}
45
+ </div>
46
+
47
+ <!-- Input Area -->
48
+ <div class="border-t pt-4">
49
+ <div class="flex space-x-4">
50
+ <input type="text" id="messageInput"
51
+ class="flex-1 border rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500"
52
+ placeholder="Écrivez votre message...">
53
+ <button onclick="sendMessage()"
54
+ class="bg-blue-500 text-white px-6 py-2 rounded-lg hover:bg-blue-600 transition duration-200">
55
+ Envoyer
56
+ </button>
57
+ </div>
58
+ </div>
59
  </div>
60
+ </div>
 
 
61
 
62
+ <script>
63
+ const messageInput = document.getElementById('messageInput');
64
+ const chatMessages = document.getElementById('chatMessages');
65
+ const webSearchToggle = document.getElementById('webSearchToggle');
66
+ const fileUpload = document.getElementById('fileUpload');
67
+ const fileName = document.getElementById('fileName');
 
 
 
68
 
69
+ function addMessage(content, isUser = false) {
70
+ const messageDiv = document.createElement('div');
71
+ messageDiv.className = `flex ${isUser ? 'justify-end' : ''}`;
72
+
73
+ const innerDiv = document.createElement('div');
74
+ innerDiv.className = `max-w-3/4 p-3 rounded-lg ${isUser ? 'bg-blue-500 text-white' : 'bg-gray-200'}`;
75
+ innerDiv.innerHTML = marked.parse(content);
76
+
77
+ messageDiv.appendChild(innerDiv);
78
+ chatMessages.appendChild(messageDiv);
79
+ chatMessages.scrollTop = chatMessages.scrollHeight;
80
+ }
81
 
82
+ async function sendMessage() {
83
+ const message = messageInput.value.trim();
84
+ if (!message) return;
85
+
86
+ addMessage(message, true);
87
+ messageInput.value = '';
88
+
89
+ try {
90
+ const response = await fetch('/send_message', {
91
+ method: 'POST',
92
+ headers: {
93
+ 'Content-Type': 'application/json'
94
+ },
95
+ body: JSON.stringify({
96
+ message: message,
97
+ web_search: webSearchToggle.checked
98
+ })
99
+ });
100
+
101
+ const data = await response.json();
102
+ if (data.error) {
103
+ addMessage(`Erreur: ${data.error}`);
104
+ } else {
105
+ addMessage(data.response);
106
+ }
107
+ } catch (error) {
108
+ addMessage(`Erreur: ${error.message}`);
109
+ }
110
  }
 
 
 
 
 
111
 
112
+ messageInput.addEventListener('keypress', (e) => {
113
+ if (e.key === 'Enter') {
114
+ sendMessage();
115
+ }
116
+ });
117
+
118
+ fileUpload.addEventListener('change', async (e) => {
119
+ const file = e.target.files[0];
120
+ if (!file) return;
121
+
122
+ fileName.textContent = file.name;
123
+ const formData = new FormData();
124
+ formData.append('file', file);
125
 
126
+ try {
127
+ const response = await fetch('/upload', {
128
+ method: 'POST',
129
+ body: formData
130
+ });
131
+
132
+ const data = await response.json();
133
+ if (data.error) {
134
+ alert(`Erreur: ${data.error}`);
135
+ } else {
136
+ addMessage(`Fichier téléchargé: ${file.name}`);
137
+ }
138
+ } catch (error) {
139
+ alert(`Erreur: ${error.message}`);
140
+ }
141
  });
 
 
 
 
 
 
 
 
 
 
 
142
 
143
+ async function clearChat() {
144
+ try {
145
+ await fetch('/clear_chat', { method: 'POST' });
146
+ chatMessages.innerHTML = '';
147
+ location.reload();
148
+ } catch (error) {
149
+ alert(`Erreur: ${error.message}`);
150
+ }
151
+ }
152
+ </script>
153
  </body>
154
  </html>