Browse Source

versao cod 7 name 1.6

Gustavo Mantovani 1 week ago
parent
commit
c6c18f63ee

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

@@ -13,8 +13,8 @@ android {
         applicationId "br.com.diarista.client"
         minSdkVersion rootProject.ext.minSdkVersion
         targetSdkVersion rootProject.ext.targetSdkVersion
-        versionCode 6
-        versionName "1.5"
+        versionCode 7
+        versionName "1.6"
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         aaptOptions {
              // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.

+ 7 - 15
src/components/dashboard/DashboardProvidersClose.vue

@@ -42,7 +42,7 @@
                   </div>
                   <div class="row items-center">
                     <q-icon name="mdi-map-marker-outline" color="text" size="16px" />
-                    <span class="text-provider-close-jobs font9 fontmedium">{{ (p.distance_km ?? '--') + ' km' }}</span>
+                    <span class="text-provider-close-jobs font9 fontmedium">{{ formatDistance(p.distance_km) }}</span>
                   </div>
                 </div>
               </div>
@@ -89,8 +89,6 @@ const periodTypeMap = ref({
   8: 'daily_price_8h',
 });
 
-
-// eslint-disable-next-line no-unused-vars
 const formatDistance = (distance) => {
   if (distance === null || distance === undefined || distance === '') return '—';
 
@@ -101,18 +99,12 @@ const formatDistance = (distance) => {
 };
 
 const showCorrectValues = (p) => {
-  switch (currentPeriodType.value) {
-    case 8:
-      return p.daily_price_8h ? formatCurrency(p.daily_price_8h) : t('dashboard_client.providers_close.no_price');
-    case 6:
-      return p.daily_price_6h ? formatCurrency(p.daily_price_6h) : t('dashboard_client.providers_close.no_price');
-    case 4:
-      return p.daily_price_4h ? formatCurrency(p.daily_price_4h) : t('dashboard_client.providers_close.no_price');
-    case 2:
-      return p.daily_price_2h ? formatCurrency(p.daily_price_2h) : t('dashboard_client.providers_close.no_price');
-    default:
-      return t('dashboard_client.providers_close.no_price');
-  }
+  const priceKey = periodTypeMap.value[currentPeriodType.value];
+  const price = priceKey ? p[priceKey] : null;
+
+  return price !== null && price !== undefined
+    ? formatCurrency(price)
+    : t('dashboard_client.providers_close.no_price');
 };
 
 const showCorrectLabels = () => {

+ 7 - 8
src/components/dashboard/DashboardScrollAreaSchedules.vue

@@ -1,5 +1,5 @@
 <template>
-  <section class="promo-scroll-wrapper q-ma-md">
+  <section class="promo-scroll-wrapper q-mx-md q-mb-md">
     <div class="promo-scroll">
       <div
         v-for="card in cards"
@@ -29,16 +29,16 @@ const cards = [
 
 <style scoped lang="scss">
 .promo-scroll-wrapper {
-  width: 100%;
   overflow: hidden;
 }
 
 .promo-scroll {
   display: flex;
+  align-items: flex-start;
   gap: 12px;
   overflow-x: auto;
   overscroll-behavior-x: contain;
-  padding: 0 0 4px 16px;
+  padding-bottom: 4px;
   scroll-snap-type: x mandatory;
 
   &::-webkit-scrollbar {
@@ -47,23 +47,22 @@ const cards = [
 
   &::after {
     content: '';
-    flex: 0 0 16px;
+    flex: 0 0 1px;
   }
 }
 
 .promo-card {
-  height: 120px;
+  flex: 0 0 calc(100% - 44px);
+  min-width: 0;
   border-radius: 10px;
   overflow: hidden;
   scroll-snap-align: start;
   background: #e8e4f5;
-  flex-shrink: 0;
 }
 
 .promo-card__img {
   width: 100%;
-  height: 100%;
-  object-fit: cover;
+  height: auto;
   display: block;
   border-radius: 10px;
 }

+ 43 - 14
src/pages/LoginPage.vue

@@ -112,10 +112,18 @@
 </template>
 
 <script setup>
-import { createUserAndClient, sendCode, validateCode } from "src/api/user";
+import {
+  createUserAndClient,
+  sendCode,
+  updateMe,
+  validateCode,
+} from "src/api/user";
 import { useAuth } from "src/composables/useAuth";
 import { useRegistrationFlowStore } from "src/stores/registrationFlow";
+import { userStore } from "src/stores/user";
+import { useQuasar } from "quasar";
 import { onMounted, ref } from "vue";
+import { useI18n } from "vue-i18n";
 import { useRouter } from "vue-router";
 
 import BackgroundLogin from "src/assets/background-login.svg";
@@ -131,6 +139,8 @@ import LoginStep4Panel from "src/components/login/LoginStep4Panel.vue";
 
 const { setAuthDataFromPayload } = useAuth();
 const flowStore = useRegistrationFlowStore();
+const $q = useQuasar();
+const { t } = useI18n();
 const router = useRouter();
 
 const clicked = ref(false);
@@ -223,18 +233,14 @@ const onSubmit = async () => {
 };
 
 const registerUserAndClient = async () => {
-  const payload = new FormData();
+  const payload = {};
 
   const append = (key, value) => {
     if (value === null || value === undefined || value === "") {
       return;
     }
 
-    if (typeof value === "boolean") {
-      payload.append(key, value ? "1" : "0");
-    } else {
-      payload.append(key, value);
-    }
+    payload[key] = value;
   };
 
   Object.entries(stepThreeForm.value).forEach(([key, value]) => {
@@ -249,22 +255,45 @@ const registerUserAndClient = async () => {
     append(key, value);
   });
 
-  append("avatar", stepAvatarForm.value.avatar);
   append("code", code.value);
   append("email", email.value);
   append("has_complement", !stepThreeForm.value.no_complement);
   append("phone", phone.value);
 
-  const response = await createUserAndClient(payload);
+  try {
+    const response = await createUserAndClient(payload);
 
-  if (response.status === 200) {
-    await setAuthDataFromPayload(response.data.payload);
-    router.push({ name: "DashboardPage" });
-  } else {
-    console.error("Failed to create user and client");
+    if (response.status >= 200 && response.status < 300) {
+      await setAuthDataFromPayload(response.data.payload);
+
+      if (stepAvatarForm.value.avatar) {
+        const user = await updateMe({
+          avatar_base64: await fileToBase64(stepAvatarForm.value.avatar),
+        });
+
+        userStore().setUser(user);
+      }
+
+      router.push({ name: "DashboardPage" });
+    }
+  } catch (error) {
+    console.error("Failed to create user and client", error);
+
+    $q.notify({
+      type: "negative",
+      message: t("auth.register_error"),
+    });
   }
 };
 
+const fileToBase64 = (file) =>
+  new Promise((resolve, reject) => {
+    const reader = new FileReader();
+    reader.onload = () => resolve(reader.result);
+    reader.onerror = () => reject(reader.error);
+    reader.readAsDataURL(file);
+  });
+
 const sendValidationCode = async () => {
   const response = await sendCode(email.value, phone.value);
 

+ 7 - 6
src/pages/agenda/CalendarPage.vue

@@ -1,10 +1,13 @@
 <template>
   <q-page class="bg-page q-pb-xl">
-    <div class="calendar-header row items-center bg-white">
+    <div class="calendar-header row items-center q-px-md q-pt-md q-pb-sm bg-white">
       <q-btn flat round dense icon="mdi-chevron-left" color="primary" @click="router.back()" />
-      <q-space />
-      <span class="font16 fontbold gradient-diarista">{{ $t('dashboard_client.agenda.title') }}</span>
-      <q-space />
+
+      <div class="col text-center font16 fontbold gradient-diarista text-primary">
+        {{ $t('dashboard_client.agenda.title') }}
+      </div>
+
+      <div style="width: 36px" />
     </div>
 
     <template v-if="loading">
@@ -339,8 +342,6 @@ onMounted(async () => {
 
 <style scoped lang="scss">
 .calendar-header {
-  padding-top: 12px;
-  padding-bottom: 12px;
   box-shadow: 0px 1px 8px rgba(0, 0, 0, 0.08);
 }
 

+ 2 - 2
src/pages/schedule-cart/ScheduleCartPage.vue

@@ -386,7 +386,7 @@ const getStandardPixItemTotal = (item) => getTotalWithFee(item, platformFees.val
 const getTotalWithFee = (item, fee) => {
   if (!isValidFee(fee)) return null;
 
-  return roundMoney(Number(item.total_amount ?? 0) * (1 + Number(fee)));
+  return roundMoney(Number(item.base_amount ?? 0) * (1 + Number(fee)));
 };
 
 const isValidFee = (fee) => fee !== null && fee !== undefined && Number.isFinite(Number(fee));
@@ -439,7 +439,7 @@ const submitCart = async () => {
       period_type:  item.period_type,
       start_time:   item.start_time,
       end_time:     item.end_time,
-      total_amount: item.total_amount,
+      total_amount: item.base_amount,
       offers_meal:  item.offers_meal,
     })),
   };

+ 1 - 1
src/pages/search/components/OrderSummaryDialog.vue

@@ -380,7 +380,7 @@ const submitOrder = async () => {
     period_type:   b.serviceType.hoursCount,
     start_time:    formatHour(b.slot.startHour),
     end_time:      formatHour(b.slot.endHour),
-    total_amount:  b.serviceType.price,
+    total_amount:  b.serviceType.basePrice ?? b.serviceType.price,
     offers_meal:   b.meal === 'offer' ? true : b.meal === 'no_offer' ? false : null,
   }));
 

+ 1 - 1
src/pages/search/components/SchedulingDialog.vue

@@ -502,7 +502,7 @@ const onDateSelected = (val) => {
           provider_id:   prov.provider_id,
           provider_name: prov.provider_name,
           start_time:    formatHour(booking.slot.startHour),
-          total_amount:  booking.serviceType.price,
+          base_amount:   booking.serviceType.basePrice ?? booking.serviceType.price,
         });
 
         $q.notify({ message: t('schedule_cart.add_success'), type: 'positive' });

+ 4 - 0
src/pages/search/components/ServiceSelectionSheet.vue

@@ -105,6 +105,7 @@ const availableServiceTypes = computed(() =>
       hoursCount:  8,
       key:         'integral',
       label:       t('scheduling_page.service_types.integral.label'),
+      basePrice:   props.provider?.daily_price_8h_base ?? props.provider?.daily_price_8h ?? null,
       price:       props.provider?.daily_price_8h ?? null,
     },
     {
@@ -113,6 +114,7 @@ const availableServiceTypes = computed(() =>
       hoursCount:  6,
       key:         'padrao',
       label:       t('scheduling_page.service_types.padrao.label'),
+      basePrice:   props.provider?.daily_price_6h_base ?? props.provider?.daily_price_6h ?? null,
       price:       props.provider?.daily_price_6h ?? null,
     },
     {
@@ -121,6 +123,7 @@ const availableServiceTypes = computed(() =>
       hoursCount:  4,
       key:         'meio_periodo',
       label:       t('scheduling_page.service_types.meio_periodo.label'),
+      basePrice:   props.provider?.daily_price_4h_base ?? props.provider?.daily_price_4h ?? null,
       price:       props.provider?.daily_price_4h ?? null,
     },
     {
@@ -129,6 +132,7 @@ const availableServiceTypes = computed(() =>
       hoursCount:  2,
       key:         'diaria_rapida',
       label:       t('scheduling_page.service_types.diaria_rapida.label'),
+      basePrice:   props.provider?.daily_price_2h_base ?? props.provider?.daily_price_2h ?? null,
       price:       props.provider?.daily_price_2h ?? null,
     },
   ].filter(type => hasValidSlots(type.hoursCount))