Docteur Nizar Aflak

📌 46 Av. Niel, 75017 Paris

4.8 / 5
(89 avis)

Horaires d'Ouverture

  • Lundi 08:00–20:00
  • Mardi 08:00–20:00
  • Mercredi 08:00–20:00
  • Jeudi 08:00–20:00
  • Vendredi 08:00–20:00
  • Samedi 08:00–12:00
  • DimancheFermé

A propos :

Découvrez toutes les informations concernant Gynécologue-obstétricien Docteur Nizar Aflak qui se situe au 46 Av. Niel, 75017 Paris (75). Cette fiche inclut les photos, les horaires d'ouverture, l'adresse, le numéro de téléphone et les avis des clients.

Galerie Photos

Accessibilité

  • Entrée accessible en fauteuil roulant
  • Toilettes accessibles en fauteuil roulant

Services

  • Toilettes

Planning

  • Rendez-vous recommandés

Paiements

  • Cartes de crédit
  • Cartes de débit

Parking

  • Parking payant dans la rue

Contribution & Gestion de la fiche

Êtes-vous le propriétaire de cet établissement ? Aidez-nous à garder cette fiche à jour ou demandez sa suppression.

🖋️ Écrire un avis (Google)

Avis des clients

Avis de : You.h.
Note de : 5 / 5

"J’ai été opérée une première fois en 2020 par le Dr Aflak pour une endométriose profonde. Mes deux trompes étaient abîmées, mais il a réussi à en sauver une et à retirer toutes les lésions. Grâce à lui, j’ai pu réaliser mon rêve de devenir maman. En début d’année après de nouveaux examens, on m’annonçait que ma trompe s’était de nouveau bouchée et qu’il n’y avait plus d’espoir de la sauver. Pourtant, en reconsultant le Dr Aflak, j’ai retrouvé la même écoute, la même bienveillance et la même compétence. Il prend toujours le temps d’expliquer, de rassurer et de répondre aux inquiétudes, ce qui est essentiel face à l’endométriose. En août, il m’a réopérée et, une fois encore, il a réussi à sauver ma trompe et à retirer toutes les lésions. Le Dr Aflak est un chirurgien exceptionnel Je ne le remercierai jamais assez pour son professionnalisme et son humanité. Pour moi il est de loin le meilleur chirurgien dans son domaine. À toutes les femmes qui souffrent d’endométriose ne perdez jamais espoir. J’ai été opérée à deux reprises par le Dr Aflak, qui a su sauver ce que d’autres pensaient perdu. Grâce à son écoute, sa bienveillance et son expertise, j’ai pu retrouver la santé, soulager mes douleurs et garder l’espoir de devenir maman une deuxième fois."

Posté le 21/01/1970 à 08:03
Avis de : Tab.F.
Note de : 5 / 5

"Je tiens à exprimer toute ma gratitude envers Dr Aflak, un chirurgien gynécologue exceptionnel qui m’a littéralement sauvé la vie. En effet, j’avais un kyste de l’ovaire qui mesurait de + de 25 cm et qui m’a causé une phlébite très importante. J’ai consulté plusieurs chirurgiens qui envisageaient de m’opérer par ouverture abdominale et qui voulaient retirer l’ovaire. Dr Aflak a su enlever le kyste ovarien de plus de 25 cm tout en préservant ma fertilité. L’intervention a été réalisée par cœlioscopie, une prouesse compte tenu de la taille du kyste. Un immense merci pour son professionnalisme, sa bienveillance et sa maîtrise technique. Je recommande le Aflak les yeux fermés."

Posté le 21/01/1970 à 07:55
Avis de : Gwendoline.e.
Note de : 5 / 5

"Après 15 ans de souffrance, d’errance médicale et de douleurs incomprises, j’ai enfin croisé le chemin du Dr Aflak… et ma vie a changé. Il m’a opérée de mon endométriose en décembre 2024, et depuis, je revis. Les douleurs ont disparu. Le Dr Aflak est un médecin exceptionnel : à l’écoute, bienveillant, humain et surtout très pédagogue. Il prend le temps de tout expliquer avec clarté, sans jamais minimiser notre ressenti. Je me suis sentie enfin entendue et comprise. Je le recommande à 2000% à toutes les femmes qui souffrent d’endométriose ou qui cherchent un gynécologue de confiance. Merci infiniment, Docteur 🙏"

