diff --git a/angular/src/app/app.module.ts b/angular/src/app/app.module.ts index e8fd102..23db932 100644 --- a/angular/src/app/app.module.ts +++ b/angular/src/app/app.module.ts @@ -118,4 +118,4 @@ import { DirectivesModule } from './directives/directives.module'; ], bootstrap: [AppComponent], }) -export class AppModule { } +export class AppModule {} diff --git a/angular/src/app/directives/download-app.directive.ts b/angular/src/app/directives/download-app.directive.ts index 18f7b1d..410f49f 100644 --- a/angular/src/app/directives/download-app.directive.ts +++ b/angular/src/app/directives/download-app.directive.ts @@ -7,57 +7,27 @@ import { } from '@angular/core'; import { MessageService } from 'primeng/api'; -import { getTypeDevice, pwaInstalled } from 'src/app/utils'; +import { AppComponent } from '../app.component'; @Directive({ selector: '[appDownloadApp]', }) export class DownloadAppDirective implements OnInit { - public deviceType: 'ios' | 'android' | null = null; - public deferredPrompt: any; - constructor( private messageService: MessageService, public renderer: Renderer2, - private el: ElementRef, - ) { } + private el: ElementRef + ) {} ngOnInit(): void { - getTypeDevice(); - if (this.deviceType === 'ios') { - this.el.nativeElement.style.display = 'block'; - } - this.checkInstalled(); - } - - async checkInstalled(): Promise { - if (window.matchMedia('(display-mode: standalone)').matches - || await pwaInstalled()) { + if (AppComponent.pwaInstalled) { this.el.nativeElement.style.display = 'none'; } } - @HostListener('window:beforeinstallprompt', ['$event']) - onBeforeInstallPrompt(e: any) { - e.preventDefault(); - this.deferredPrompt = e; - if (this.deferredPrompt) { - this.el.nativeElement.style.display = 'block'; - } - } - - @HostListener('window:appinstalled', ['$event']) - onAppInstalled(e: any) { - // Prevent Chrome 67 and earlier from automatically showing the prompt - e.preventDefault(); - // Stash the event so it can be triggered later. - this.deferredPrompt = e; - this.el.nativeElement.style.display = 'none'; - } - @HostListener('click', ['$event']) async downloadApp(event: MouseEvent) { - if (!this.deferredPrompt) { + if (!AppComponent.pwaPrompt) { this.messageService.clear(); this.messageService.add({ severity: 'error', @@ -65,8 +35,8 @@ export class DownloadAppDirective implements OnInit { }); return; } - this.deferredPrompt.prompt(); - this.deferredPrompt.userChoice.then((res: any) => { + AppComponent.pwaPrompt.prompt(); + AppComponent.pwaPrompt.userChoice.then((res: any) => { if (res.outcome === 'accepted') { this.messageService.clear(); this.messageService.add({ @@ -74,8 +44,7 @@ export class DownloadAppDirective implements OnInit { summary: 'Спасибо за установку!', }); } - this.deferredPrompt = null; + AppComponent.pwaPrompt = null; }); } - } diff --git a/angular/src/app/pages/guest-card/guest-card.component.scss b/angular/src/app/pages/guest-card/guest-card.component.scss index 7d3683e..84d20b6 100644 --- a/angular/src/app/pages/guest-card/guest-card.component.scss +++ b/angular/src/app/pages/guest-card/guest-card.component.scss @@ -75,6 +75,7 @@ font-size: 16px; line-height: 19px; letter-spacing: -0.5px; + color: var(--text-color); } .price, diff --git a/angular/src/app/pipes/safe-html.pipe.ts b/angular/src/app/pipes/safe-html.pipe.ts new file mode 100644 index 0000000..22c69b8 --- /dev/null +++ b/angular/src/app/pipes/safe-html.pipe.ts @@ -0,0 +1,13 @@ +import { Pipe, PipeTransform } from '@angular/core'; +import { DomSanitizer } from '@angular/platform-browser'; + +@Pipe({ + name: 'safeHtml', +}) +export class SafeHtmlPipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) {} + + transform(html: string) { + return this.sanitizer.bypassSecurityTrustHtml(html); + } +} diff --git a/angular/src/app/presentation-options/default-option/components/footer/footer.component.scss b/angular/src/app/presentation-options/default-option/components/footer/footer.component.scss index e94eb82..4aeb7c4 100644 --- a/angular/src/app/presentation-options/default-option/components/footer/footer.component.scss +++ b/angular/src/app/presentation-options/default-option/components/footer/footer.component.scss @@ -14,7 +14,7 @@ line-height: 20px; text-align: center; letter-spacing: -0.24px; - color: #6a737c; + color: var(--text-color_1); } .phone-number { font-style: normal; @@ -23,7 +23,7 @@ line-height: 22px; text-align: center; letter-spacing: -0.408px; - color: #d9d9d9; + color: var(--text-color); text-decoration: none; } } diff --git a/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.html b/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.html index 7410862..6dfe208 100644 --- a/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.html +++ b/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.html @@ -1,23 +1,19 @@ -

Ваш предыдущий заказ

-

Дата: - {{(lastOrder?.transactionCreateDate | date:'dd.MM.yyyyг.') || 'Данные не найдены'}} - - - -

-

На сумму: - {{lastOrder?.orderSum ? lastOrder?.orderSum + ' ₽' : 'Данные не найдены'}} - - - -

+ +

Ваш предыдущий заказ

+

Дата: + {{lastOrder!.last_purchase_date}} +

+

На сумму: + {{lastOrder?.last_purchase_sum}}₽ +

+
+ +

+ Покупок за последние пол года не было +

+
- diff --git a/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.scss b/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.scss index d63ac59..ea93ee0 100644 --- a/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.scss +++ b/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.scss @@ -1,51 +1,53 @@ :host { - padding: 24px 16px 0px; + padding: 24px 16px 0px; - & > h2 { - font-style: normal; - font-weight: 700; - font-size: 15px; - line-height: 20px; - letter-spacing: -0.24px; - } - - & > .info-order { - font-style: normal; - font-weight: 400; - font-size: 12px; - line-height: 16px; - span { - color: var(--text-color_1); + & > .info-order { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + h2 { + font-style: normal; + font-weight: 700; + font-size: 15px; + line-height: 20px; + letter-spacing: -0.24px; + } + span { + color: var(--text-color_1); + } + .flex { + display: flex; + align-items: center; + flex-direction: row; + gap: 8px; + } + .info { + font-size: 14px; + } } - .flex { - display: flex; - align-items: center; - flex-direction: row; - gap: 8px; + + .evaluate-order { + margin: 24px 0; + width: 100%; + padding: 12px; + text-align: center; + border: 2px solid var(--button-color); + border-radius: 6px; + font-style: normal; + font-weight: 700; + font-size: 17px; + line-height: 22px; + letter-spacing: -0.408px; + background-color: transparent; + color: var(--button-color); } - } - .evaluate-order { - margin: 24px 0; - width: 100%; - padding: 12px; - text-align: center; - border: 2px solid var(--button-color); - border-radius: 6px; - font-style: normal; - font-weight: 700; - font-size: 17px; - line-height: 22px; - letter-spacing: -0.408px; - background-color: transparent; - color: var(--button-color); - } - - .info { - font-style: normal; - font-weight: 400; - font-size: 12px; - line-height: 16px; - color: var(--text-color_1); - } + .info { + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; + color: var(--text-color_1); + } } diff --git a/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.ts b/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.ts index ab3963c..498ac89 100644 --- a/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.ts +++ b/angular/src/app/presentation-options/default-option/components/last-order/last-order.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { Purchase } from 'src/app/interface/data'; +import { LastPurchase } from 'src/app/interface/data'; @Component({ selector: 'app-last-order[lastOrder]', @@ -7,12 +7,11 @@ import { Purchase } from 'src/app/interface/data'; styleUrls: ['./last-order.component.scss'] }) export class LastOrderComponent implements OnInit { - @Input() lastOrder?: Purchase; + @Input() lastOrder?: LastPurchase; @Input() loading!: boolean; constructor() { } ngOnInit(): void { } - } diff --git a/angular/src/app/presentation-options/default-option/components/navbar/menu_item.component.scss b/angular/src/app/presentation-options/default-option/components/navbar/menu_item.component.scss index e061452..86ec5d4 100644 --- a/angular/src/app/presentation-options/default-option/components/navbar/menu_item.component.scss +++ b/angular/src/app/presentation-options/default-option/components/navbar/menu_item.component.scss @@ -4,7 +4,7 @@ align-items: center; padding: 10px; cursor: pointer; - transition: background-color 0.1s; + transition: background-color 0.1s; &:hover { background-color: var(--main-color_hover); diff --git a/angular/src/app/presentation-options/default-option/components/social-media-buttons/social-media-buttons.component.scss b/angular/src/app/presentation-options/default-option/components/social-media-buttons/social-media-buttons.component.scss index 109b400..100fc51 100644 --- a/angular/src/app/presentation-options/default-option/components/social-media-buttons/social-media-buttons.component.scss +++ b/angular/src/app/presentation-options/default-option/components/social-media-buttons/social-media-buttons.component.scss @@ -7,7 +7,7 @@ width: 48px; height: 48px; border-radius: 100%; - background: var(--button-color); + background: var(--main-color_2); display: flex; align-items: center; justify-content: center; diff --git a/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.html b/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.html index 88bb56c..9850f25 100644 --- a/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.html +++ b/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.html @@ -1,105 +1,105 @@ -
- -

- Ваш текущий уровень {{ authService.userInfo?.customer_level }}, - поэтому вам начисляется {{ authService.currentLvlPeriod.percent }}% от суммы покупки. -

-

- Смена уровня произойдет в начале следующего квартала, - {{ authService.purchaseData.currentPeriod[1] - .locale("ru") - .format("DD.MM.YY") }}. -

-
- -

- Начисление Бонусных баллов происходит по дифференцированной шкале в - зависимости от уровня: -

+
+ +

+ Ваш текущий уровень {{ authService.userInfo?.current_level_and_cashback?.current_level ?? '--' }}, + поэтому вам начисляется {{ authService.currentLvlPeriod.percent }}% от суммы покупки. +

+

+ Смена уровня произойдет в начале следующего квартала, + {{ authService.currentPeriod[1] + .locale("ru") + .format("DD.MM.YY") }}. +

+
+ +

+ Начисление Бонусных баллов происходит по дифференцированной шкале в + зависимости от уровня: +

+ + + +
    + Уровень {{ index + 1 }} +
  • + Сумма покупок за прошлый квартал {{ item.start }}-{{ item.end }} + руб. +
  • +
  • Начисляемый бонус {{ item.percent }}% от суммы покупки
  • +
+
+
+ +
    + Уровень {{ index + 1 }} +
  • Сумма покупок за прошлый квартал — от {{ item.start }} руб.
  • +
  • Начисляемый бонус, в % от суммы покупки - {{ item.percent }}%
  • +
+
+
+
+ + +

+ Участник может использовать Бонусы для «оплаты» до 100% стоимости любой + покупки. +

+

+ Списание Бонусов происходит из расчета 1:1 (один Бонус дает скидку 1 + российский рубль / 1 тенге / 1 белорусский рубль. Скидка, предоставляемая + Участнику при списании Бонусов, уменьшает цену товаров в заказе в + соответствии с условиями ПЛ. +

+

+ Для списания Бонусов Участник должен попросить об этом в кофе-баре сети + «COFFEE LIKE» кассира до момента пробития фискального чека, после чего им + будет проверена возможность списания Бонусов. +

+

+ Для всех Участников возможно списание без использования мобильного + приложения. +

+

Полученные Бонусы не подлежат обмену на денежные средства.

+
+ +

+ Начисленные на счет бонусы сгорают по прошествии 90 дней с момента + совершения последней покупки с начислением или списанием бонусов. +

- -
    - Уровень {{ index + 1 }} -
  • - Сумма покупок за прошлый квартал {{ item.start }}-{{ item.end }} - руб. -
  • -
  • Начисляемый бонус {{ item.percent }}% от суммы покупки
  • + Возврат покупки, за которую бонусы были начислены: +
  • + В случае, если бонусов на счету достаточно для списания, бонусы + списываются в полном ранее начисленном за возвращаемый товар объеме. +
  • +
  • + В случае, если бонусов на счету недостаточно, формируется минусовой + баланс. +
-
-
- +
    - Уровень {{ index + 1 }} -
  • Сумма покупок за прошлый квартал — от {{ item.start }} руб.
  • -
  • Начисляемый бонус, в % от суммы покупки - {{ item.percent }}%
  • + Возврат покупки, которая была оплачена бонусами: +
  • + В случае предъявления Участником кассового или товарного чека, сумма + бонусов, списанная для оплаты возвращаемого товара, зачисляется на счет + участника. +
  • +
  • + В случае возврата товара с применением оплаты бонусами, клиенту + возвращается денежная сумма в размере, внесенном Участником в оплату + товара при покупке, за вычетом суммы, оплаченной бонусами. +
-
-
-
+ - -

- Участник может использовать Бонусы для «оплаты» до 100% стоимости любой - покупки. -

-

- Списание Бонусов происходит из расчета 1:1 (один Бонус дает скидку 1 - российский рубль / 1 тенге / 1 белорусский рубль. Скидка, предоставляемая - Участнику при списании Бонусов, уменьшает цену товаров в заказе в - соответствии с условиями ПЛ. -

-

- Для списания Бонусов Участник должен попросить об этом в кофе-баре сети - «COFFEE LIKE» кассира до момента пробития фискального чека, после чего им - будет проверена возможность списания Бонусов. -

-

- Для всех Участников возможно списание без использования мобильного - приложения. -

-

Полученные Бонусы не подлежат обмену на денежные средства.

-
- -

- Начисленные на счет бонусы сгорают по прошествии 90 дней с момента - совершения последней покупки с начислением или списанием бонусов. -

+
-
    - Возврат покупки, за которую бонусы были начислены: -
  • - В случае, если бонусов на счету достаточно для списания, бонусы - списываются в полном ранее начисленном за возвращаемый товар объеме. -
  • -
  • - В случае, если бонусов на счету недостаточно, формируется минусовой - баланс. -
  • -
- -
    - Возврат покупки, которая была оплачена бонусами: -
  • - В случае предъявления Участником кассового или товарного чека, сумма - бонусов, списанная для оплаты возвращаемого товара, зачисляется на счет - участника. -
  • -
  • - В случае возврата товара с применением оплаты бонусами, клиенту - возвращается денежная сумма в размере, внесенном Участником в оплату - товара при покупке, за вычетом суммы, оплаченной бонусами. -
  • -
-
- -
- - +
diff --git a/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.scss b/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.scss index d5a5c6d..531bfda 100644 --- a/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.scss +++ b/angular/src/app/presentation-options/default-option/pages/loyality-program/loyality-program.component.scss @@ -1,3 +1,4 @@ .loyality-program { - + max-width: 600px; + margin: 0 auto; } diff --git a/angular/src/app/utils.ts b/angular/src/app/utils.ts index 84080be..46fd5ec 100644 --- a/angular/src/app/utils.ts +++ b/angular/src/app/utils.ts @@ -1,4 +1,4 @@ -import { environment } from "src/environments/environment.prod"; +import { environment } from 'src/environments/environment.prod'; export enum DeviceType { ios, @@ -12,7 +12,9 @@ export function getTypeDevice(): DeviceType { } export async function pwaInstalled(): Promise { - if ("getInstalledRelatedApps" in navigator) { + if (window.matchMedia('(display-mode: standalone)').matches) return true; + + if ('getInstalledRelatedApps' in navigator) { const apps = await (window.navigator as any).getInstalledRelatedApps(); for (const app of apps) { if (app.url == environment.manifestUrl) { @@ -22,3 +24,9 @@ export async function pwaInstalled(): Promise { } return false; } + +export function format(s: string, ...args: string[]) { + return s.replace(/{(\d+)}/g, function (match, number) { + return typeof args[number] != 'undefined' ? args[number] : match; + }); +} diff --git a/angular/src/assets/970х250_3.png b/angular/src/assets/970х250_3.png index f523104..b01fb0d 100644 Binary files a/angular/src/assets/970х250_3.png and b/angular/src/assets/970х250_3.png differ diff --git a/angular/src/assets/broken.jpg b/angular/src/assets/broken.jpg new file mode 100644 index 0000000..7f835e5 Binary files /dev/null and b/angular/src/assets/broken.jpg differ diff --git a/angular/src/assets/coffee-like-logo.svg b/angular/src/assets/coffee-like-logo.svg new file mode 100644 index 0000000..77926ac --- /dev/null +++ b/angular/src/assets/coffee-like-logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + +