Bläddra i källkod

feat: :sparkles: feat (config-apk) configuracao para apk/aab

foi configurado e instalado pacotes necessarios para gerar apk/aab

fase:dev | origin:escopo
Gustavo Zanatta 1 vecka sedan
förälder
incheckning
39d73cea39

+ 10 - 0
package-lock.json

@@ -9,6 +9,7 @@
       "version": "0.0.1",
       "dependencies": {
         "@bufbuild/protobuf": "^2.5.1",
+        "@capacitor/browser": "^8.0.3",
         "@capacitor/device": "^7.0.1",
         "@capacitor/geolocation": "^8.2.0",
         "@capacitor/google-maps": "^8.0.1",
@@ -314,6 +315,15 @@
         "typescript": "5.4.5"
       }
     },
+    "node_modules/@capacitor/browser": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/@capacitor/browser/-/browser-8.0.3.tgz",
+      "integrity": "sha512-WJWPHEPbweiFoHYmVlCbZf5yrqJ2Rchx2Xvbmd+3Lf+Zkpq3nXBThThY2CF69lYEg1NINGF9BcHThIOEU1gZlQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": ">=8.0.0"
+      }
+    },
     "node_modules/@capacitor/cli": {
       "version": "8.3.3",
       "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-8.3.3.tgz",

+ 1 - 0
package.json

@@ -23,6 +23,7 @@
   },
   "dependencies": {
     "@bufbuild/protobuf": "^2.5.1",
+    "@capacitor/browser": "^8.0.3",
     "@capacitor/device": "^7.0.1",
     "@capacitor/geolocation": "^8.2.0",
     "@capacitor/google-maps": "^8.0.1",

+ 3 - 3
src-capacitor/android/.gitignore

@@ -53,9 +53,9 @@ captures/
 .idea/navEditor.xml
 
 # Keystore files
-# Uncomment the following lines if you do not want to check your keystore files in.
-#*.jks
-#*.keystore
+*.jks
+*.keystore
+keystore.properties
 
 # External native build folder generated in Android Studio 2.2 and later
 .externalNativeBuild

+ 21 - 2
src-capacitor/android/app/build.gradle

@@ -1,5 +1,11 @@
 apply plugin: 'com.android.application'
 
+def keystorePropertiesFile = rootProject.file("keystore.properties")
+def keystoreProperties = new Properties()
+if (keystorePropertiesFile.exists()) {
+    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
+}
+
 android {
     namespace "br.com.diarista.client"
     compileSdk rootProject.ext.compileSdkVersion
@@ -15,11 +21,24 @@ android {
              // 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:!*~'
         }
+        resValue "string", "maps_api_key", (keystoreProperties['googleMapsApiKey'] ?: "")
+    }
+    signingConfigs {
+        release {
+            if (keystorePropertiesFile.exists()) {
+                storeFile file(keystoreProperties['storeFile'])
+                storePassword keystoreProperties['storePassword']
+                keyAlias keystoreProperties['keyAlias']
+                keyPassword keystoreProperties['keyPassword']
+            }
+        }
     }
     buildTypes {
         release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.release
+            minifyEnabled true
+            shrinkResources true
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
     }
 }

+ 3 - 0
src-capacitor/android/app/capacitor.build.gradle

@@ -10,7 +10,10 @@ android {
 apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
 dependencies {
     implementation project(':capacitor-app')
+    implementation project(':capacitor-browser')
     implementation project(':capacitor-device')
+    implementation project(':capacitor-geolocation')
+    implementation project(':capacitor-google-maps')
     implementation project(':capacitor-keyboard')
     implementation project(':capacitor-preferences')
     implementation project(':capacitor-push-notifications')

+ 19 - 0
src-capacitor/android/app/google-services.json

@@ -23,6 +23,25 @@
           "other_platform_oauth_client": []
         }
       }