Posté le 21/01/1970 à 07:24
Avis de : Dorine.a.
Note de : 5 / 5

"J’avais de très nombreux fibromes sous-séreux douloureux et un fibrome pédiculé de plus de 13cm qui faisait descendre mon utérus. Mon gynécologue m’a mise en contact avec le Professeur Aflak qui a tout simplement été formidable. Il a pris en compte mon parcours médical et mon histoire personnelle jonchée de traumatismes. En effet, je n’ai malheureusement pas pu avoir d’enfants mais il était important pour moi de garder mon utérus devenu un symbole très fort. Le Professeur Aflak a pris le temps de m’expliquer l’opération et ses risques. Il a répondu à toutes mes questions. J’ai eu deux interventions : une embolisation des fibromes puis le retrait de fibromes. J’ai eu une chance extraordinaire. L’embolisation a très bien fonctionnée ce qui a permis au Professeur Aflak d’enlever 8 fibromes dont celui de 13cm, le tout par coelioscopie. Trois ans se sont écoulés et tout va très bien. Je ne remercierai jamais assez le Professeur Aflak pour son écoute et sa bienveillance. Il m’a permis de retrouver ma vie de femme. Une femme certes sans enfants mais une femme entière."

Posté le 21/01/1970 à 06:30
Avis de : hela.a.
Note de : 5 / 5

"Excelent chirurgien au taup je recommande à toute les femmes qui ont de problèmes de fibrome et d'endométriose. Mon intervention a duré 7 heure et c'était très compliqué mais grâce à Dieu puis à Docteur Aflak et son staff ;l'équipe de réanimation et l'anesthésiste oubliant pas son secrétaire Barbara toute est bien passé je leur remercie beaucoup du fond de coeur."

Posté le 21/01/1970 à 05:53
Avis de : Cath.y.
Note de : 5 / 5

"J’ai consulté le Dr Aflak dans le cadre d’une démarche chirurgicale et je tiens à souligner son professionnalisme, sa bienveillance et sa réactivité. J’ai été touchée par la qualité de sa prise en charge et sa capacité à agir rapidement pour coordonner les soins nécessaires. Un grand merci pour votre écoute et votre implication ! Je recommande vivement."

Posté le 21/01/1970 à 04:36
Avis de : Diallo.a.
Note de : 5 / 5

"Je suis patiente du Dr qui avait un état désespérée de fibromes. Il a réussi un parie qui n'était pas gagné qui était celui de sauver mon utérus. Je le recommande à 1000 % . Merci Dr Aflak de me donner espoir."

Posté le 21/01/1970 à 04:22
Avis de : Christine.a.
Note de : 5 / 5

"Le meilleur chirurgien endométriose. Il a réalisé sur moi une cœlioscopie en février 2021 pendant mon parcours PMA. Grace à son intervention , j’ai pu avoir deux filles en parfaite santé , et bientôt un troisième enfant que j’ai pu avoir naturellement ! J’espère que mon témoignage redonnera espoir a beaucoup de femmes qui souffrent de la même chose . N’hésitez vraiment pas à aller le voir . Il prend en plus le temps dans chacune de ses consultation et il aime avoir des nouvelles de ses patientes . C’est quelqu’un de très humain"

Posté le 21/01/1970 à 04:09
Avis de : Nejia.o.
Note de : 5 / 5

"Atteinte d’endométriose de stade 4 (kystes ovariens/adhérences) depuis une trentaine d’années, Dr. Aflak m’a été recommandé comme chirurgien expert dans le domaine. La première consultation a eu lieu dans son cabinet privé, il a été très pédagogue et bienveillant, et m’a laissé le choix du lieu de mon intervention, à la clinique ou à l’hôpital, ayant remarqué que ma mutuelle ne me rembourserait pas convenablement. Il m’a ainsi conseillé de réaliser mon intervention à l’hôpital afin de bénéficier d’une prise en charge totale. J’ai du mal à reconnaître le dr. Aflak dans un des commentaires que j’ai pu lire, concernant l’aspect financier pratiqué par ce dernier, car j’ai vécu personnellement une situation totalement contraire à ce qui a été décrit. L’intervention chirurgicale a été longue et complexe mais a permis de faire disparaître la plupart des douleurs avec lesquelles je vivais depuis plusieurs années. Le Dr Aflak est un chirurgien hors pair, il se caractérise par sa rigueur, son professionnalisme et son dévouement envers ses patientes. C’est une pépite et je le recommande les yeux fermés !"

