Files
vitanovaPackages/dist/fesm2022/marketplaces-payment.mjs.map

1 line
20 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"version":3,"file":"marketplaces-payment.mjs","sources":["../../src/payment.config.ts","../../src/marketplace-context.ts","../../src/payment.gateway.ts","../../src/payment.component.ts","../../src/marketplaces-payment.ts"],"sourcesContent":["import { EnvironmentProviders, InjectionToken, makeEnvironmentProviders } from '@angular/core';\n\nexport interface MarketplacesPaymentConfig {\n /** Central payment service URL. It is not the tenant API URL. */\n apiUrl: string;\n marketplaceDomain?: string | (() => string);\n paymentsPath?: string;\n pollIntervalMs?: number;\n}\nexport const MARKETPLACES_PAYMENT_CONFIG = new InjectionToken<MarketplacesPaymentConfig>('@marketplaces/payment config');\nexport function provideMarketplacesPayment(config: MarketplacesPaymentConfig): EnvironmentProviders {\n return makeEnvironmentProviders([{\n provide: MARKETPLACES_PAYMENT_CONFIG,\n useValue: {\n ...config,\n apiUrl: config.apiUrl.replace(/\\/$/, ''),\n paymentsPath: config.paymentsPath ?? '/api/v1/payments',\n pollIntervalMs: config.pollIntervalMs ?? 1500,\n },\n }]);\n}\n","import { HttpHeaders } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { MARKETPLACES_PAYMENT_CONFIG } from './payment.config';\n\nexport const MARKETPLACE_DOMAIN_HEADER = 'X-Marketplace-Domain';\nexport function normalizeMarketplaceDomain(domain: string): string {\n return domain.trim().toLowerCase().replace(/\\.$/, '');\n}\n@Injectable({ providedIn: 'root' })\nexport class PaymentMarketplaceContext {\n private readonly config = inject(MARKETPLACES_PAYMENT_CONFIG);\n domain(): string {\n const configured = this.config.marketplaceDomain;\n const domain = typeof configured === 'function' ? configured() : configured ?? (typeof location === 'undefined' ? '' : location.hostname);\n return normalizeMarketplaceDomain(domain);\n }\n headers(): HttpHeaders {\n const domain = this.domain();\n if (!domain) throw new Error('Marketplace domain cannot be resolved');\n return new HttpHeaders({ [MARKETPLACE_DOMAIN_HEADER]: domain });\n }\n}\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable, catchError, throwError } from 'rxjs';\nimport { PaymentMarketplaceContext } from './marketplace-context';\nimport { MARKETPLACES_PAYMENT_CONFIG } from './payment.config';\nimport { PaymentAttempt, PaymentFailure, PaymentMethod, PaymentRequest } from './payment.models';\n\nexport interface MarketplacesPaymentGateway {\n create(method: PaymentMethod, request: PaymentRequest): Observable<PaymentAttempt>;\n status(paymentId: string, method: PaymentMethod): Observable<PaymentAttempt>;\n cancel(paymentId: string): Observable<void>;\n}\nexport const MARKETPLACES_PAYMENT_GATEWAY = new InjectionToken<MarketplacesPaymentGateway>(\n '@marketplaces/payment gateway', { providedIn: 'root', factory: () => inject(HttpMarketplacesPaymentGateway) }\n);\n@Injectable({ providedIn: 'root' })\nexport class HttpMarketplacesPaymentGateway implements MarketplacesPaymentGateway {\n private readonly http = inject(HttpClient);\n private readonly config = inject(MARKETPLACES_PAYMENT_CONFIG);\n private readonly context = inject(PaymentMarketplaceContext);\n create(method: PaymentMethod, request: PaymentRequest): Observable<PaymentAttempt> {\n return this.http.post<PaymentAttempt>(this.baseUrl(), { ...request, method }, { headers: this.context.headers() }).pipe(this.handle(method));\n }\n status(paymentId: string, method: PaymentMethod): Observable<PaymentAttempt> {\n return this.http.get<PaymentAttempt>(`${this.baseUrl()}/${encodeURIComponent(paymentId)}`, { headers: this.context.headers() }).pipe(this.handle(method));\n }\n cancel(paymentId: string): Observable<void> {\n return this.http.post<void>(`${this.baseUrl()}/${encodeURIComponent(paymentId)}/cancel`, {}, { headers: this.context.headers() });\n }\n private baseUrl(): string {\n const path = this.config.paymentsPath ?? '';\n return `${this.config.apiUrl}${path.startsWith('/') ? path : `/${path}`}`;\n }\n private handle<T>(method: PaymentMethod) {\n return (source: Observable<T>) => source.pipe(catchError(cause => {\n const response = cause instanceof HttpErrorResponse ? cause : null;\n const failure: PaymentFailure = {\n method, code: response?.status === 402 ? 'declined' : 'backend',\n message: response?.error?.message || response?.message || 'Payment failed', cause,\n };\n return throwError(() => failure);\n }));\n }\n}\n","import { Component, DestroyRef, booleanAttribute, inject, input, output, signal } from '@angular/core';\nimport * as QRCode from 'qrcode';\nimport { Subscription, switchMap, timer } from 'rxjs';\nimport { MARKETPLACES_PAYMENT_CONFIG } from './payment.config';\nimport { MARKETPLACES_PAYMENT_GATEWAY } from './payment.gateway';\nimport { PaymentAttempt, PaymentFailure, PaymentMethod, PaymentRequest, PaymentResult } from './payment.models';\n\n@Component({\n selector: 'mp-payment, marketplaces-payment',\n standalone: true,\n template: `\n <section class=\"mp-payment\" aria-labelledby=\"mp-payment-title\">\n <h2 id=\"mp-payment-title\">{{ title() }}</h2>\n <div class=\"methods\">\n @if (qr()) { <button type=\"button\" (click)=\"pay('qr')\" [disabled]=\"busy()\">QR</button> }\n @if (card()) { <button type=\"button\" (click)=\"pay('card')\" [disabled]=\"busy()\">Карта</button> }\n @if (sbp()) { <button type=\"button\" (click)=\"pay('sbp')\" [disabled]=\"busy()\">СБП</button> }\n @if (yandexPay()) { <button type=\"button\" (click)=\"pay('yandex-pay')\" [disabled]=\"busy()\">Яндекс Pay</button> }\n </div>\n @if (qrImage()) { <a [href]=\"actionUrl()!\" target=\"_blank\" rel=\"noopener\"><img [src]=\"qrImage()!\" alt=\"QR-код оплаты\" /></a> }\n @if (busy()) { <p role=\"status\">Проверяем оплату…</p> }\n @if (error()) { <p class=\"error\" role=\"alert\">{{ error()!.message }}</p> }\n @if (attempt()) { <button type=\"button\" class=\"cancel\" (click)=\"cancel()\">Отменить</button> }\n </section>\n `,\n styles: [`\n :host{display:block}.mp-payment{font:inherit;color:inherit;display:grid;gap:1rem;max-width:26rem}\n h2,p{margin:0}.methods{display:flex;gap:.6rem;flex-wrap:wrap}button{font:inherit;cursor:pointer;border:1px solid #111;border-radius:.65rem;padding:.75rem 1rem;background:#111;color:#fff}\n button:disabled{opacity:.55;cursor:wait}.cancel{background:transparent;color:inherit;border-color:#c7c7c7}img{display:block;width:min(15rem,100%);height:auto}.error{color:#b42318}\n `],\n})\nexport class MarketplacesPaymentComponent {\n readonly qr = input(false, { transform: booleanAttribute });\n readonly card = input(false, { transform: booleanAttribute });\n readonly sbp = input(false, { transform: booleanAttribute });\n readonly yandexPay = input(false, { transform: booleanAttribute });\n readonly request = input.required<PaymentRequest>();\n readonly title = input('Оплата');\n readonly completed = output<PaymentResult>();\n readonly paymentError = output<PaymentFailure>();\n readonly cancelled = output<void>();\n readonly busy = signal(false);\n readonly error = signal<PaymentFailure | null>(null);\n readonly attempt = signal<PaymentAttempt | null>(null);\n readonly qrImage = signal<string | null>(null);\n readonly actionUrl = signal<string | null>(null);\n private readonly gateway = inject(MARKETPLACES_PAYMENT_GATEWAY);\n private readonly config = inject(MARKETPLACES_PAYMENT_CONFIG);\n private poll?: Subscription;\n\n constructor() { inject(DestroyRef).onDestroy(() => this.poll?.unsubscribe()); }\n pay(method: PaymentMethod): void {\n this.poll?.unsubscribe(); this.error.set(null); this.busy.set(true); this.qrImage.set(null);\n this.gateway.create(method, this.request()).subscribe({\n next: created => void this.handleCreated(created).catch(cause => this.fail(method, cause)),\n error: cause => this.fail(method, cause),\n });\n }\n cancel(): void {\n const current = this.attempt();\n this.poll?.unsubscribe(); this.busy.set(false); this.attempt.set(null);\n if (current) this.gateway.cancel(current.paymentId).subscribe({ error: () => undefined });\n this.cancelled.emit();\n }\n private async handleCreated(created: PaymentAttempt): Promise<void> {\n this.attempt.set(created);\n if (created.action?.url) {\n this.actionUrl.set(created.action.url);\n if (created.action.type === 'qr') this.qrImage.set(await QRCode.toDataURL(created.action.url, { width: 320, margin: 1 }));\n else if (typeof window !== 'undefined' && !window.open(created.action.url, '_blank', 'noopener')) {\n this.fail(created.method, { method: created.method, code: 'popup_blocked', message: 'Браузер заблокировал окно оплаты' });\n return;\n }\n }\n if (created.status === 'paid' || created.status === 'authorized') { this.finish(created); return; }\n if (created.status === 'failed' || created.status === 'expired') { this.fail(created.method, created.failureMessage ?? 'Платёж отклонён'); return; }\n this.poll = timer(0, this.config.pollIntervalMs ?? 1500).pipe(switchMap(() => this.gateway.status(created.paymentId, created.method)))\n .subscribe({ next: status => this.handleStatus(status), error: cause => this.fail(created.method, cause) });\n }\n private handleStatus(current: PaymentAttempt): void {\n this.attempt.set(current);\n if (current.status === 'paid' || current.status === 'authorized') this.finish(current);\n else if (current.status === 'failed' || current.status === 'expired' || current.status === 'cancelled') this.fail(current.method, current.failureMessage ?? 'Платёж не завершён');\n }\n private finish(attempt: PaymentAttempt): void { this.poll?.unsubscribe(); this.busy.set(false); this.attempt.set(null); this.completed.emit(attempt as PaymentResult); }\n private fail(method: PaymentMethod, cause: unknown): void {\n this.poll?.unsubscribe(); this.busy.set(false);\n const failure: PaymentFailure = this.isFailure(cause) ? cause : { method, code: 'backend', message: typeof cause === 'string' ? cause : 'Не удалось провести платёж', cause };\n this.error.set(failure); this.paymentError.emit(failure);\n }\n private isFailure(value: unknown): value is PaymentFailure { return !!value && typeof value === 'object' && 'code' in value && 'message' in value; }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}