+    },
+    {
+      "client_info": {
+        "mobilesdk_app_id": "1:616416880897:android:37c1d70a33d27018185300",
+        "android_client_info": {
+          "package_name": "br.com.diarista.provider"
+        }
+      },
+      "oauth_client": [],
+      "api_key": [
+        {
+          "current_key": "AIzaSyDOTWcQQe5iSzOM7ezrQoPBSpj8146uSIo"
+        }
+      ],
+      "services": {
+        "appinvite_service": {
+          "other_platform_oauth_client": []
+        }
+      }
     }
   ],
   "configuration_version": "1"

+ 52 - 21
src-capacitor/android/app/proguard-rules.pro

@@ -1,21 +1,52 @@
-# 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
+# Capacitor core
+-keep class com.getcapacitor.** { *; }
+-keep @com.getcapacitor.annotation.CapacitorPlugin class * { *; }
+-keep @com.getcapacitor.annotation.Permission class * { *; }
+-keepclassmembers class * extends com.getcapacitor.Plugin {
+    @com.getcapacitor.annotation.CapacitorPlugin <methods>;
+    @com.getcapacitor.PluginMethod <methods>;
+}
+
+# JavaScript Interface (WebView <-> Java bridge)
+-keepclassmembers class * {
+    @android.webkit.JavascriptInterface <methods>;
+}
+
+# WebView
+-keepclassmembers class * extends android.webkit.WebViewClient {
+    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
+    public boolean *(android.webkit.WebView, java.lang.String);
+    public void *(android.webkit.WebView, java.lang.String);
+}
+
+# Firebase
+-keep class com.google.firebase.** { *; }
+-keep class com.google.android.gms.** { *; }
+-dontwarn com.google.firebase.**
+-dontwarn com.google.android.gms.**
+
+# Google Maps
+-keep class com.google.android.libraries.maps.** { *; }
+-dontwarn com.google.android.libraries.maps.**
+
+# OkHttp (Capacitor HTTP plugin)
+-dontwarn okhttp3.**
+-dontwarn okio.**
+-keep class okhttp3.** { *; }
+-keep interface okhttp3.** { *; }
+
+# Kotlin
+-keep class kotlin.** { *; }
+-dontwarn kotlin.**
+-keepclassmembers class **$WhenMappings {
+    <fields>;
+}
+
+# Preserve stack traces in crash reports
+-keepattributes SourceFile,LineNumberTable
+-renamesourcefileattribute SourceFile
+
+# Annotations
+-keepattributes *Annotation*
+-keepattributes Signature
+-keepattributes Exceptions

+ 2 - 3
src-capacitor/android/app/src/main/AndroidManifest.xml

@@ -7,12 +7,11 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
-        android:theme="@style/AppTheme"
-        android:usesCleartextTraffic="true">
+        android:theme="@style/AppTheme">
 
         <meta-data
             android:name="com.google.android.geo.API_KEY"
-            android:value="AIzaSyDrVs7amXuXKEu8sYMr-dl8VjNZbgS2frk"/>
+            android:value="@string/maps_api_key"/>
 
         <activity
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"

+ 2 - 3
src-capacitor/android/app/src/main/res/values/strings.xml

@@ -1,8 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <resources>
-    <string name="app_name">Quasar App</string>
-    <string name="title_activity_main">Quasar App</string>
+    <string name="app_name">Diarista Cliente</string>
+    <string name="title_activity_main">Diarista Cliente</string>
     <string name="package_name">br.com.diarista.client</string>
     <string name="custom_url_scheme">br.com.diarista.client</string>
-    <string name="maps_api_key">google_maps_api_key</string>
 </resources>

+ 9 - 0
src-capacitor/android/capacitor.settings.gradle

@@ -5,6 +5,9 @@ project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/
 include ':capacitor-app'
 project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')
 
+include ':capacitor-browser'
+project(':capacitor-browser').projectDir = new File('../node_modules/@capacitor/browser/android')
+
 include ':capacitor-device'
 project(':capacitor-device').projectDir = new File('../node_modules/@capacitor/device/android')
 
@@ -14,6 +17,12 @@ project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor
 include ':capacitor-preferences'
 project(':capacitor-preferences').projectDir = new File('../node_modules/@capacitor/preferences/android')
 