Posté le 21/01/1970 à 03:19
Avis de : Leila..
Note de : 5 / 5

"Il est rare de rencontrer un médecin qui allie à la perfection expertise, bienveillance et un véritable engagement pour ses patientes. Le Dr NIZAR AFLAK fait partie de ces rares professionnels qui changent une vie. Atteinte d’endométriose avec une atteinte digestive sévère, j’étais confrontée à un risque de résection d’une partie de mon côlon et donc à la possibilité d’une stomie. Mais grâce à son approche réfléchie, son écoute et son immense savoir-faire, il a su adopter une stratégie médicamenteuse qui a permis de limiter les dégâts et d’éviter une opération trop précoce. Deux ans plus tard, les lésions sont toujours présentes, mais leur taille a diminué, et surtout, j’ai pu éviter une intervention trop lourde au mauvais moment. Le Dr NIZAR AFLAK ne se contente pas d’être un excellent chirurgien, il est aussi un médecin d’une humanité rare, qui prend en compte chaque aspect de la maladie et ses répercussions sur la vie de ses patientes. Pour toutes celles qui souffrent d’endométriose sévère et qui ont besoin d’un vrai expert, ne perdez pas de temps ailleurs. Vous méritez d’être entre les mains d’un tel professionnel. Merci à vous Dr"

Posté le 21/01/1970 à 03:12

Entreprises à proximité

Klam Antoine à Paris

Klam Antoine

39 Rue Galilée

75016 Paris

1 Avis
A l'Ombre de Notre Dame à Paris

A l'Ombre de Notre Dame

20 Rue du Cloitre Notre Dame

75004 Paris

301 Avis
Hexagone Patrimoine - Agence immobilière Paris 10 à Paris

Hexagone Patrimoine - Agence immobilière Paris 10

49 Rue d'Hauteville

75010 Paris

26 Avis
Centre Anima à Paris

Centre Anima

31 Rue de Maubeuge

75009 Paris

45 Avis
Sobremesa à Paris

Sobremesa

127 Rue Caulaincourt

75018 Paris

98 Avis
RANG à Paris

RANG

50 Rue de la Fontaine au Roi

75011 Paris

711 Avis
Thomas Lepaire Ostéopathe D.O à Paris

Thomas Lepaire Ostéopathe D.O

3 Rue Jacques Kable

75018 Paris

29 Avis
Hôtel Ambassadeur à Paris

Hôtel Ambassadeur

153 Rue Legendre

75017 Paris

668 Avis
La Plateforme du Bâtiment - PARIS 12e - GARE DE LYON à Paris

La Plateforme du Bâtiment - PARIS 12e - GARE DE LYON

58 Quai de la Rapée

75012 Paris

62 Avis
Agence Immobilière Paris 6 - Junot 6e à Paris

Agence Immobilière Paris 6 - Junot 6e

28 Rue du Cherche-Midi

75006 Paris

80 Avis
DAR🐔CROUSTY - Paris 19 à Paris

DAR🐔CROUSTY - Paris 19

2 Rue des Alouettes

75019 Paris

204 Avis
Lili's Brownies Café à Paris

Lili's Brownies Café

35 Rue du Dragon

75006 Paris

180 Avis
Boulangerie l'opéra-comique à Paris

Boulangerie l'opéra-comique

75017, 72 Bd Berthier

75017 Paris

44 Avis
Assistance Etudiants à Paris

Assistance Etudiants

153 Rue de l'Université

75007 Paris

1 Avis
Concept Coiffure Universelle à Paris

Concept Coiffure Universelle

6 Pl. du 25 Août 1944

75014 Paris

44 Avis
A.M.I. Association Médicale Interentreprises à Paris

A.M.I. Association Médicale Interentreprises

22 Rue de Châteaudun

75009 Paris

3 Avis
Doc'Biker à Paris

Doc'Biker

185 Av. du Maine

75014 Paris

