diff --git a/Dockerfile.android b/Dockerfile.android
index afcf4eb..ba98044 100644
--- a/Dockerfile.android
+++ b/Dockerfile.android
@@ -7,8 +7,17 @@ RUN apt-get update && apt-get install -y \
unzip \
git \
curl \
+ ca-certificates \
+ gnupg \
&& rm -rf /var/lib/apt/lists/*
+# Installer Java 21 depuis Temurin (Eclipse Adoptium)
+RUN wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | apt-key add - && \
+ echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print $2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list && \
+ apt-get update && \
+ apt-get install -y temurin-21-jdk && \
+ rm -rf /var/lib/apt/lists/*
+
# Variables d'environnement Android
ENV ANDROID_HOME=/opt/android-sdk
ENV PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/latest/bin
diff --git a/android/.gitignore b/android/.gitignore
new file mode 100644
index 0000000..48354a3
--- /dev/null
+++ b/android/.gitignore
@@ -0,0 +1,101 @@
+# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
+
+# Built application files
+*.apk
+*.aar
+*.ap_
+*.aab
+
+# Files for the ART/Dalvik VM
+*.dex
+
+# Java class files
+*.class
+
+# Generated files
+bin/
+gen/
+out/
+# Uncomment the following line in case you need and you don't have the release build type files in your app
+# release/
+
+# Gradle files
+.gradle/
+build/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Proguard folder generated by Eclipse
+proguard/
+
+# Log Files
+*.log
+
+# Android Studio Navigation editor temp files
+.navigation/
+
+# Android Studio captures folder
+captures/
+
+# IntelliJ
+*.iml
+.idea/workspace.xml
+.idea/tasks.xml
+.idea/gradle.xml
+.idea/assetWizardSettings.xml
+.idea/dictionaries
+.idea/libraries
+# Android Studio 3 in .gitignore file.
+.idea/caches
+.idea/modules.xml
+# Comment next line if keeping position of elements in Navigation Editor is relevant for you
+.idea/navEditor.xml
+
+# Keystore files
+# Uncomment the following lines if you do not want to check your keystore files in.
+#*.jks
+#*.keystore
+
+# External native build folder generated in Android Studio 2.2 and later
+.externalNativeBuild
+.cxx/
+
+# Google Services (e.g. APIs or Firebase)
+# google-services.json
+
+# Freeline
+freeline.py
+freeline/
+freeline_project_description.json
+
+# fastlane
+fastlane/report.xml
+fastlane/Preview.html
+fastlane/screenshots
+fastlane/test_output
+fastlane/readme.md
+
+# Version control
+vcs.xml
+
+# lint
+lint/intermediates/
+lint/generated/
+lint/outputs/
+lint/tmp/
+# lint/reports/
+
+# Android Profiling
+*.hprof
+
+# Cordova plugins for Capacitor
+capacitor-cordova-android-plugins
+
+# Copied web assets
+app/src/main/assets/public
+
+# Generated Config files
+app/src/main/assets/capacitor.config.json
+app/src/main/assets/capacitor.plugins.json
+app/src/main/res/xml/config.xml
diff --git a/android/app/.gitignore b/android/app/.gitignore
new file mode 100644
index 0000000..043df80
--- /dev/null
+++ b/android/app/.gitignore
@@ -0,0 +1,2 @@
+/build/*
+!/build/.npmkeep
diff --git a/android/app/build.gradle b/android/app/build.gradle
new file mode 100644
index 0000000..2754596
--- /dev/null
+++ b/android/app/build.gradle
@@ -0,0 +1,54 @@
+apply plugin: 'com.android.application'
+
+android {
+ namespace "com.pensionmarama.admin"
+ compileSdk rootProject.ext.compileSdkVersion
+ defaultConfig {
+ applicationId "com.pensionmarama.admin"
+ minSdkVersion rootProject.ext.minSdkVersion
+ targetSdkVersion rootProject.ext.targetSdkVersion
+ versionCode 1
+ versionName "1.0"
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ aaptOptions {
+ // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
+ // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
+ ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
+ }
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+}
+
+repositories {
+ flatDir{
+ dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
+ }
+}
+
+dependencies {
+ implementation fileTree(include: ['*.jar'], dir: 'libs')
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
+ implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
+ implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
+ implementation project(':capacitor-android')
+ testImplementation "junit:junit:$junitVersion"
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
+ implementation project(':capacitor-cordova-android-plugins')
+}
+
+apply from: 'capacitor.build.gradle'
+
+try {
+ def servicesJSON = file('google-services.json')
+ if (servicesJSON.text) {
+ apply plugin: 'com.google.gms.google-services'
+ }
+} catch(Exception e) {
+ logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
+}
diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle
new file mode 100644
index 0000000..bbfb44f
--- /dev/null
+++ b/android/app/capacitor.build.gradle
@@ -0,0 +1,19 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+
+android {
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_21
+ targetCompatibility JavaVersion.VERSION_21
+ }
+}
+
+apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
+dependencies {
+
+
+}
+
+
+if (hasProperty('postBuildExtras')) {
+ postBuildExtras()
+}
diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
new file mode 100644
index 0000000..f1b4245
--- /dev/null
+++ b/android/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
new file mode 100644
index 0000000..f2c2217
--- /dev/null
+++ b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java
@@ -0,0 +1,26 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import android.content.Context;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see Testing documentation
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+
+ @Test
+ public void useAppContext() throws Exception {
+ // Context of the app under test.
+ Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+ assertEquals("com.getcapacitor.app", appContext.getPackageName());
+ }
+}
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..340e7df
--- /dev/null
+++ b/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/java/com/pensionmarama/admin/MainActivity.java b/android/app/src/main/java/com/pensionmarama/admin/MainActivity.java
new file mode 100644
index 0000000..e8ddfbb
--- /dev/null
+++ b/android/app/src/main/java/com/pensionmarama/admin/MainActivity.java
@@ -0,0 +1,5 @@
+package com.pensionmarama.admin;
+
+import com.getcapacitor.BridgeActivity;
+
+public class MainActivity extends BridgeActivity {}
diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png
new file mode 100644
index 0000000..e31573b
Binary files /dev/null and b/android/app/src/main/res/drawable-land-hdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png
new file mode 100644
index 0000000..f7a6492
Binary files /dev/null and b/android/app/src/main/res/drawable-land-mdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png
new file mode 100644
index 0000000..8077255
Binary files /dev/null and b/android/app/src/main/res/drawable-land-xhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png
new file mode 100644
index 0000000..14c6c8f
Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png
new file mode 100644
index 0000000..244ca25
Binary files /dev/null and b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-hdpi/splash.png b/android/app/src/main/res/drawable-port-hdpi/splash.png
new file mode 100644
index 0000000..74faaa5
Binary files /dev/null and b/android/app/src/main/res/drawable-port-hdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-mdpi/splash.png b/android/app/src/main/res/drawable-port-mdpi/splash.png
new file mode 100644
index 0000000..e944f4a
Binary files /dev/null and b/android/app/src/main/res/drawable-port-mdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-xhdpi/splash.png b/android/app/src/main/res/drawable-port-xhdpi/splash.png
new file mode 100644
index 0000000..564a82f
Binary files /dev/null and b/android/app/src/main/res/drawable-port-xhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png
new file mode 100644
index 0000000..bfabe68
Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png
new file mode 100644
index 0000000..6929071
Binary files /dev/null and b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png differ
diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..c7bd21d
--- /dev/null
+++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..d5fccc5
--- /dev/null
+++ b/android/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/android/app/src/main/res/drawable/splash.png b/android/app/src/main/res/drawable/splash.png
new file mode 100644
index 0000000..f7a6492
Binary files /dev/null and b/android/app/src/main/res/drawable/splash.png differ
diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..b5ad138
--- /dev/null
+++ b/android/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000..036d09b
--- /dev/null
+++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..c023e50
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..2127973
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..b441f37
Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..72905b8
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..8ed0605
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..9502e47
Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..4d1e077
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..df0f158
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..853db04
Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..6cdf97c
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..2960cbb
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..8e3093a
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..46de6e2
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000..d2ea9ab
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..a40d73e
Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 0000000..c5d5899
--- /dev/null
+++ b/android/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,4 @@
+
+
+ #FFFFFF
+
\ No newline at end of file
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..21f5b38
--- /dev/null
+++ b/android/app/src/main/res/values/strings.xml
@@ -0,0 +1,7 @@
+
+
+ Compagnon Admin
+ Compagnon Admin
+ com.pensionmarama.admin
+ com.pensionmarama.admin
+
diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..be874e5
--- /dev/null
+++ b/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..bd0c4d8
--- /dev/null
+++ b/android/app/src/main/res/xml/file_paths.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java
new file mode 100644
index 0000000..0297327
--- /dev/null
+++ b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java
@@ -0,0 +1,18 @@
+package com.getcapacitor.myapp;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+
+ @Test
+ public void addition_isCorrect() throws Exception {
+ assertEquals(4, 2 + 2);
+ }
+}
diff --git a/android/build.gradle b/android/build.gradle
new file mode 100644
index 0000000..f1b3b0e
--- /dev/null
+++ b/android/build.gradle
@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+
+ repositories {
+ google()
+ mavenCentral()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:8.7.2'
+ classpath 'com.google.gms:google-services:4.4.2'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+apply from: "variables.gradle"
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle
new file mode 100644
index 0000000..9a5fa87
--- /dev/null
+++ b/android/capacitor.settings.gradle
@@ -0,0 +1,3 @@
+// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
+include ':capacitor-android'
+project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
diff --git a/android/gradle.properties b/android/gradle.properties
new file mode 100644
index 0000000..f1ba8dc
--- /dev/null
+++ b/android/gradle.properties
@@ -0,0 +1,25 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+
+# Java version
+org.gradle.java.home=/usr/lib/jvm/temurin-21-jdk-amd64
diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..a4b76b9
Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c1d5e01
--- /dev/null
+++ b/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/android/gradlew b/android/gradlew
new file mode 100755
index 0000000..f5feea6
--- /dev/null
+++ b/android/gradlew
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/android/gradlew.bat b/android/gradlew.bat
new file mode 100644
index 0000000..9d21a21
--- /dev/null
+++ b/android/gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/android/settings.gradle b/android/settings.gradle
new file mode 100644
index 0000000..3b4431d
--- /dev/null
+++ b/android/settings.gradle
@@ -0,0 +1,5 @@
+include ':app'
+include ':capacitor-cordova-android-plugins'
+project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
+
+apply from: 'capacitor.settings.gradle'
\ No newline at end of file
diff --git a/android/variables.gradle b/android/variables.gradle
new file mode 100644
index 0000000..2c8e408
--- /dev/null
+++ b/android/variables.gradle
@@ -0,0 +1,16 @@
+ext {
+ minSdkVersion = 23
+ compileSdkVersion = 35
+ targetSdkVersion = 35
+ androidxActivityVersion = '1.9.2'
+ androidxAppCompatVersion = '1.7.0'
+ androidxCoordinatorLayoutVersion = '1.2.0'
+ androidxCoreVersion = '1.15.0'
+ androidxFragmentVersion = '1.8.4'
+ coreSplashScreenVersion = '1.0.1'
+ androidxWebkitVersion = '1.12.1'
+ junitVersion = '4.13.2'
+ androidxJunitVersion = '1.2.1'
+ androidxEspressoCoreVersion = '3.6.1'
+ cordovaAndroidVersion = '10.1.1'
+}
\ No newline at end of file
diff --git a/app/api/admin/clients/[id]/route.ts b/app/api/admin/clients/[id]/route.ts
deleted file mode 100644
index 0536f4f..0000000
--- a/app/api/admin/clients/[id]/route.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { NextResponse } from "next/server";
-import { updateClient, deleteClient, loadClients } from "@/lib/admin/client-utils";
-import { requireAdminAuth } from "@/lib/admin/auth";
-import { ClientInput } from "@/lib/types/client";
-
-export async function PUT(
- request: Request,
- { params }: { params: Promise<{ id: string }> }
-) {
- if (!requireAdminAuth(request)) {
- return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
- }
-
- try {
- const { id } = await params;
- const body: Partial = await request.json();
- const client = updateClient(id, body);
-
- if (!client) {
- return NextResponse.json(
- { error: "Client non trouvé" },
- { status: 404 }
- );
- }
-
- return NextResponse.json(client);
- } catch (error: any) {
- return NextResponse.json(
- { error: error.message || "Erreur lors de la mise à jour" },
- { status: 400 }
- );
- }
-}
-
-export async function DELETE(
- request: Request,
- { params }: { params: Promise<{ id: string }> }
-) {
- if (!requireAdminAuth(request)) {
- return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
- }
-
- const { id } = await params;
- const deleted = deleteClient(id);
-
- if (!deleted) {
- return NextResponse.json(
- { error: "Client non trouvé" },
- { status: 404 }
- );
- }
-
- return NextResponse.json({ success: true });
-}
-
diff --git a/app/api/admin/clients/route.ts b/app/api/admin/clients/route.ts
deleted file mode 100644
index c2a592c..0000000
--- a/app/api/admin/clients/route.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import { NextResponse } from "next/server";
-import {
- createClient,
- loadClients,
- updateClient,
- deleteClient,
- validateEmail,
-} from "@/lib/admin/client-utils";
-import { requireAdminAuth } from "@/lib/admin/auth";
-import { ClientInput } from "@/lib/types/client";
-
-export async function GET(request: Request) {
- if (!requireAdminAuth(request)) {
- return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
- }
-
- const clients = loadClients();
- return NextResponse.json(clients);
-}
-
-export async function POST(request: Request) {
- if (!requireAdminAuth(request)) {
- return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
- }
-
- try {
- const body: ClientInput = await request.json();
-
- // Validation
- if (!body.email || !validateEmail(body.email)) {
- return NextResponse.json(
- { error: "Email invalide" },
- { status: 400 }
- );
- }
-
- if (!body.bungalowNumber) {
- return NextResponse.json(
- { error: "Numéro de bungalow requis" },
- { status: 400 }
- );
- }
-
- const client = createClient({
- email: body.email,
- bungalowNumber: body.bungalowNumber,
- wifiName: body.wifiName || "Lagon-WiFi",
- wifiPassword: body.wifiPassword || "",
- gerantMessage: body.gerantMessage || "Bienvenue dans notre pension de famille !",
- });
-
- return NextResponse.json(client, { status: 201 });
- } catch (error: any) {
- return NextResponse.json(
- { error: error.message || "Erreur lors de la création du client" },
- { status: 400 }
- );
- }
-}
-
diff --git a/app/api/client/[token]/route.ts b/app/api/client/[token]/route.ts
deleted file mode 100644
index 4bc8360..0000000
--- a/app/api/client/[token]/route.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { NextResponse } from "next/server";
-import { getClientByToken } from "@/lib/admin/client-utils";
-
-export async function GET(
- request: Request,
- { params }: { params: Promise<{ token: string }> }
-) {
- const { token } = await params;
- const client = getClientByToken(token);
-
- if (!client) {
- return NextResponse.json(
- { error: "Token invalide ou expiré" },
- { status: 404 }
- );
- }
-
- // Retourner uniquement les informations nécessaires (sans le token)
- return NextResponse.json({
- bungalowNumber: client.bungalowNumber,
- wifiName: client.wifiName,
- wifiPassword: client.wifiPassword,
- gerantMessage: client.gerantMessage,
- });
-}
-
diff --git a/app/api/excursions/route.ts b/app/api/excursions/route.ts
deleted file mode 100644
index c1b489f..0000000
--- a/app/api/excursions/route.ts
+++ /dev/null
@@ -1,67 +0,0 @@
-import { NextResponse } from "next/server";
-
-export interface Excursion {
- id: string;
- name: string;
- type: "tour-lagon" | "plongee" | "4x4";
- description: string;
- duration: string;
- price: number;
- available: boolean;
-}
-
-const excursions: Excursion[] = [
- {
- id: "1",
- name: "Tour du Lagon de Fakarava",
- type: "tour-lagon",
- description: "Découvrez les merveilles du lagon de Fakarava avec arrêts snorkeling aux raies et requins. Visite des motus et des spots de plongée exceptionnels.",
- duration: "4 heures",
- price: 12000,
- available: true,
- },
- {
- id: "2",
- name: "Plongée à la Passe Sud (Tumakohua)",
- type: "plongee",
- description: "Expérience unique de plongée à la Passe Sud de Fakarava, réputée pour ses raies mantas et sa faune exceptionnelle. Accessible uniquement par bateau.",
- duration: "Journée complète",
- price: 15000,
- available: true,
- },
- {
- id: "3",
- name: "Excursion en vélo vers le Sud",
- type: "4x4",
- description: "Exploration de l'atoll de Fakarava en vélo le long de la route principale. Découvrez les villages et les points de vue sur le lagon.",
- duration: "3 heures",
- price: 8000,
- available: true,
- },
-];
-
-export async function GET() {
- return NextResponse.json(excursions);
-}
-
-export async function POST(request: Request) {
- try {
- const body = await request.json();
- const { excursionId, name, email, phone, date, participants } = body;
-
- // Ici, en production, vous sauvegarderiez la réservation dans une base de données
- // Pour l'instant, on simule juste une réponse de succès
-
- return NextResponse.json({
- success: true,
- message: "Réservation enregistrée avec succès",
- reservationId: `RES-${Date.now()}`,
- });
- } catch (error) {
- return NextResponse.json(
- { success: false, message: "Erreur lors de la réservation" },
- { status: 400 }
- );
- }
-}
-
diff --git a/app/api/infos/route.ts b/app/api/infos/route.ts
deleted file mode 100644
index bbfe439..0000000
--- a/app/api/infos/route.ts
+++ /dev/null
@@ -1,191 +0,0 @@
-import { NextResponse } from "next/server";
-
-export interface FAQItem {
- id: string;
- question: string;
- answer: string;
- category?: string;
- icon?: string;
-}
-
-export interface LexiqueItem {
- id: string;
- mot: string;
- traduction: string;
- description: string;
-}
-
-const faq: FAQItem[] = [
- // Pension - Informations générales
- {
- id: "pension-1",
- question: "Heures de Check-out",
- answer: "Le check-out se fait avant 11h00. Merci de libérer votre bungalow à l'heure prévue pour permettre la préparation pour les prochains clients.",
- category: "Pension",
- icon: "🏠",
- },
- {
- id: "pension-2",
- question: "Petit-déjeuner",
- answer: "Le petit-déjeuner est servi de 7h30 à 9h30 dans la salle commune. Il comprend des fruits frais, du pain, des confitures locales et des boissons chaudes.",
- category: "Pension",
- icon: "🍽️",
- },
-
- // 💰 Argent, Banque & Paiement
- {
- id: "argent-1",
- question: "Où trouver un distributeur ?",
- answer: "Un seul distributeur automatique de billets (DAB) est disponible à Fakarava. Il est situé à l'entrée du Bureau de Poste (OPT) dans le village de Rotoava.",
- category: "💰 Argent, Banque & Paiement",
- icon: "💰",
- },
- {
- id: "argent-2",
- question: "Faut-il prévoir du liquide ?",
- answer: "OUI, le liquide (XPF) est ESSENTIEL. De nombreux snacks, petites pensions et activités n'acceptent pas la carte bancaire. Prévoyez de retirer assez à Tahiti ou Papeete avant d'arriver, ou dès votre arrivée à Rotoava.",
- category: "💰 Argent, Banque & Paiement",
- icon: "💰",
- },
- {
- id: "argent-3",
- question: "Les cartes bancaires sont-elles acceptées ?",
- answer: "Les hôtels, les grands prestataires de plongée et les magasins principaux acceptent la carte. Les petites roulottes et certains taxis exigent du liquide.",
- category: "💰 Argent, Banque & Paiement",
- icon: "💰",
- },
-
- // 🌐 Communications & Internet
- {
- id: "internet-1",
- question: "Comment avoir du Wifi ?",
- answer: "Le Wifi est disponible exclusivement à la pension. Le code est accessible sur la page d'accueil de cette application (onglet Accueil). Attention : le débit est plus lent que sur les grandes îles.",
- category: "🌐 Communications & Internet",
- icon: "🌐",
- },
- {
- id: "internet-2",
- question: "Où acheter une carte SIM ?",
- answer: "Vous pouvez acheter une carte SIM locale (Vini ou Vodafone) au Bureau de Poste (OPT) de Rotoava, si vous souhaitez avoir la 4G sur l'atoll (coûteux).",
- category: "🌐 Communications & Internet",
- icon: "🌐",
- },
- {
- id: "internet-3",
- question: "Y a-t-il une couverture mobile ?",
- answer: "La couverture 4G est bonne et stable uniquement dans la zone de Rotoava (au Nord) et sur la route principale. Elle est quasi inexistante vers le Sud de l'atoll.",
- category: "🌐 Communications & Internet",
- icon: "🌐",
- },
-
- // 🚲 Transport & Déplacements
- {
- id: "transport-1",
- question: "Quel est le meilleur moyen de se déplacer ?",
- answer: "Le vélo est le moyen de transport standard et le plus agréable. Le Nord de l'atoll (Rotoava) est plat et idéal pour le vélo.",
- category: "🚲 Transport & Déplacements",
- icon: "🚲",
- },
- {
- id: "transport-2",
- question: "Comment aller à la Passe Sud (Tumakohua) ?",
- answer: "La Passe Sud est à environ 60 km et est accessible uniquement par bateau. Les excursions sont organisées par les prestataires de plongée. Il est impossible d'y aller en voiture ou vélo depuis le Nord.",
- category: "🚲 Transport & Déplacements",
- icon: "🚲",
- },
- {
- id: "transport-3",
- question: "Où louer un vélo ou un scooter ?",
- answer: "Des vélos sont disponibles à la location directement à la pension. Contactez le gérant pour plus d'informations.",
- category: "🚲 Transport & Déplacements",
- icon: "🚲",
- },
-
- // 🩹 Santé & Urgences
- {
- id: "sante-1",
- question: "Où trouver un médecin ?",
- answer: "Le dispensaire se trouve dans le village de Rotoava. En cas d'urgence grave, contactez le gérant immédiatement.",
- category: "🩹 Santé & Urgences",
- icon: "🩹",
- },
- {
- id: "sante-2",
- question: "Y a-t-il une pharmacie ?",
- answer: "Il n'y a pas de pharmacie à Fakarava. Seule l'infirmerie du dispensaire dispose d'une petite réserve de médicaments de base.",
- category: "🩹 Santé & Urgences",
- icon: "🩹",
- },
- {
- id: "sante-3",
- question: "Numéros d'urgence",
- answer: "Gérant : Contactez le gérant via l'application ou le numéro fourni à l'arrivée. Dispensaire : Situé à Rotoava. SAMU : 15. Police : 17.",
- category: "🩹 Santé & Urgences",
- icon: "🩹",
- },
-
- // 🌿 Consignes Éco-Lagon
- {
- id: "eco-1",
- question: "Comment protéger le lagon ?",
- answer: "Fakarava est une Réserve de Biosphère UNESCO ! Nous vous demandons de ne jamais toucher les coraux (morts ou vivants), de ne pas nourrir les poissons, et de toujours emporter vos déchets avec vous.",
- category: "🌿 Consignes Éco-Lagon",
- icon: "🌿",
- },
- {
- id: "eco-2",
- question: "Consommation d'eau",
- answer: "L'eau potable est précieuse ici. Merci de limiter la durée de vos douches et de toujours fermer les robinets après usage.",
- category: "🌿 Consignes Éco-Lagon",
- icon: "🌿",
- },
-];
-
-const lexique: LexiqueItem[] = [
- {
- id: "1",
- mot: "Ia Ora Na",
- traduction: "Bonjour / Salut",
- description: "Salutation traditionnelle tahitienne utilisée pour dire bonjour.",
- },
- {
- id: "2",
- mot: "Mauruuru",
- traduction: "Merci",
- description: "Expression de gratitude en tahitien.",
- },
- {
- id: "3",
- mot: "Maeva",
- traduction: "Bienvenue",
- description: "Mot utilisé pour souhaiter la bienvenue aux visiteurs.",
- },
- {
- id: "4",
- mot: "Aita",
- traduction: "Non",
- description: "Négation en tahitien.",
- },
- {
- id: "5",
- mot: "E",
- traduction: "Oui",
- description: "Affirmation en tahitien.",
- },
-];
-
-export async function GET(request: Request) {
- const { searchParams } = new URL(request.url);
- const type = searchParams.get("type");
-
- if (type === "faq") {
- return NextResponse.json(faq);
- }
-
- if (type === "lexique") {
- return NextResponse.json(lexique);
- }
-
- return NextResponse.json({ faq, lexique });
-}
-
diff --git a/app/api/notifications/route.ts b/app/api/notifications/route.ts
deleted file mode 100644
index 38e1c6f..0000000
--- a/app/api/notifications/route.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-import { NextResponse } from "next/server";
-
-export interface Notification {
- id: string;
- title: string;
- message: string;
- type: "whale" | "weather" | "excursion" | "info";
- timestamp: string;
- read: boolean;
-}
-
-// Notifications stockées (en production, utiliser une base de données)
-let notifications: Notification[] = [
- {
- id: "1",
- title: "Observation de baleines",
- message: "Les baleines ont été vues au nord de l'île ce matin !",
- type: "whale",
- timestamp: new Date().toISOString(),
- read: false,
- },
-];
-
-export async function GET() {
- return NextResponse.json(notifications);
-}
-
-export async function POST(request: Request) {
- try {
- const body = await request.json();
- const { title, message, type } = body;
-
- const notification: Notification = {
- id: `notif-${Date.now()}`,
- title,
- message,
- type: type || "info",
- timestamp: new Date().toISOString(),
- read: false,
- };
-
- notifications.unshift(notification);
-
- // Limiter à 50 notifications
- if (notifications.length > 50) {
- notifications = notifications.slice(0, 50);
- }
-
- return NextResponse.json({ success: true, notification });
- } catch (error) {
- return NextResponse.json(
- { success: false, message: "Erreur lors de la création de la notification" },
- { status: 400 }
- );
- }
-}
-
-export async function PATCH(request: Request) {
- try {
- const body = await request.json();
- const { id, read } = body;
-
- const notification = notifications.find((n) => n.id === id);
- if (notification) {
- notification.read = read;
- }
-
- return NextResponse.json({ success: true });
- } catch (error) {
- return NextResponse.json(
- { success: false, message: "Erreur lors de la mise à jour" },
- { status: 400 }
- );
- }
-}
-
diff --git a/app/api/places/route.ts b/app/api/places/route.ts
deleted file mode 100644
index 3b6dd89..0000000
--- a/app/api/places/route.ts
+++ /dev/null
@@ -1,85 +0,0 @@
-import { NextResponse } from "next/server";
-import { FAKARAVA_SPOTS } from "@/lib/data/fakarava-spots";
-
-export interface Place {
- id: string;
- name: string;
- category: string;
- description: string;
- image: string;
- location: {
- lat: number;
- lng: number;
- address: string;
- };
- type?: string;
- keywords?: string[];
- contact?: string;
- gmapLink?: string;
- conseil?: string;
- horaires?: string;
-}
-
-// Coordonnées approximatives de Fakarava (Rotoava)
-const FAKARAVA_CENTER = {
- lat: -16.3167,
- lng: -145.6167,
-};
-
-// Convertir les spots de Fakarava en format Place
-const convertFakaravaSpots = (): Place[] => {
- return FAKARAVA_SPOTS.map((spot, index) => {
- // Mapper la catégorie "Restauration" vers "restaurants"
- const categoryMap: Record = {
- "Restauration": "restaurants",
- "Plages": "plages",
- "Epiceries": "epiceries",
- "Activités": "activites",
- };
-
- // Déterminer l'image par défaut selon la catégorie
- const getDefaultImage = (category: string) => {
- if (category === "plages") return "/placeholder-beach.jpg";
- if (category === "epiceries") return "/placeholder-store.jpg";
- return "/placeholder-restaurant.jpg";
- };
-
- return {
- id: `fakarava-${index + 1}`,
- name: spot.name,
- category: categoryMap[spot.category] || spot.category.toLowerCase(),
- type: spot.type,
- description: spot.description,
- keywords: spot.keywords,
- contact: spot.contact,
- conseil: spot.conseil,
- horaires: spot.horaires,
- image: getDefaultImage(categoryMap[spot.category] || spot.category.toLowerCase()),
- location: {
- // Coordonnées approximatives basées sur le PK
- lat: FAKARAVA_CENTER.lat + (index * 0.01),
- lng: FAKARAVA_CENTER.lng + (index * 0.01),
- address: spot.location,
- },
- gmapLink: spot.gmapLink,
- };
- });
-};
-
-const places: Place[] = [
- ...convertFakaravaSpots(),
- // Ajoutez ici d'autres lieux spécifiques à Fakarava
-];
-
-export async function GET(request: Request) {
- const { searchParams } = new URL(request.url);
- const category = searchParams.get("category");
-
- let filteredPlaces = places;
- if (category && category !== "all") {
- filteredPlaces = places.filter((place) => place.category === category);
- }
-
- return NextResponse.json(filteredPlaces);
-}
-
diff --git a/app/api/sun-times/route.ts b/app/api/sun-times/route.ts
deleted file mode 100644
index f2e9b59..0000000
--- a/app/api/sun-times/route.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { NextResponse } from "next/server";
-
-export interface SunTimes {
- date: string;
- sunrise: string;
- sunset: string;
-}
-
-// Calcul approximatif du lever/coucher du soleil pour Fakarava
-// Coordonnées de Fakarava (Rotoava) : -16.3167, -145.6167
-// En production, utiliser une API comme https://sunrise-sunset.org/api
-const calculateSunTimes = (date: Date, lat: number = -16.3167, lng: number = -145.6167): SunTimes => {
- // Calcul simplifié (formule approximative)
- const dayOfYear = Math.floor((date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000);
- const declination = 23.45 * Math.sin((360 * (284 + dayOfYear) / 365) * Math.PI / 180);
- const hourAngle = Math.acos(-Math.tan(lat * Math.PI / 180) * Math.tan(declination * Math.PI / 180)) * 180 / Math.PI;
-
- const sunriseHour = 12 - hourAngle / 15 - (lng / 15);
- const sunsetHour = 12 + hourAngle / 15 - (lng / 15);
-
- const formatTime = (hour: number) => {
- const h = Math.floor(hour);
- const m = Math.floor((hour - h) * 60);
- return `${h.toString().padStart(2, "0")}:${m.toString().padStart(2, "0")}`;
- };
-
- return {
- date: date.toISOString().split("T")[0],
- sunrise: formatTime(sunriseHour),
- sunset: formatTime(sunsetHour),
- };
-};
-
-export async function GET() {
- const today = new Date();
- const sunTimes = calculateSunTimes(today);
-
- return NextResponse.json(sunTimes);
-}
-
diff --git a/app/api/tides/route.ts b/app/api/tides/route.ts
deleted file mode 100644
index 7dd2c04..0000000
--- a/app/api/tides/route.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { NextResponse } from "next/server";
-
-export interface TideData {
- date: string;
- highTide: { time: string; height: number };
- lowTide: { time: string; height: number };
-}
-
-// Données de marées pour les 7 prochains jours
-// En production, utiliser une API réelle comme https://www.tide-forecast.com/api
-const generateTideData = (): TideData[] => {
- const tides: TideData[] = [];
- const today = new Date();
-
- for (let i = 0; i < 7; i++) {
- const date = new Date(today);
- date.setDate(today.getDate() + i);
-
- // Simulation de données de marées (à remplacer par une vraie API)
- const dayOffset = i;
- const highTideHour = (6 + dayOffset * 0.8) % 24;
- const lowTideHour = (12 + dayOffset * 0.8) % 24;
-
- tides.push({
- date: date.toISOString().split("T")[0],
- highTide: {
- time: `${Math.floor(highTideHour).toString().padStart(2, "0")}:${Math.floor((highTideHour % 1) * 60).toString().padStart(2, "0")}`,
- height: 1.2 + Math.random() * 0.3,
- },
- lowTide: {
- time: `${Math.floor(lowTideHour).toString().padStart(2, "0")}:${Math.floor((lowTideHour % 1) * 60).toString().padStart(2, "0")}`,
- height: 0.3 + Math.random() * 0.2,
- },
- });
- }
-
- return tides;
-};
-
-export async function GET() {
- const tides = generateTideData();
- return NextResponse.json(tides);
-}
-
diff --git a/capacitor.config.ts b/capacitor.config.ts
index 08b07a2..28dcbe1 100644
--- a/capacitor.config.ts
+++ b/capacitor.config.ts
@@ -1,24 +1,9 @@
-import { CapacitorConfig } from '@capacitor/cli';
+import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'com.pensionmarama.admin',
appName: 'Compagnon Admin',
- webDir: 'out',
- server: {
- androidScheme: 'https',
- // Pour le développement, vous pouvez utiliser localhost
- // url: 'http://localhost:3000',
- // cleartext: true
- },
- android: {
- buildOptions: {
- keystorePath: undefined,
- keystorePassword: undefined,
- keystoreAlias: undefined,
- keystoreAliasPassword: undefined
- }
- }
+ webDir: 'out'
};
export default config;
-
diff --git a/components/explorer/PlaceCard.tsx b/components/explorer/PlaceCard.tsx
index 1cfc4c0..43cf08f 100644
--- a/components/explorer/PlaceCard.tsx
+++ b/components/explorer/PlaceCard.tsx
@@ -3,7 +3,7 @@
import { MapPin, ExternalLink } from "lucide-react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
-import { Place } from "@/app/api/places/route";
+import { Place } from "@/lib/types/place";
interface PlaceCardProps {
place: Place;
diff --git a/components/explorer/PlaceList.tsx b/components/explorer/PlaceList.tsx
index 8c5eee6..1395c36 100644
--- a/components/explorer/PlaceList.tsx
+++ b/components/explorer/PlaceList.tsx
@@ -2,7 +2,7 @@
import { useEffect, useState } from "react";
import PlaceCard from "./PlaceCard";
-import { Place } from "@/app/api/places/route";
+import { Place } from "@/lib/types/place";
interface PlaceListProps {
category: string;
diff --git a/components/infos/FAQAccordion.tsx b/components/infos/FAQAccordion.tsx
index 2b1dd41..bc0bb38 100644
--- a/components/infos/FAQAccordion.tsx
+++ b/components/infos/FAQAccordion.tsx
@@ -7,7 +7,7 @@ import {
AccordionTrigger,
AccordionContent,
} from "@/components/ui/accordion";
-import { FAQItem } from "@/app/api/infos/route";
+import { FAQItem } from "@/lib/types/infos";
export default function FAQAccordion() {
const [faqItems, setFaqItems] = useState([]);
diff --git a/components/infos/LexiqueSection.tsx b/components/infos/LexiqueSection.tsx
index 511cbb2..539b9cd 100644
--- a/components/infos/LexiqueSection.tsx
+++ b/components/infos/LexiqueSection.tsx
@@ -2,7 +2,7 @@
import { useEffect, useState } from "react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
-import { LexiqueItem } from "@/app/api/infos/route";
+import { LexiqueItem } from "@/lib/types/infos";
export default function LexiqueSection() {
const [lexiqueItems, setLexiqueItems] = useState([]);
diff --git a/components/mana-tracker/ExcursionBooking.tsx b/components/mana-tracker/ExcursionBooking.tsx
index 4c5e8a4..1fe0d6e 100644
--- a/components/mana-tracker/ExcursionBooking.tsx
+++ b/components/mana-tracker/ExcursionBooking.tsx
@@ -4,7 +4,7 @@ import { useState, useEffect } from "react";
import { Calendar, Users, CheckCircle } from "lucide-react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
-import { Excursion } from "@/app/api/excursions/route";
+import { Excursion } from "@/lib/types/excursions";
export default function ExcursionBooking() {
const [excursions, setExcursions] = useState([]);
diff --git a/components/mana-tracker/PushNotificationManager.tsx b/components/mana-tracker/PushNotificationManager.tsx
index 4002512..7239737 100644
--- a/components/mana-tracker/PushNotificationManager.tsx
+++ b/components/mana-tracker/PushNotificationManager.tsx
@@ -4,7 +4,7 @@ import { useEffect, useState } from "react";
import { Bell, BellOff, X } from "lucide-react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
import { Button } from "@/components/ui/button";
-import { Notification } from "@/app/api/notifications/route";
+import { Notification } from "@/lib/types/notifications";
export default function PushNotificationManager() {
const [notifications, setNotifications] = useState([]);
diff --git a/components/mana-tracker/SunTimesWidget.tsx b/components/mana-tracker/SunTimesWidget.tsx
index 5cf0a87..aed0164 100644
--- a/components/mana-tracker/SunTimesWidget.tsx
+++ b/components/mana-tracker/SunTimesWidget.tsx
@@ -3,7 +3,7 @@
import { useEffect, useState } from "react";
import { Sun, Sunrise, Sunset } from "lucide-react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
-import { SunTimes } from "@/app/api/sun-times/route";
+import { SunTimes } from "@/lib/types/sun-times";
export default function SunTimesWidget() {
const [sunTimes, setSunTimes] = useState(null);
diff --git a/components/mana-tracker/TideWidget.tsx b/components/mana-tracker/TideWidget.tsx
index 2d84507..771221a 100644
--- a/components/mana-tracker/TideWidget.tsx
+++ b/components/mana-tracker/TideWidget.tsx
@@ -3,7 +3,7 @@
import { useEffect, useState } from "react";
import { Waves, TrendingUp, TrendingDown } from "lucide-react";
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card";
-import { TideData } from "@/app/api/tides/route";
+import { TideData } from "@/lib/types/tides";
export default function TideWidget() {
const [tides, setTides] = useState([]);
diff --git a/dist/compagnon-admin-debug.apk b/dist/compagnon-admin-debug.apk
new file mode 100644
index 0000000..37bcd35
Binary files /dev/null and b/dist/compagnon-admin-debug.apk differ
diff --git a/lib/types/excursions.ts b/lib/types/excursions.ts
new file mode 100644
index 0000000..ea0e481
--- /dev/null
+++ b/lib/types/excursions.ts
@@ -0,0 +1,10 @@
+export interface Excursion {
+ id: string;
+ name: string;
+ type: "tour-lagon" | "plongee" | "4x4";
+ description: string;
+ duration: string;
+ price: number;
+ available: boolean;
+}
+
diff --git a/lib/types/infos.ts b/lib/types/infos.ts
new file mode 100644
index 0000000..c0242cd
--- /dev/null
+++ b/lib/types/infos.ts
@@ -0,0 +1,15 @@
+export interface FAQItem {
+ id: string;
+ question: string;
+ answer: string;
+ category?: string;
+ icon?: string;
+}
+
+export interface LexiqueItem {
+ id: string;
+ mot: string;
+ traduction: string;
+ description: string;
+}
+
diff --git a/lib/types/notifications.ts b/lib/types/notifications.ts
new file mode 100644
index 0000000..596683a
--- /dev/null
+++ b/lib/types/notifications.ts
@@ -0,0 +1,9 @@
+export interface Notification {
+ id: string;
+ title: string;
+ message: string;
+ type: "whale" | "weather" | "excursion" | "info";
+ timestamp: string;
+ read: boolean;
+}
+
diff --git a/lib/types/place.ts b/lib/types/place.ts
new file mode 100644
index 0000000..2a3d9c8
--- /dev/null
+++ b/lib/types/place.ts
@@ -0,0 +1,19 @@
+export interface Place {
+ id: string;
+ name: string;
+ category: string;
+ description: string;
+ image: string;
+ location: {
+ lat: number;
+ lng: number;
+ address: string;
+ };
+ type?: string;
+ keywords?: string[];
+ contact?: string;
+ gmapLink?: string;
+ conseil?: string;
+ horaires?: string;
+}
+
diff --git a/lib/types/sun-times.ts b/lib/types/sun-times.ts
new file mode 100644
index 0000000..0c5bbab
--- /dev/null
+++ b/lib/types/sun-times.ts
@@ -0,0 +1,6 @@
+export interface SunTimes {
+ date: string;
+ sunrise: string;
+ sunset: string;
+}
+
diff --git a/lib/types/tides.ts b/lib/types/tides.ts
new file mode 100644
index 0000000..d653aaa
--- /dev/null
+++ b/lib/types/tides.ts
@@ -0,0 +1,6 @@
+export interface TideData {
+ date: string;
+ highTide: { time: string; height: number };
+ lowTide: { time: string; height: number };
+}
+
diff --git a/next.config.export.js b/next.config.export.js
new file mode 100644
index 0000000..302c998
--- /dev/null
+++ b/next.config.export.js
@@ -0,0 +1,19 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+ swcMinify: true,
+ output: "export",
+ compress: true,
+ poweredByHeader: false,
+ images: {
+ formats: ["image/avif", "image/webp"],
+ minimumCacheTTL: 60,
+ unoptimized: true,
+ },
+ experimental: {
+ optimizePackageImports: ["lucide-react"],
+ },
+};
+
+module.exports = nextConfig;
+
diff --git a/next.config.js b/next.config.js
index acc6704..302c998 100644
--- a/next.config.js
+++ b/next.config.js
@@ -2,12 +2,13 @@
const nextConfig = {
reactStrictMode: true,
swcMinify: true,
- output: "standalone",
+ output: "export",
compress: true,
poweredByHeader: false,
images: {
formats: ["image/avif", "image/webp"],
minimumCacheTTL: 60,
+ unoptimized: true,
},
experimental: {
optimizePackageImports: ["lucide-react"],
diff --git a/next.config.js.backup b/next.config.js.backup
new file mode 100644
index 0000000..acc6704
--- /dev/null
+++ b/next.config.js.backup
@@ -0,0 +1,18 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ reactStrictMode: true,
+ swcMinify: true,
+ output: "standalone",
+ compress: true,
+ poweredByHeader: false,
+ images: {
+ formats: ["image/avif", "image/webp"],
+ minimumCacheTTL: 60,
+ },
+ experimental: {
+ optimizePackageImports: ["lucide-react"],
+ },
+};
+
+module.exports = nextConfig;
+
diff --git a/scripts/build-apk.sh b/scripts/build-apk.sh
index cb76275..b48e726 100755
--- a/scripts/build-apk.sh
+++ b/scripts/build-apk.sh
@@ -26,13 +26,20 @@ docker compose -f docker-compose.build.yml run --rm android-builder bash -c "
set -e
cd /app
+ echo '📦 Vérification du volume node_modules...'
+ df -h /app/node_modules
+ ls -la /app/node_modules | head -5
+
echo '📦 Installation des dépendances Node.js...'
npm install --include=dev
- echo '📦 Vérification des dépendances critiques...'
- if ! npm list tailwindcss >/dev/null 2>&1; then
- echo '⚠️ tailwindcss non trouvé, réinstallation...'
- npm install tailwindcss postcss autoprefixer --save-dev
+ echo '📦 Vérification après installation...'
+ ls -la /app/node_modules/tailwindcss 2>&1 | head -3 || echo '❌ tailwindcss toujours absent'
+ npm list tailwindcss 2>&1 | head -3 || echo '❌ tailwindcss non listé'
+
+ if [ ! -d "/app/node_modules/tailwindcss" ]; then
+ echo '⚠️ tailwindcss manquant, installation forcée...'
+ npm install tailwindcss postcss autoprefixer --save-dev --force
fi
echo '📦 Installation des dépendances Capacitor...'
@@ -41,20 +48,42 @@ docker compose -f docker-compose.build.yml run --rm android-builder bash -c "
echo '🧹 Nettoyage du cache Next.js...'
rm -rf .next
- echo '⚙️ Sauvegarde de la configuration Next.js...'
- cp next.config.js next.config.js.backup
-
echo '⚙️ Configuration Next.js pour export statique...'
- if grep -q '\"output\": \"standalone\"' next.config.js; then
+ if [ -f next.config.export.js ]; then
+ cp next.config.export.js next.config.js
+ echo '✅ Configuration d export utilisée'
+ else
+ cp next.config.js next.config.js.backup
sed -i 's/\"output\": \"standalone\"/\"output\": \"export\"/' next.config.js
+ sed -i '/images:/a\ unoptimized: true,' next.config.js
echo '✅ Configuration modifiée pour export statique'
fi
+ echo '⚙️ Exclusion temporaire des routes API...'
+ if [ -d app/api ]; then
+ mv app/api /tmp/api-backup-$$ 2>/dev/null || mv app/api ../api-backup-$$
+ echo '✅ Routes API déplacées temporairement'
+ fi
+
echo '🏗️ Build de production Next.js...'
npm run build || npm run build -- --no-lint
+ echo '⚙️ Restauration des routes API...'
+ if [ -d /tmp/api-backup-$$ ]; then
+ mv /tmp/api-backup-$$ app/api
+ echo '✅ Routes API restaurées'
+ elif [ -d ../api-backup-$$ ]; then
+ mv ../api-backup-$$ app/api
+ echo '✅ Routes API restaurées'
+ fi
+
+ echo '⚙️ Vérification du dossier out...'
+ ls -la out/ 2>&1 | head -10 || echo '⚠️ Dossier out non trouvé'
+
echo '⚙️ Restauration de la configuration Next.js...'
- mv next.config.js.backup next.config.js
+ if [ -f next.config.js.backup ]; then
+ mv next.config.js.backup next.config.js
+ fi
echo '⚙️ Initialisation Capacitor (si nécessaire)...'
if [ ! -f capacitor.config.ts ]; then