+include ':capacitor-geolocation'
+project(':capacitor-geolocation').projectDir = new File('../../node_modules/@capacitor/geolocation/android')
+
+include ':capacitor-google-maps'
+project(':capacitor-google-maps').projectDir = new File('../../node_modules/@capacitor/google-maps/android')
+
 include ':capacitor-push-notifications'
 project(':capacitor-push-notifications').projectDir = new File('../node_modules/@capacitor/push-notifications/android')
 

+ 1 - 1
src-capacitor/capacitor.config.json

@@ -1,6 +1,6 @@
 {
   "appId": "br.com.diarista.client",
-  "appName": "Quasar App",
+  "appName": "Diarista Cliente",
   "webDir": "www",
   "plugins": {
     "Keyboard": {

+ 2 - 0
src-capacitor/ios/App/Podfile

@@ -12,9 +12,11 @@ def capacitor_pods
   pod 'Capacitor', :path => '../../node_modules/@capacitor/ios'
   pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios'
   pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app'
+  pod 'CapacitorBrowser', :path => '../../node_modules/@capacitor/browser'
   pod 'CapacitorDevice', :path => '../../node_modules/@capacitor/device'
   pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard'
   pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences'
+  pod 'CapacitorPushNotifications', :path => '../../node_modules/@capacitor/push-notifications'
   pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar'
 end
 

+ 10 - 0
src-capacitor/package-lock.json

@@ -10,6 +10,7 @@
       "dependencies": {
         "@capacitor/android": "^7.2.0",
         "@capacitor/app": "^7.0.0",
+        "@capacitor/browser": "^8.0.3",
         "@capacitor/cli": "^7.0.0",
         "@capacitor/core": "^7.0.0",
         "@capacitor/device": "^7.0.1",
@@ -37,6 +38,15 @@
         "@capacitor/core": ">=7.0.0"
       }
     },
+    "node_modules/@capacitor/browser": {
+      "version": "8.0.3",
+      "resolved": "https://registry.npmjs.org/@capacitor/browser/-/browser-8.0.3.tgz",
+      "integrity": "sha512-WJWPHEPbweiFoHYmVlCbZf5yrqJ2Rchx2Xvbmd+3Lf+Zkpq3nXBThThY2CF69lYEg1NINGF9BcHThIOEU1gZlQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "@capacitor/core": ">=8.0.0"
+      }
+    },
     "node_modules/@capacitor/cli": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@capacitor/cli/-/cli-7.2.0.tgz",

+ 5 - 2
src-capacitor/package.json

@@ -7,13 +7,16 @@
   "dependencies": {
     "@capacitor/android": "^7.2.0",
     "@capacitor/app": "^7.0.0",
-    "@capacitor/cli": "^7.0.0",
+    "@capacitor/browser": "^8.0.3",
+    "@capacitor/cli": "^8.3.3",
     "@capacitor/core": "^7.0.0",
     "@capacitor/device": "^7.0.1",
     "@capacitor/ios": "^7.2.0",
     "@capacitor/keyboard": "^7.0.1",
     "@capacitor/preferences": "^7.0.1",
-    "@capacitor/push-notifications": "^7.0.6",
+    "@capacitor/geolocation": "^8.2.0",
+    "@capacitor/google-maps": "^8.0.1",
+    "@capacitor/push-notifications": "^8.1.1",
     "@capacitor/status-bar": "^7.0.1"
   }
 }

+ 0 - 10
src/api/user.js

@@ -46,16 +46,6 @@ export const createUserAndClient = async (data) => {
 }
 
 export const updateMe = async (data) => {
-  if (data.avatar instanceof File) {
-    const form = new FormData();
-    form.append('_method', 'PUT');
-    Object.entries(data).forEach(([key, val]) => {
-      if (val !== null && val !== undefined) form.append(key, val);
-    });
-    const { data: res } = await api.post('/me', form);
-    return res.payload;
-  }
-
   const { data: res } = await api.put('/me', data);
   return res.payload;
 };

+ 8 - 0
src/i18n/locales/en.json