270 Avis
// NOUVELLES FONCTIONS POUR LE MODAL TÉLÉPHONE (SVA) const phoneModal = document.getElementById('phone-modal'); const modalPhoneDisplay = document.getElementById('modal-phone-display'); const modalCallBtn = document.getElementById('modal-call-btn'); const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); function openPhoneModal(svaNumber) { // Remplir les données du modal avec le numéro SVA modalPhoneDisplay.textContent = svaNumber; modalCallBtn.href = 'tel:' + svaNumber.replace(/\s/g, ''); phoneModal.classList.remove('hidden'); } function closePhoneModal() { phoneModal.classList.add('hidden'); } // ANCIEN MODAL (EXIT) - Renommage de la fonction pour éviter les conflits function closeExitModal() { document.getElementById('exit-modal').classList.remove('show'); } // 1. GESTION DU BOUTON "RETOUR EN HAUT" (Optimisé) const backToTopButton = document.getElementById('backtotop'); let isBackToTopVisible = false; // État pour éviter de toucher au DOM inutilement window.addEventListener('scroll', () => { // On lit la valeur (Lecture) const shouldBeVisible = window.scrollY > 300; // On écrit dans le DOM SEULEMENT si l'état change (Écriture) if (shouldBeVisible !== isBackToTopVisible) { isBackToTopVisible = shouldBeVisible; if (isBackToTopVisible) { backToTopButton.classList.remove('hidden'); } else { backToTopButton.classList.add('hidden'); } } }, { passive: true }); // 'passive: true' améliore la fluidité du scroll backToTopButton.addEventListener('click', () => { window.scrollTo({ top: 0, behavior: 'smooth' }); }); // 2. GESTION DES TÉLÉPHONES ET DU RESTE (DOM Loaded) document.addEventListener('DOMContentLoaded', () => { const isMobile = window.innerWidth < 768; const showPhoneBtn = document.getElementById('show-phone-btn'); const showPhoneBtnFloating = document.getElementById('show-phone-btn-floating'); // Les anciens éléments d'affichage inline (phoneDisplayContainer, etc.) sont supprimés/ignorés const restaurantCard = document.querySelector('[data-place-id]'); const phoneErrorSpan = document.getElementById('phone-error'); // Éléments flottants const floatingPhoneBtn = document.getElementById('floating-phone-btn'); const phoneButtonContainer = document.getElementById('phone-button-container'); // Éléments du modal de suppression const suppressionModal = document.getElementById('suppression-modal'); const openSuppressionModal = document.getElementById('open-suppression-modal'); const openSuppressionModalBottom = document.getElementById('open-suppression-modal-bottom'); const closeSuppressionModal = document.getElementById('close-suppression-modal'); const smsHeader = document.getElementById('sms-header'); const callHeader = document.getElementById('call-header'); const smsContent = document.getElementById('sms-content'); const callContent = document.getElementById('call-content'); const smsArrow = document.getElementById('sms-arrow'); const callArrow = document.getElementById('call-arrow'); // --- LOGIQUE MODAL DE SUPPRESSION --- function toggleAccordion(header, content, arrow) { const isActive = content.classList.contains('active'); // Fermer tous les autres document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); if (!isActive) { content.classList.add('active'); arrow.classList.add('rotate'); } } if (smsHeader && callHeader) { smsHeader.addEventListener('click', () => toggleAccordion(smsHeader, smsContent, smsArrow)); callHeader.addEventListener('click', () => toggleAccordion(callHeader, callContent, callArrow)); } // Gestion ouverture/fermeture du modal de suppression function openSuppressionModalFunc() { suppressionModal.classList.add('show'); // Réinitialiser les accordéons à l'ouverture document.querySelectorAll('.accordion-content').forEach(c => c.classList.remove('active')); document.querySelectorAll('.accordion-arrow').forEach(a => a.classList.remove('rotate')); } function closeSuppressionModalFunc() { suppressionModal.classList.remove('show'); } if (openSuppressionModal) { openSuppressionModal.addEventListener('click', openSuppressionModalFunc); } if (openSuppressionModalBottom) { openSuppressionModalBottom.addEventListener('click', openSuppressionModalFunc); } if (closeSuppressionModal) { closeSuppressionModal.addEventListener('click', closeSuppressionModalFunc); } if (suppressionModal) { suppressionModal.addEventListener('click', (e) => { if (e.target === suppressionModal) { closeSuppressionModalFunc(); } }); } // --- OPTIMISATION MAJEURE ICI : Intersection Observer au lieu de Scroll Event --- // Au lieu de calculer des maths à chaque scroll, on observe si le bouton principal sort de l'écran if (isMobile && phoneButtonContainer && floatingPhoneBtn) { const observer = new IntersectionObserver((entries) => { entries.forEach(entry => { // Si le conteneur du bouton n'est plus visible (on a scrollé vers le bas) // On affiche le bouton flottant if (!entry.isIntersecting && entry.boundingClientRect.top < 0) { floatingPhoneBtn.classList.remove('translate-y-full'); } else { floatingPhoneBtn.classList.add('translate-y-full'); } }); }, { threshold: 0 }); // Se déclenche dès qu'un pixel sort/entre observer.observe(phoneButtonContainer); } // -------------------------------------------------------------------------------- // La fonction getPhoneNumber est mise à jour pour ouvrir le modal if (showPhoneBtn && restaurantCard && phoneErrorSpan) { const getPhoneNumber = async (btn) => { const placeId = restaurantCard.dataset.placeId; const modalRealPhoneDisplay = document.getElementById('modal-real-phone-display'); phoneErrorSpan.textContent = ''; phoneErrorSpan.classList.add('hidden'); const originalBtnContent = btn.innerHTML; // SVG Spinner inline pour éviter les sauts de ligne btn.innerHTML = `Chargement...`; btn.disabled = true; try { const response = await fetch('get_number.php?site=autour-de-moi.tel', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ place_id: placeId }) }); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); const data = await response.json(); const svaNumber = data.phone_number; const realNumber = modalRealPhoneDisplay.textContent; // Utilise le numéro par défaut dans le modal comme "vrai" numéro, car l'API n'en fournit qu'un. // Ouvre le modal et remplit les champs openPhoneModal(svaNumber); if (isMobile) { // Sur mobile, lancer directement l'appel SVA window.location.href = 'tel:' + svaNumber.replace(/\s/g, ''); } btn.innerHTML = originalBtnContent; btn.disabled = false; } catch (error) { console.error('Erreur:', error); // Affiche l'erreur sur le bouton ou span phoneErrorSpan.textContent = 'Erreur de connexion. Veuillez réessayer.'; phoneErrorSpan.classList.remove('hidden'); btn.innerHTML = originalBtnContent; btn.disabled = false; } }; showPhoneBtn.addEventListener('click', () => getPhoneNumber(showPhoneBtn)); if (showPhoneBtnFloating) { showPhoneBtnFloating.addEventListener('click', () => getPhoneNumber(showPhoneBtnFloating)); } } // --- GALERIE --- const galleryItems = document.querySelectorAll('.gallery-item'); if(galleryItems.length > 0) { const galleryOverlay = document.getElementById('gallery-overlay'); const galleryFullImg = document.getElementById('gallery-full-img'); const prevBtn = document.getElementById('gallery-prev'); const nextBtn = document.getElementById('gallery-next'); const closeBtn = document.getElementById('gallery-close'); let currentImageIndex = 0; let fullImages = []; galleryItems.forEach(item => { fullImages.push(item.dataset.fullImgSrc); item.addEventListener('click', () => { currentImageIndex = Array.from(galleryItems).indexOf(item); galleryFullImg.src = fullImages[currentImageIndex]; galleryOverlay.classList.remove('hidden'); }); }); // Utilisation de fonctions fléchées simples if(prevBtn) prevBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex > 0) ? currentImageIndex - 1 : fullImages.length - 1; galleryFullImg.src = fullImages[currentImageIndex]; }); if(nextBtn) nextBtn.addEventListener('click', () => { currentImageIndex = (currentImageIndex < fullImages.length - 1) ? currentImageIndex + 1 : 0; galleryFullImg.src = fullImages[currentImageIndex]; }); if(closeBtn) closeBtn.addEventListener('click', () => galleryOverlay.classList.add('hidden')); if(galleryOverlay) galleryOverlay.addEventListener('click', (e) => { if (e.target === galleryOverlay) galleryOverlay.classList.add('hidden'); }); } // --- CARROUSEL GALERIE --- const container = document.getElementById('gallery-carousel-container'); const prevGalleryBtn = document.getElementById('gallery-prev-btn'); const nextGalleryBtn = document.getElementById('gallery-next-btn'); if (container && prevGalleryBtn && nextGalleryBtn) { // Calculer scrollStep une seule fois, pas à chaque clic si possible, // ou le garder dynamique si la fenêtre change de taille prevGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: -(container.offsetWidth * 0.8), behavior: 'smooth' }); }); nextGalleryBtn.addEventListener('click', () => { container.scrollBy({ left: (container.offsetWidth * 0.8), behavior: 'smooth' }); }); } // --- EXIT INTENT MODAL --- const modal = document.getElementById('exit-modal'); const closeModalBtn = document.getElementById('close-modal'); if (modal && !localStorage.getItem('visited_page')) { const showModal = () => { modal.classList.add('show'); localStorage.setItem('visited_page', 'true'); }; document.documentElement.addEventListener('mouseleave', (e) => { if (e.clientY <= 0) showModal(); }); if(closeModalBtn) closeModalBtn.addEventListener('click', () => closeExitModal()); } // --- AUTOCOMPLETE --- async function fetchAutocompleteData(phpFile, query) { try { const response = await fetch(`${phpFile}?query=${encodeURIComponent(query)}`); if (!response.ok) throw new Error(`Erreur HTTP: ${response.status}`); return await response.json(); } catch (error) { console.error("Erreur autocomplétion:", error); return []; } } function setupAutocomplete(inputId, dropdownId, phpFile) { const input = document.getElementById(inputId); const dropdown = document.getElementById(dropdownId); let timeout = null; if (!dropdown || !input) return; input.addEventListener('input', () => { const query = input.value.toLowerCase(); if (timeout) clearTimeout(timeout); if (query.length < 2) { dropdown.classList.add('hidden'); return; } // Optimisation: Afficher chargement seulement si pas trop rapide dropdown.innerHTML = '
Chargement...
'; dropdown.classList.remove('hidden'); timeout = setTimeout(async () => { const results = await fetchAutocompleteData(phpFile, query); dropdown.innerHTML = ''; if (results.length > 0) { const fragment = document.createDocumentFragment(); // Optimisation DOM results.forEach(result => { const item = document.createElement('div'); item.classList.add('autocomplete-item'); item.textContent = result; item.addEventListener('click', () => { input.value = result; dropdown.classList.add('hidden'); }); fragment.appendChild(item); }); dropdown.appendChild(fragment); } else { dropdown.innerHTML = '
Aucun résultat trouvé.
'; } }, 300); }); document.addEventListener('click', (e) => { if (!input.contains(e.target) && !dropdown.contains(e.target)) { dropdown.classList.add('hidden'); } }); } setupAutocomplete('activity-input', 'activity-dropdown', 'get_activities.php'); setupAutocomplete('city-input', 'city-dropdown', 'get_cities.php'); }); // Références aux éléments du DOM const statusDisplay = document.getElementById('status-display'); const locateButton = document.getElementById('locate-button'); const loadingSpinner = document.getElementById('loading-spinner'); const resultBox = document.getElementById('result-box'); const latitudeSpan = document.getElementById('latitude'); const longitudeSpan = document.getElementById('longitude'); const accuracySpan = document.getElementById('accuracy'); const buttonText = document.getElementById('button-text'); /** * Met à jour le statut affiché dans la boîte d'information. * @param {string} message - Le message à afficher. * @param {string} type - Le type de message ('info', 'success', 'error'). */ function updateStatus(message, type = 'info') { statusDisplay.style.display = "block"; statusDisplay.innerHTML = message; statusDisplay.className = 'p-4 rounded-lg text-sm text-center'; resultBox.classList.add('hidden'); switch (type) { case 'success': statusDisplay.classList.add('bg-green-50', 'border', 'border-green-200', 'text-green-800'); break; case 'error': statusDisplay.classList.add('bg-red-50', 'border', 'border-red-200', 'text-red-800'); break; case 'info': default: statusDisplay.classList.add('bg-blue-50', 'border', 'border-blue-200', 'text-blue-800'); break; } } /** * Gère la réussite de la géolocalisation. * @param {GeolocationPosition} position - L'objet de position retourné par l'API. */ function success(position) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Relancer la Géolocalisation'; const lat = position.coords.latitude.toFixed(6); const lon = position.coords.longitude.toFixed(6); const acc = position.coords.accuracy.toFixed(2); latitudeSpan.textContent = lat; longitudeSpan.textContent = lon; accuracySpan.textContent = `${acc} m`; //updateStatus(`Localisation réussie ! Vos coordonnées sont affichées ci-dessous.`, 'success'); resultBox.classList.remove('hidden'); window.location = "/recherche_gps.php?lat="+lat+"&lon="+lon }/** * Définit l'action de rechargement du bouton après un refus de permission. */ function setReloadButtonAction() { locateButton.setAttribute('onclick', 'window.location.search = \'?get_gps=1\''); } function getDeviceType() { const ua = navigator.userAgent; // 1. Détection Android if (/Android/i.test(ua)) { return "Android"; } // 2. Détection iOS (iPhone, iPod, iPad classique) // 'i' rend la recherche insensible à la casse (maj/min) if (/iPhone|iPad|iPod/i.test(ua)) { return "iOS"; } // 3. Détection iPad OS 13+ (Le Piège !) // Depuis iOS 13, les iPad se déclarent comme des Mac (MacIntel). // On vérifie s'il y a un écran tactile (maxTouchPoints > 1) pour faire la différence. if (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) { return "iOS"; // C'est un iPad } // 4. Tout le reste est considéré comme PC/Desktop (Mac, Windows, Linux) return "PC"; } /** * Gère l'échec de la géolocalisation. * @param {GeolocationPositionError} error - L'objet d'erreur retourné par l'API. */ function error(err) { locateButton.disabled = false; loadingSpinner.classList.add('hidden'); buttonText.textContent = 'Me Localiser'; let errorMessage = "Erreur inconnue."; let troubleshooting = "Vérifiez que votre connexion Internet est stable."; let devicetype = getDeviceType(); switch (err.code) { case err.PERMISSION_DENIED: setReloadButtonAction(); errorMessage = "Accès refusé (Code 1) : Vous devez autoriser le navigateur à accéder à votre position."; if(devicetype === 'iOS'){ // DÉTECTION SPÉCIFIQUE IOS POUR LE MESSAGE D'AIDE troubleshooting = '

Allez dans Réglages > Confidentialité et sécurité > Service de localisation. Sélectionnez Safari (ou votre navigateur) et cochez "Lorsque l\'app est active".'; }else if (getDeviceType() === 'Android') { // Texte Spécifique Android troubleshooting = '
1. Activez la "Position" (📍) dans le menu rapide du haut.
2. Si cela échoue, vérifiez que Chrome a la permission : Paramètres > Applis > Chrome > Autorisations.'; } else { // Texte par défaut (PC/Mac) troubleshooting = 'Cliquez sur le cadenas 🔒 à gauche de l\'adresse URL et autorisez la localisation, ou vérifiez les préférences de votre navigateur.'; } break; case err.POSITION_UNAVAILABLE: errorMessage = "Position indisponible (Code 2) : Impossible de déterminer votre position."; troubleshooting = "Ceci peut se produire si votre appareil n'a pas de signal GPS ou si vous êtes dans un environnement sans Wi-Fi/données mobiles."; break; case err.TIMEOUT: errorMessage = "Délai expiré (Code 3) : La recherche de position a pris trop de temps."; troubleshooting = "Essayez de vous déplacer vers un endroit avec un meilleur signal ou une meilleure connexion."; break; default: errorMessage = `Erreur : ${err.message}`; troubleshooting = "Veuillez vérifier les points ci-dessus."; break; } updateStatus(`${errorMessage}

Solution : ${troubleshooting}`, 'error'); } /** * Lance le processus de géolocalisation. */ function getGeolocation() { if (!navigator.geolocation) { updateStatus("Votre navigateur ne supporte pas l'API de géolocalisation.", 'error'); return; } // Désactivation du bouton et affichage du spinner locateButton.disabled = true; loadingSpinner.classList.remove('hidden'); //updateStatus("Lancement de la requête de géolocalisation...", 'info'); // Options de la requête de géolocalisation const options = { enableHighAccuracy: true, // Haute précision timeout: 15000, // 15 secondes avant le TIMEOUT maximumAge: 0 // Ne pas utiliser de position mise en cache }; navigator.geolocation.getCurrentPosition(success, error, options); } // Message initial //updateStatus("Bienvenue. Cliquez sur le bouton pour tester votre géolocalisation.");