@@ -652,6 +652,14 @@
       "suggestion_payment": "How does payment work?",
       "suggestion_human": "Talk to a human"
     },
+    "privacy_policy": {
+      "title": "Privacy Policy",
+      "description": "How we handle your data"
+    },
+    "support_page": {
+      "title": "Support Center",
+      "description": "Usage guide and tutorials"
+    },
     "logout": {
       "title": "Logout",
       "description": "Disconnect from your account"

+ 8 - 0
src/i18n/locales/es.json

@@ -648,6 +648,14 @@
       "suggestion_payment": "¿Cómo funciona el pago?",
       "suggestion_human": "Hablar con un humano"
     },
+    "privacy_policy": {
+      "title": "Política de Privacidad",
+      "description": "Cómo tratamos tus datos"
+    },
+    "support_page": {
+      "title": "Centro de Soporte",
+      "description": "Guía de uso y tutoriales"
+    },
     "logout": {
       "title": "Cerrar sesión",
       "description": "Desconectar de tu cuenta"

+ 8 - 0
src/i18n/locales/pt.json

@@ -660,6 +660,14 @@
       "empty_sub": "Você pode bloquear diaristas que não deseja visualizar mais nas buscas.",
       "unblock_btn": "desbloquear"
     },
+    "privacy_policy": {
+      "title": "Política de Privacidade",
+      "description": "Como tratamos seus dados"
+    },
+    "support_page": {
+      "title": "Central de Suporte",
+      "description": "Guia de uso e tutoriais"
+    },
     "logout": {
       "title": "Sair",
       "description": "Desconectar da sua conta"

+ 30 - 0
src/pages/profile/ProfilePage.vue

@@ -83,6 +83,24 @@
         <q-icon name="mdi-chevron-right" color="primary" size="md" />
       </div>
 
+      <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openPrivacyPolicy">
+        <div class="column">
+          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.privacy_policy.title') }}</span>
+          <span class="menu-description text-text">{{ $t('profile.privacy_policy.description') }}</span>
+        </div>
+        <q-space/>
+        <q-icon name="mdi-chevron-right" color="primary" size="md" />
+      </div>
+
+      <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="openSupportPage">
+        <div class="column">
+          <span class="menu-title gradient-diarista text-weight-bold">{{ $t('profile.support_page.title') }}</span>
+          <span class="menu-description text-text">{{ $t('profile.support_page.description') }}</span>
+        </div>
+        <q-space/>
+        <q-icon name="mdi-chevron-right" color="primary" size="md" />
+      </div>
+
       <q-separator class="q-my-sm bg-grey-3" inset />
 
       <div class="menu-item row items-center no-wrap cursor-pointer q-py-sm" @click="handleLogout">
@@ -100,6 +118,7 @@
 <script setup>
 import { ref, onMounted } from 'vue';
 import { useQuasar } from 'quasar';
+import { Browser } from '@capacitor/browser';
 import { useAuth } from 'src/composables/useAuth';
 import { getUser } from 'src/api/user';
 import { userStore } from 'src/stores/user';
@@ -111,6 +130,9 @@ import ProfileHelpDialog from 'src/components/profile/ProfileHelpDialog.vue';
 import ProfilePrivacyDialog from 'src/components/profile/ProfilePrivacyDialog.vue';
 import { useRouter } from 'vue-router';
 
+const PRIVACY_POLICY_URL = 'https://https://politicas.softpar.inf.br/politicas/politicaDiaristaCliente.html';
+const SUPPORT_PAGE_URL   = 'https://https://politicas.softpar.inf.br/suportes/suporteDiaristaCliente.html';
+
 const $q = useQuasar();
 const store = userStore();
 
@@ -165,6 +187,14 @@ const openPrivacyDialog = () => {
   });
 };
 
+const openPrivacyPolicy = async () => {
+  await Browser.open({ url: PRIVACY_POLICY_URL });
+};
+
+const openSupportPage = async () => {
+  await Browser.open({ url: SUPPORT_PAGE_URL });
+};
+
 const handleLogout = async () => {
   await logout();
   router.push('/login');