barsa-novin-ray-core 2.3.100 → 2.3.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7836,12 +7836,11 @@ class ServiceWorkerNotificationService {
7836
7836
  this.hasRegistration = false;
7837
7837
  this._swPush = inject(SwPush);
7838
7838
  this._portalService = inject(PortalService);
7839
- this._notificationPermissionAllowed = false;
7840
7839
  this.init();
7841
7840
  }
7842
7841
  // بررسی وضعیت فعلی
7843
7842
  get isEnabled() {
7844
- return this._swPush.isEnabled && this.hasRegistration && this._notificationPermissionAllowed;
7843
+ return this._swPush.isEnabled && this.hasRegistration;
7845
7844
  }
7846
7845
  async closeNotifications(tags) {
7847
7846
  const sw = await this.getSw();
@@ -7897,7 +7896,6 @@ class ServiceWorkerNotificationService {
7897
7896
  }
7898
7897
  async init() {
7899
7898
  console.log(`SwPush enabled: ${this._swPush.isEnabled}`);
7900
- this.handlePermission();
7901
7899
  // مدیریت کلیک روی نوتیفیکیشن‌ها
7902
7900
  this._swPush.notificationClicks.subscribe((e) => {
7903
7901
  if (!e.notification.tag) {
@@ -7912,44 +7910,6 @@ class ServiceWorkerNotificationService {
7912
7910
  // بررسی مجوز و ثبت سرویس‌ورکر
7913
7911
  await this.registerServiceWorker();
7914
7912
  }
7915
- handlePermission() {
7916
- if (!navigator?.permissions?.query) {
7917
- return;
7918
- }
7919
- return navigator.permissions
7920
- .query({ name: 'notifications' })
7921
- .then(this.permissionQuery.bind(this))
7922
- .catch(this.permissionError.bind(this));
7923
- }
7924
- permissionQuery(result) {
7925
- let newPrompt;
7926
- if (result.state === 'granted') {
7927
- console.log('notificaiton granted');
7928
- // notifications allowed, go wild
7929
- }
7930
- else if (result.state === 'prompt') {
7931
- // we can ask the user
7932
- console.log('notificaiton prompt');
7933
- newPrompt = Notification.requestPermission();
7934
- }
7935
- else if (result.state === 'denied') {
7936
- // notifications were disabled
7937
- console.log('notificaiton denied');
7938
- this._notificationPermissionAllowed = false;
7939
- }
7940
- result.onchange = () => console.log({ updatedPermission: result });
7941
- return newPrompt || result;
7942
- }
7943
- permissionError(error) {
7944
- this._notificationPermissionAllowed = false;
7945
- console.error(error);
7946
- }
7947
- async requestPermission() {
7948
- if (Notification.permission === 'default') {
7949
- await Notification.requestPermission();
7950
- }
7951
- this._notificationPermissionAllowed = Notification.permission === 'granted';
7952
- }
7953
7913
  async registerServiceWorker() {
7954
7914
  if (!('serviceWorker' in navigator)) {
7955
7915
  return;
@@ -8268,157 +8228,210 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
8268
8228
  args: [{ providedIn: 'root' }]
8269
8229
  }] });
8270
8230
 
8271
- /* eslint-disable */
8272
- //
8273
- function usePushNotification() {
8274
- const swPush = inject(SwPush);
8275
- const http = inject(HttpClient);
8276
- const _localStorage = inject(LocalStorageService);
8277
- // Signals
8278
- const bannerVisible = signal(false);
8279
- const isSubscribed = signal(false);
8280
- const permission = signal(Notification.permission);
8281
- const errorMessage = signal(null);
8282
- // IndexedDB setup
8283
- const dbPromise = openDB('push-db', 1, {
8284
- upgrade(db) {
8285
- db.createObjectStore('subscription');
8286
- }
8287
- });
8288
- // ذخیره subscription در DB
8289
- const saveSubscription = async (sub) => {
8290
- const db = await dbPromise;
8291
- await db.put('subscription', sub.toJSON(), 'push-subscription');
8292
- };
8293
- async function initPushBanner() {
8294
- const saved = await loadSubscription();
8295
- if (saved) {
8296
- isSubscribed.set(true);
8297
- bannerVisible.set(false); // قبلاً subscribe شده
8298
- }
8299
- else {
8300
- isSubscribed.set(false);
8301
- bannerVisible.set(true); // هنوز subscribe نشده، بنر نمایش داده شود
8302
- }
8303
- }
8304
- // خواندن subscription از DB
8305
- const loadSubscription = async () => {
8306
- const db = await dbPromise;
8307
- const data = await db.get('subscription', 'push-subscription');
8308
- if (!data) {
8309
- return null;
8310
- }
8311
- // داده را به سرور می‌فرستیم یا UI نشان می‌دهیم
8312
- return data;
8313
- };
8314
- // حذف subscription از DB
8315
- const deleteSubscription = async () => {
8316
- const db = await dbPromise;
8317
- await db.delete('subscription', 'push-subscription');
8318
- };
8319
- const handleNewSubscription = async (subData) => {
8320
- const saved = await loadSubscription();
8321
- if (!saved || saved.endpoint !== subData.endpoint) {
8322
- // حذف قبلی
8323
- if (saved) {
8324
- try {
8325
- await addSubscriptionToServer(saved);
8231
+ // src/app/services/idb.service.ts
8232
+ class IdbService {
8233
+ constructor() {
8234
+ this.dbPromise = openDB('my-app-db', 1, {
8235
+ upgrade(db) {
8236
+ if (!db.objectStoreNames.contains('subscription')) {
8237
+ db.createObjectStore('subscription');
8326
8238
  }
8327
- catch (e) {
8328
- console.error('Delete old subscription failed', e);
8239
+ if (!db.objectStoreNames.contains('settings')) {
8240
+ db.createObjectStore('settings');
8329
8241
  }
8330
8242
  }
8331
- // ثبت جدید
8332
- try {
8333
- await deleteSubscriptionFromServer(subData);
8334
- await saveSubscription(subData);
8335
- isSubscribed.set(true);
8243
+ });
8244
+ }
8245
+ async get(store, key) {
8246
+ const db = await this.dbPromise;
8247
+ const v = await db.get(store, key);
8248
+ return (v === undefined ? null : v);
8249
+ }
8250
+ async set(store, key, value) {
8251
+ const db = await this.dbPromise;
8252
+ await db.put(store, value, key);
8253
+ }
8254
+ async delete(store, key) {
8255
+ const db = await this.dbPromise;
8256
+ await db.delete(store, key);
8257
+ }
8258
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8259
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, providedIn: 'root' }); }
8260
+ }
8261
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, decorators: [{
8262
+ type: Injectable,
8263
+ args: [{ providedIn: 'root' }]
8264
+ }], ctorParameters: () => [] });
8265
+
8266
+ class PushNotificationService {
8267
+ constructor() {
8268
+ this.swPush = inject(SwPush);
8269
+ this.http = inject(HttpClient);
8270
+ this.idb = inject(IdbService);
8271
+ this.local = inject(LocalStorageService);
8272
+ // یک سیگنال واحد
8273
+ this._push = signal({
8274
+ bannerVisible: false,
8275
+ isSubscribed: false,
8276
+ permission: Notification.permission,
8277
+ errorMessage: null
8278
+ });
8279
+ this.registerServiceWorkerMessageListener = () => {
8280
+ // avoid adding multiple listeners (idempotent)
8281
+ const onMessage = (event) => {
8282
+ const data = event.data;
8283
+ if (!data) {
8284
+ return;
8285
+ }
8286
+ if (data.event === 'subscriptionChanged' && data.subscription) {
8287
+ // run async handler but don't await here
8288
+ (async () => {
8289
+ await this.handleNewSubscription(data.subscription);
8290
+ })().catch(console.error);
8291
+ }
8292
+ };
8293
+ // addEventListener is idempotent-ish but let's guard by setting property
8294
+ // we attach once on navigator.serviceWorker (not to window)
8295
+ navigator.serviceWorker?.addEventListener('message', onMessage);
8296
+ };
8297
+ }
8298
+ get push() {
8299
+ return this._push.asReadonly();
8300
+ }
8301
+ hideBanner() {
8302
+ this.update({ bannerVisible: false });
8303
+ }
8304
+ async setup() {
8305
+ // Load subscription status
8306
+ await this.initPushBanner();
8307
+ // Listen for subscription updates
8308
+ this.swPush.subscription.subscribe((sub) => {
8309
+ this.update({
8310
+ isSubscribed: !!sub,
8311
+ permission: Notification.permission
8312
+ });
8313
+ if (sub) {
8314
+ const json = sub.toJSON?.() ?? sub;
8315
+ this.handleNewSubscription(json);
8336
8316
  }
8337
- catch (e) {
8338
- console.error('Add new subscription failed', e);
8317
+ });
8318
+ // Listen for SW messages
8319
+ navigator.serviceWorker.addEventListener('message', (event) => {
8320
+ if (event.data?.event === 'subscriptionChanged') {
8321
+ this.handleNewSubscription(event.data.subscription);
8339
8322
  }
8340
- }
8341
- };
8342
- const hideBanner = () => bannerVisible.set(false);
8343
- // بررسی وضعیت فعلی subscription از SwPush و DB
8344
- swPush.subscription.subscribe(async (sub) => {
8345
- isSubscribed.set(!!sub);
8346
- permission.set(Notification.permission);
8347
- if (sub) {
8348
- await handleNewSubscription(sub.toJSON());
8349
- }
8350
- });
8351
- const addSubscriptionToServer = async (sub) => {
8352
- const token2 = _localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
8353
- const options = {
8354
- headers: new HttpHeaders({
8355
- 'Content-Type': 'application/json',
8356
- sth: token2
8357
- })
8358
- };
8359
- await lastValueFrom(http.post('/api/pushnotification/add', sub, options));
8360
- };
8361
- const deleteSubscriptionFromServer = async (sub) => {
8362
- const token2 = _localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
8363
- const options = {
8364
- headers: new HttpHeaders({
8365
- 'Content-Type': 'application/json',
8366
- sth: token2
8367
- })
8368
- };
8369
- await lastValueFrom(http.post('/api/pushnotification/delete', sub, options));
8370
- };
8371
- // subscribe فقط داخل gesture
8372
- const subscribe = async () => {
8323
+ });
8324
+ }
8325
+ async subscribe() {
8326
+ this.update({
8327
+ bannerVisible: false
8328
+ });
8373
8329
  try {
8374
- const publicKey = await lastValueFrom(http.get('/api/pushnotification/publickey', { responseType: 'text' }));
8375
- const sub = await swPush.requestSubscription({ serverPublicKey: publicKey });
8376
- const registration = await navigator.serviceWorker.ready;
8377
- registration.active?.postMessage({ event: 'setVapidKey', publicKey });
8378
- await addSubscriptionToServer(sub);
8379
- await saveSubscription(sub);
8380
- isSubscribed.set(true);
8381
- permission.set(Notification.permission);
8382
- bannerVisible.set(false);
8383
- errorMessage.set(null);
8330
+ const publicKey = await lastValueFrom(this.http.get('/api/pushnotification/publickey', { responseType: 'text' }));
8331
+ await this.idb.set('settings', 'vapid-public-key', publicKey);
8332
+ const sub = await this.swPush.requestSubscription({ serverPublicKey: publicKey });
8333
+ await lastValueFrom(this.http.post('/api/pushnotification/add', sub, this.httpOptions()));
8334
+ await this.idb.set('subscription', 'push-subscription', sub.toJSON());
8335
+ this.update({
8336
+ isSubscribed: true,
8337
+ permission: Notification.permission,
8338
+ bannerVisible: false,
8339
+ errorMessage: null
8340
+ });
8384
8341
  return sub;
8385
8342
  }
8386
8343
  catch (err) {
8387
- console.error('Push subscribe error:', err);
8388
- errorMessage.set(err?.message || 'خطا در فعال‌سازی Push');
8344
+ this.update({ errorMessage: err.message ?? 'خطا در فعال‌سازی اعلان', bannerVisible: true });
8389
8345
  throw err;
8390
8346
  }
8391
- };
8392
- const unsubscribe = async () => {
8347
+ }
8348
+ async unsubscribe() {
8393
8349
  try {
8394
- const sub = await lastValueFrom(swPush.subscription);
8350
+ const sub = await lastValueFrom(this.swPush.subscription);
8395
8351
  if (!sub) {
8396
8352
  return;
8397
8353
  }
8398
- swPush.unsubscribe();
8399
- await deleteSubscriptionFromServer(sub);
8354
+ const json = sub.toJSON();
8355
+ await lastValueFrom(this.http.post('/api/pushnotification/delete', json, this.httpOptions()));
8400
8356
  await sub.unsubscribe();
8401
- await deleteSubscription();
8402
- isSubscribed.set(false);
8403
- errorMessage.set(null);
8357
+ await this.deleteSubscription();
8358
+ this.update({ isSubscribed: false, errorMessage: null });
8404
8359
  }
8405
8360
  catch (err) {
8406
- console.error('Push unsubscribe error:', err);
8407
- errorMessage.set(err?.message || 'خطا در لغو اشتراک');
8361
+ this.update({ errorMessage: err.message ?? 'خطا در لغو اشتراک' });
8408
8362
  }
8409
- };
8410
- return {
8411
- bannerVisible,
8412
- isSubscribed,
8413
- permission,
8414
- errorMessage,
8415
- initPushBanner,
8416
- subscribe,
8417
- unsubscribe,
8418
- handleNewSubscription,
8419
- hideBanner
8420
- };
8363
+ }
8364
+ async handleNewSubscription(subData) {
8365
+ const saved = await this.idb.get('subscription', 'push-subscription');
8366
+ if (!saved || saved.endpoint !== subData.endpoint) {
8367
+ if (saved) {
8368
+ await lastValueFrom(this.http.post('/api/pushnotification/delete', saved, this.httpOptions()));
8369
+ }
8370
+ await lastValueFrom(this.http.post('/api/pushnotification/add', subData, this.httpOptions()));
8371
+ await this.idb.set('subscription', 'push-subscription', subData);
8372
+ }
8373
+ this.update({
8374
+ isSubscribed: true,
8375
+ permission: Notification.permission,
8376
+ errorMessage: null
8377
+ });
8378
+ }
8379
+ update(values) {
8380
+ this._push.update((prev) => ({ ...prev, ...values }));
8381
+ }
8382
+ async loadSubscription() {
8383
+ return await this.idb.get('subscription', 'push-subscription');
8384
+ }
8385
+ async loadPublicKey() {
8386
+ return await this.idb.get('settings', 'vapid-public-key');
8387
+ }
8388
+ async initPushBanner() {
8389
+ let saved = await this.loadSubscription();
8390
+ const perm = Notification.permission;
8391
+ this.update({
8392
+ permission: perm
8393
+ });
8394
+ if (saved) {
8395
+ // اگر پرمیشن اکنون revoked یا default شد، subscription قبلی را حذف کن
8396
+ if (perm === 'default' || perm === 'denied') {
8397
+ console.log('Permission reset detected, removing old subscription');
8398
+ await this.deleteSubscription();
8399
+ saved = null;
8400
+ }
8401
+ }
8402
+ if (saved) {
8403
+ this.update({
8404
+ isSubscribed: true,
8405
+ bannerVisible: false
8406
+ });
8407
+ }
8408
+ else {
8409
+ this.update({
8410
+ isSubscribed: false,
8411
+ bannerVisible: perm !== 'denied' && 'PushManager' in window
8412
+ });
8413
+ }
8414
+ this.registerServiceWorkerMessageListener();
8415
+ const publicKey = await this.loadPublicKey();
8416
+ if (publicKey) {
8417
+ const reg = await navigator.serviceWorker.ready;
8418
+ reg.active?.postMessage({ event: 'setVapidKey', publicKey });
8419
+ }
8420
+ }
8421
+ async deleteSubscription() {
8422
+ await this.idb.delete('subscription', 'push-subscription');
8423
+ }
8424
+ httpOptions() {
8425
+ const token2 = this.local.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
8426
+ return { headers: new HttpHeaders({ 'Content-Type': 'application/json', sth: token2 }) };
8427
+ }
8428
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushNotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8429
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushNotificationService, providedIn: 'root' }); }
8421
8430
  }
8431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushNotificationService, decorators: [{
8432
+ type: Injectable,
8433
+ args: [{ providedIn: 'root' }]
8434
+ }] });
8422
8435
 
8423
8436
  class ServiceWorkerCommuncationService {
8424
8437
  constructor() {
@@ -8426,7 +8439,7 @@ class ServiceWorkerCommuncationService {
8426
8439
  this._localStorage = inject(LocalStorageService);
8427
8440
  this._portalService = inject(PortalService);
8428
8441
  this._pushCheckService = inject(PushCheckService);
8429
- this._usePushNotification = usePushNotification();
8442
+ this._pushNotificatioService = inject(PushNotificationService);
8430
8443
  }
8431
8444
  get token2() {
8432
8445
  return this._localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
@@ -8442,7 +8455,7 @@ class ServiceWorkerCommuncationService {
8442
8455
  this._serviceWorker = reg.active;
8443
8456
  navigator.serviceWorker.addEventListener('message', (event) => {
8444
8457
  if (event.data?.event === 'subscriptionChanged') {
8445
- this._usePushNotification.handleNewSubscription(event.data.subscription);
8458
+ this._pushNotificatioService.handleNewSubscription(event.data.subscription);
8446
8459
  }
8447
8460
  });
8448
8461
  }
@@ -8453,34 +8466,18 @@ class ServiceWorkerCommuncationService {
8453
8466
  });
8454
8467
  // automatic effect: update operationName based on subscription
8455
8468
  effect(() => {
8456
- const sub = this._usePushNotification.isSubscribed();
8469
+ const sub = this._pushNotificatioService.push().isSubscribed;
8457
8470
  // اینجا می‌تونی متغیر operationName یا UI رو اتوماتیک آپدیت کنی
8458
8471
  console.log('Push subscription changed:', sub);
8459
8472
  });
8460
8473
  // automatic effect: show toast on errors
8461
8474
  effect(() => {
8462
- const err = this._usePushNotification.errorMessage();
8475
+ const err = this._pushNotificatioService.push().errorMessage;
8463
8476
  if (err) {
8464
8477
  this.toast(err);
8465
8478
  }
8466
8479
  });
8467
8480
  }
8468
- // فعال‌سازی push توسط gesture (مثلاً از UI)
8469
- async subscribePush() {
8470
- try {
8471
- const check = await this._pushCheckService.checkPushReady();
8472
- if (check !== true) {
8473
- this.toast(check);
8474
- return;
8475
- }
8476
- await this._usePushNotification.subscribe();
8477
- this.toast('نوتیفیکیشن فعال شد');
8478
- }
8479
- catch (err) {
8480
- console.error(err);
8481
- this.toast('خطا در فعال‌سازی Push');
8482
- }
8483
- }
8484
8481
  _subscribe() {
8485
8482
  this._portalService.userLoggedIn$.pipe().subscribe((isLoggedIn) => this._isLoggedIn(isLoggedIn));
8486
8483
  this._portalService.documentVisibilitychange$
@@ -8497,7 +8494,7 @@ class ServiceWorkerCommuncationService {
8497
8494
  this._postServiceWorker({ event: 'isLoggedInChange', options: { isLoggedIn } });
8498
8495
  if (isLoggedIn) {
8499
8496
  this._setDefaultOptions();
8500
- this._usePushNotification.initPushBanner();
8497
+ this._pushNotificatioService.setup();
8501
8498
  }
8502
8499
  }
8503
8500
  _visibilitychange(documentIsHidden) {
@@ -8513,7 +8510,7 @@ class ServiceWorkerCommuncationService {
8513
8510
  }
8514
8511
  // لغو push (هر زمان امکان‌پذیر است)
8515
8512
  _handlePushUnSubscription(doReturn) {
8516
- this._usePushNotification.unsubscribe().finally(() => doReturn && doReturn());
8513
+ this._pushNotificatioService.unsubscribe().finally(() => doReturn && doReturn());
8517
8514
  }
8518
8515
  toast(msg) {
8519
8516
  if (!this._toastService) {
@@ -13213,49 +13210,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13213
13210
  args: [{ selector: 'bnrc-unlimit-session', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "", styles: [":host{background:#191919 -webkit-linear-gradient(top,#000 0%,#191919 100%) no-repeat;background:#191919 linear-gradient(to bottom,#000,#191919) no-repeat;text-align:center}:host h1,:host h2{font-weight:400}:host h1{margin:0 auto;padding:.15em;font-size:10em;text-shadow:0 2px 2px #000}:host h2{margin-bottom:2em}\n"] }]
13214
13211
  }] });
13215
13212
 
13216
- class PushBannerComponent {
13213
+ class PushBannerComponent extends BaseComponent {
13217
13214
  constructor() {
13218
- this.push = usePushNotification();
13215
+ super();
13216
+ this._pushService = inject(PushNotificationService);
13217
+ this.push = this._pushService.push;
13218
+ }
13219
+ get bannerPositionClass() {
13220
+ const userAgent = navigator.userAgent;
13221
+ const isMobile = /Android|iPhone|iPad|iPod/i.test(userAgent);
13222
+ if (!isMobile) {
13223
+ // دسکتاپ: بالا، راست/چپ
13224
+ return 'position-desktop';
13225
+ }
13226
+ const isAndroid = /Android/i.test(userAgent);
13227
+ const isIOS = /iPhone|iPad|iPod/i.test(userAgent);
13228
+ if (isAndroid) {
13229
+ // موبایل اندروید: بالا
13230
+ return 'position-android-top';
13231
+ }
13232
+ if (isIOS) {
13233
+ // موبایل iOS: پایین (برای جلوگیری از تداخل با نوار آدرس Safari/Chrome)
13234
+ return 'position-ios-bottom';
13235
+ }
13236
+ // پیش‌فرض برای هر موبایل دیگر
13237
+ return 'position-ios-bottom';
13238
+ }
13239
+ onHideBanner() {
13240
+ this._pushService.hideBanner();
13241
+ }
13242
+ onEnable() {
13243
+ this._pushService.subscribe();
13219
13244
  }
13220
13245
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13221
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: PushBannerComponent, isStandalone: false, selector: "bnrc-push-banner", ngImport: i0, template: `
13222
- @if(push.bannerVisible()){
13223
- <div class="push-banner">
13246
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: PushBannerComponent, isStandalone: false, selector: "bnrc-push-banner", usesInheritance: true, ngImport: i0, template: `
13247
+ @if(push().bannerVisible){
13248
+ <div class="push-banner" [ngClass]="bannerPositionClass">
13224
13249
  <div class="text">
13225
13250
  <b>فعال‌سازی اعلان‌ها</b>
13226
13251
  <p>برای دریافت پیام‌ها و رویدادهای مهم، اعلان‌ها را فعال کنید.</p>
13227
13252
  </div>
13228
13253
  <div class="actions">
13229
- <button class="btn enable" (click)="push.subscribe()">فعال‌سازی</button>
13230
- <button class="btn later" (click)="push.hideBanner()">بعداً</button>
13254
+ <button class="btn enable" (click)="onEnable()">فعال‌سازی</button>
13255
+ <button class="btn later" (click)="onHideBanner()">بعداً</button>
13231
13256
  </div>
13232
- @if(push.errorMessage()){
13233
- <p class="error">{{ push.errorMessage() }}</p>
13257
+ @if(push().errorMessage){
13258
+ <p class="error">{{ push().errorMessage }}</p>
13234
13259
  }
13235
13260
  </div>
13236
13261
  }
13237
- `, isInline: true, styles: [".push-banner{position:fixed;bottom:0;left:0;right:0;background:#fff;border-radius:12px 12px 0 0;box-shadow:0 -4px 16px #00000026;padding:16px;display:flex;flex-direction:column;gap:8px;z-index:9999}.actions{display:flex;gap:8px}.btn.enable{background:#25d366;color:#fff;border-radius:8px;padding:8px 12px;border:none}.btn.later{background:transparent;color:#666;border:none;padding:8px 12px}.error{color:red;font-size:13px}\n"] }); }
13262
+ `, isInline: true, styles: [".push-banner{position:fixed;left:0;right:0;font-family:var(--sapFontFamily);background:#fff;border-radius:12px 12px 0 0;box-shadow:0 -4px 16px #00000026;padding:16px;display:flex;flex-direction:column;gap:8px;z-index:9999}.actions{display:flex;gap:8px}.btn.enable{background:#25d366;color:#fff;border-radius:8px;padding:8px 12px;border:none}.btn.later{background:transparent;color:#666;border:none;padding:8px 12px}.error{color:red;font-size:13px}.position-ios-bottom{bottom:0;top:auto;border-radius:12px 12px 0 0}.position-android-top{top:0;bottom:auto;border-radius:0 0 12px 12px}.position-desktop{inset:20px 20px auto auto;width:320px;max-width:90%;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13238
13263
  }
13239
13264
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushBannerComponent, decorators: [{
13240
13265
  type: Component,
13241
- args: [{ selector: 'bnrc-push-banner', standalone: false, template: `
13242
- @if(push.bannerVisible()){
13243
- <div class="push-banner">
13266
+ args: [{ selector: 'bnrc-push-banner', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: `
13267
+ @if(push().bannerVisible){
13268
+ <div class="push-banner" [ngClass]="bannerPositionClass">
13244
13269
  <div class="text">
13245
13270
  <b>فعال‌سازی اعلان‌ها</b>
13246
13271
  <p>برای دریافت پیام‌ها و رویدادهای مهم، اعلان‌ها را فعال کنید.</p>
13247
13272
  </div>
13248
13273
  <div class="actions">
13249
- <button class="btn enable" (click)="push.subscribe()">فعال‌سازی</button>
13250
- <button class="btn later" (click)="push.hideBanner()">بعداً</button>
13274
+ <button class="btn enable" (click)="onEnable()">فعال‌سازی</button>
13275
+ <button class="btn later" (click)="onHideBanner()">بعداً</button>
13251
13276
  </div>
13252
- @if(push.errorMessage()){
13253
- <p class="error">{{ push.errorMessage() }}</p>
13277
+ @if(push().errorMessage){
13278
+ <p class="error">{{ push().errorMessage }}</p>
13254
13279
  }
13255
13280
  </div>
13256
13281
  }
13257
- `, styles: [".push-banner{position:fixed;bottom:0;left:0;right:0;background:#fff;border-radius:12px 12px 0 0;box-shadow:0 -4px 16px #00000026;padding:16px;display:flex;flex-direction:column;gap:8px;z-index:9999}.actions{display:flex;gap:8px}.btn.enable{background:#25d366;color:#fff;border-radius:8px;padding:8px 12px;border:none}.btn.later{background:transparent;color:#666;border:none;padding:8px 12px}.error{color:red;font-size:13px}\n"] }]
13258
- }] });
13282
+ `, styles: [".push-banner{position:fixed;left:0;right:0;font-family:var(--sapFontFamily);background:#fff;border-radius:12px 12px 0 0;box-shadow:0 -4px 16px #00000026;padding:16px;display:flex;flex-direction:column;gap:8px;z-index:9999}.actions{display:flex;gap:8px}.btn.enable{background:#25d366;color:#fff;border-radius:8px;padding:8px 12px;border:none}.btn.later{background:transparent;color:#666;border:none;padding:8px 12px}.error{color:red;font-size:13px}.position-ios-bottom{bottom:0;top:auto;border-radius:12px 12px 0 0}.position-android-top{top:0;bottom:auto;border-radius:0 0 12px 12px}.position-desktop{inset:20px 20px auto auto;width:320px;max-width:90%;border-radius:8px}\n"] }]
13283
+ }], ctorParameters: () => [] });
13259
13284
 
13260
13285
  class LoadExternalFilesDirective {
13261
13286
  constructor() {
@@ -17118,7 +17143,8 @@ const services = [
17118
17143
  BbbTranslatePipe,
17119
17144
  BarsaStorageService,
17120
17145
  ServiceWorkerCommuncationService,
17121
- ApplicationCtrlrService
17146
+ ApplicationCtrlrService,
17147
+ PushNotificationService
17122
17148
  ];
17123
17149
  const pipes = [
17124
17150
  NumeralPipe,
@@ -17571,5 +17597,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17571
17597
  * Generated bundle index. Do not edit.
17572
17598
  */
17573
17599
 
17574
- export { APP_VERSION, AbsoluteDivBodyDirective, AddDynamicFormStyles, AffixRespondEvents, AllFilesMimeType, AnchorScrollDirective, ApiService, ApplicationBaseComponent, ApplicationCtrlrService, AttrRtlDirective, AudioMimeType, AudioRecordingService, AuthGuard, BarsaApi, BarsaDialogService, BarsaIconDictPipe, BarsaNovinRayCoreModule, BarsaReadonlyDirective, BarsaSapUiFormPageModule, BarsaStorageService, BaseColumnPropsComponent, BaseComponent, BaseController, BaseDirective, BaseDynamicComponent, BaseFormToolbaritemPropsComponent, BaseItemContentPropsComponent, BaseModule, BaseReportModel, BaseUlvSettingComponent, BaseViewContentPropsComponent, BaseViewItemPropsComponent, BaseViewPropsComponent, BbbTranslatePipe, BodyClickDirective, BoolControlInfoModel, BreadcrumbService, ButtonLoadingComponent, CalculateControlInfoModel, CanUploadFilePipe, CardMediaSizePipe, ChangeLayoutInfoCustomUi, ChunkArrayPipe, CodeEditorControlInfoModel, ColSetting, ColumnCustomComponentPipe, ColumnCustomUiPipe, ColumnIconPipe, ColumnResizerDirective, ColumnService, ColumnValueDirective, ColumnValueOfParametersPipe, ColumnValuePipe, ComboRowImagePipe, CommandControlInfoModel, ContainerComponent, ContainerService, ContextMenuPipe, ControlUiPipe, ConvertToStylePipe, CopyDirective, CountDownDirective, CustomCommand, CustomInjector, CustomRouteReuseStategy, DIALOG_SERVICE, DateHijriService, DateMiladiService, DateRanges, DateService, DateShamsiService, DateTimeControlInfoModel, DeviceWidth, DialogParams, DynamicCommandDirective, DynamicComponentService, DynamicDarkColorPipe, DynamicFormComponent, DynamicFormToolbaritemComponent, DynamicItemComponent, DynamicLayoutComponent, DynamicRootVariableDirective, DynamicStyleDirective, DynamicTileGroupComponent, EllapsisTextDirective, EllipsifyDirective, EmptyPageComponent, EmptyPageWithRouterAndRouterOutletComponent, EnumControlInfoModel, ExecuteDynamicCommand, ExecuteWorkflowChoiceDef, FORM_DIALOG_COMPONENT, FieldBaseComponent, FieldDirective, FieldInfoTypeEnum, FieldUiComponent, FileControlInfoModel, FileInfoCountPipe, FilePictureInfoModel, FilesValidationHelper, FillAllLayoutControls, FillEmptySpaceDirective, FilterColumnsByDetailsPipe, FilterInlineActionListPipe, FilterPipe, FilterStringPipe, FilterTabPipe, FilterToolbarControlPipe, FilterWorkflowInMobilePipe, FindColumnByDbNamePipe, FindGroup, FindLayoutSettingFromLayout94, FindPreviewColumnPipe, FindToolbarItem, FioriIconPipe, FormBaseComponent, FormCloseDirective, FormComponent, FormFieldReportPageComponent, FormNewComponent, FormPageBaseComponent, FormPageComponent, FormPanelService, FormPropsBaseComponent, FormService, FormToolbarBaseComponent, GaugeControlInfoModel, GeneralControlInfoModel, GetAllColumnsSorted, GetAllHorizontalFromLayout94, GetDefaultMoObjectInfo, GetImgTags, GetVisibleValue, GridSetting, GroupBy, GroupByPipe, GroupByService, HeaderFacetValuePipe, HideAcceptCancelButtonsPipe, HideColumnsInmobilePipe, HistoryControlInfoModel, HorizontalLayoutService, HorizontalResponsiveDirective, IconControlInfoModel, ImageLazyDirective, ImageMimeType, ImagetoPrint, InMemoryStorageService, IndexedDbService, InputNumber, IntersectionObserverDirective, IntersectionStatus, IsDarkMode, IsExpandedNodePipe, IsImagePipe, ItemsRendererDirective, LabelStarTrimPipe, LabelmandatoryDirective, LayoutItemBaseComponent, LayoutMainContentService, LayoutPanelBaseComponent, LayoutService, LeafletLongPressDirective, LinearListControlInfoModel, LinearListHelper, ListCountPipe, ListRelationModel, LoadExternalFilesDirective, LocalStorageService, LogService, LoginSettingsResolver, MapToChatMessagePipe, MasterDetailsPageComponent, MeasureFormTitleWidthDirective, MergeFieldsToColumnsPipe, MetaobjectDataModel, MetaobjectRelationModel, MoForReportModel, MoForReportModelBase, MoInfoUlvMoListPipe, MoInfoUlvPagingPipe, MoReportValueConcatPipe, MoReportValuePipe, MoValuePipe, MobileDirective, ModalRootComponent, MultipleGroupByPipe, NOTIFICATAION_POPUP_SERVER, NOTIFICATION_WEBWORKER_FACTORY, NetworkStatusService, NotFoundComponent, NotificationService, NowraptextDirective, NumberBaseComponent, NumberControlInfoModel, NumbersOnlyInputDirective, NumeralPipe, OverflowTextDirective, PageBaseComponent, PageWithFormHandlerBaseComponent, PdfMimeType, PictureFieldSourcePipe, PictureFileControlInfoModel, PlaceHolderDirective, PortalDynamicPageResolver, PortalFormPageResolver, PortalPageComponent, PortalPageResolver, PortalPageSidebarComponent, PortalReportPageResolver, PortalService, PreventDefaulEvent, PreventDefaultDirective, PrintFilesDirective, PrintImage, PromptUpdateService, PushBannerComponent, PushCheckService, RabetehAkseTakiListiControlInfoModel, RedirectHomeGuard, RedirectReportNavigatorCommandComponent, RelatedReportControlInfoModel, RelationListControlInfoModel, RemoveDynamicFormStyles, RemoveNewlinePipe, RenderUlvDirective, RenderUlvPaginDirective, RenderUlvViewerDirective, ReplacePipe, ReportBaseComponent, ReportBaseInfo, ReportCalendarModel, ReportContainerComponent, ReportExtraInfo, ReportField, ReportFormModel, ReportItemBaseComponent, ReportListModel, ReportModel, ReportTreeModel, ReportViewBaseComponent, ReportViewColumn, ResizableComponent, ResizableDirective, ResizableModule, ResizeHandlerDirective, ResizeObserverDirective, ReversePipe, RichStringControlInfoModel, RootPageComponent, RootPortalComponent, RouteFormChangeDirective, RoutingService, RowDataOption, RowNumberPipe, SafeBottomDirective, SanitizeTextPipe, SaveImageDirective, SaveImageToFile, SaveScrollPositionService, ScrollPersistDirective, ScrollToSelectedDirective, SelectionMode, SeperatorFixPipe, ServiceWorkerCommuncationService, ServiceWorkerNotificationService, ShellbarHeightService, ShortcutHandlerDirective, ShortcutRegisterDirective, SimplebarDirective, SingleRelationControlInfoModel, SortDirection, SortPipe, SortSetting, SplideSliderDirective, SplitPipe, StopPropagationDirective, StringControlInfoModel, StringToNumberPipe, SubformControlInfoModel, SystemBaseComponent, TOAST_SERVICE, TableHeaderWidthMode, TableResizerDirective, TabpageService, ThImageOrIconePipe, TileGroupBreadcrumResolver, TilePropsComponent, TlbButtonsPipe, ToolbarSettingsPipe, TooltipDirective, TotalSummaryPipe, UiService, UlvCommandDirective, UlvMainService, UnlimitSessionComponent, UntilInViewDirective, UploadService, VideoMimeType, VideoRecordingService, ViewBase, VisibleValuePipe, WebOtpDirective, WordMimeType, WorfkflowwChoiceCommandDirective, addCssVariableToRoot, availablePrefixes, calcContextMenuWidth, calculateColumnContent, calculateColumnWidth, calculateColumnWidthFitToContainer, calculateFreeColumnSize, calculateMoDataListContentWidthByColumnName, cancelRequestAnimationFrame, createFormPanelMetaConditions, createGridEditorFormPanel, easeInOutCubic, elementInViewport2, enumValueToStringSize, executeUlvCommandHandler, flattenTree, forbiddenValidator, formRoutes, formatBytes, fromEntries, fromIntersectionObserver, genrateInlineMoId, getAllItemsPerChildren, getColumnValueOfMoDataList, getComponentDefined, getControlList, getControlSizeMode, getDateService, getDeviceIsDesktop, getDeviceIsMobile, getDeviceIsPhone, getDeviceIsTablet, getFieldValue, getFocusableTagNames, getFormSettings, getGridSettings, getHeaderValue, getIcon, getImagePath, getLabelWidth, getLayout94ObjectInfo, getLayoutControl, getNewMoGridEditor, getParentHeight, getRequestAnimationFrame, getResetGridSettings, getTargetRect, getUniqueId, getValidExtension, isFF, isFirefox, isFunction, isImage, isInLocalMode, isSafari, isTargetWindow, measureText, measureText2, measureTextBy, mobile_regex, nullOrUndefinedString, number_only, requestAnimationFramePolyfill, setColumnWidthByMaxMoContentWidth, setOneDepthLevel, setTableThWidth, shallowEqual, stopPropagation, throwIfAlreadyLoaded, toNumber, usePushNotification, validateAllFormFields };
17600
+ export { APP_VERSION, AbsoluteDivBodyDirective, AddDynamicFormStyles, AffixRespondEvents, AllFilesMimeType, AnchorScrollDirective, ApiService, ApplicationBaseComponent, ApplicationCtrlrService, AttrRtlDirective, AudioMimeType, AudioRecordingService, AuthGuard, BarsaApi, BarsaDialogService, BarsaIconDictPipe, BarsaNovinRayCoreModule, BarsaReadonlyDirective, BarsaSapUiFormPageModule, BarsaStorageService, BaseColumnPropsComponent, BaseComponent, BaseController, BaseDirective, BaseDynamicComponent, BaseFormToolbaritemPropsComponent, BaseItemContentPropsComponent, BaseModule, BaseReportModel, BaseUlvSettingComponent, BaseViewContentPropsComponent, BaseViewItemPropsComponent, BaseViewPropsComponent, BbbTranslatePipe, BodyClickDirective, BoolControlInfoModel, BreadcrumbService, ButtonLoadingComponent, CalculateControlInfoModel, CanUploadFilePipe, CardMediaSizePipe, ChangeLayoutInfoCustomUi, ChunkArrayPipe, CodeEditorControlInfoModel, ColSetting, ColumnCustomComponentPipe, ColumnCustomUiPipe, ColumnIconPipe, ColumnResizerDirective, ColumnService, ColumnValueDirective, ColumnValueOfParametersPipe, ColumnValuePipe, ComboRowImagePipe, CommandControlInfoModel, ContainerComponent, ContainerService, ContextMenuPipe, ControlUiPipe, ConvertToStylePipe, CopyDirective, CountDownDirective, CustomCommand, CustomInjector, CustomRouteReuseStategy, DIALOG_SERVICE, DateHijriService, DateMiladiService, DateRanges, DateService, DateShamsiService, DateTimeControlInfoModel, DeviceWidth, DialogParams, DynamicCommandDirective, DynamicComponentService, DynamicDarkColorPipe, DynamicFormComponent, DynamicFormToolbaritemComponent, DynamicItemComponent, DynamicLayoutComponent, DynamicRootVariableDirective, DynamicStyleDirective, DynamicTileGroupComponent, EllapsisTextDirective, EllipsifyDirective, EmptyPageComponent, EmptyPageWithRouterAndRouterOutletComponent, EnumControlInfoModel, ExecuteDynamicCommand, ExecuteWorkflowChoiceDef, FORM_DIALOG_COMPONENT, FieldBaseComponent, FieldDirective, FieldInfoTypeEnum, FieldUiComponent, FileControlInfoModel, FileInfoCountPipe, FilePictureInfoModel, FilesValidationHelper, FillAllLayoutControls, FillEmptySpaceDirective, FilterColumnsByDetailsPipe, FilterInlineActionListPipe, FilterPipe, FilterStringPipe, FilterTabPipe, FilterToolbarControlPipe, FilterWorkflowInMobilePipe, FindColumnByDbNamePipe, FindGroup, FindLayoutSettingFromLayout94, FindPreviewColumnPipe, FindToolbarItem, FioriIconPipe, FormBaseComponent, FormCloseDirective, FormComponent, FormFieldReportPageComponent, FormNewComponent, FormPageBaseComponent, FormPageComponent, FormPanelService, FormPropsBaseComponent, FormService, FormToolbarBaseComponent, GaugeControlInfoModel, GeneralControlInfoModel, GetAllColumnsSorted, GetAllHorizontalFromLayout94, GetDefaultMoObjectInfo, GetImgTags, GetVisibleValue, GridSetting, GroupBy, GroupByPipe, GroupByService, HeaderFacetValuePipe, HideAcceptCancelButtonsPipe, HideColumnsInmobilePipe, HistoryControlInfoModel, HorizontalLayoutService, HorizontalResponsiveDirective, IconControlInfoModel, IdbService, ImageLazyDirective, ImageMimeType, ImagetoPrint, InMemoryStorageService, IndexedDbService, InputNumber, IntersectionObserverDirective, IntersectionStatus, IsDarkMode, IsExpandedNodePipe, IsImagePipe, ItemsRendererDirective, LabelStarTrimPipe, LabelmandatoryDirective, LayoutItemBaseComponent, LayoutMainContentService, LayoutPanelBaseComponent, LayoutService, LeafletLongPressDirective, LinearListControlInfoModel, LinearListHelper, ListCountPipe, ListRelationModel, LoadExternalFilesDirective, LocalStorageService, LogService, LoginSettingsResolver, MapToChatMessagePipe, MasterDetailsPageComponent, MeasureFormTitleWidthDirective, MergeFieldsToColumnsPipe, MetaobjectDataModel, MetaobjectRelationModel, MoForReportModel, MoForReportModelBase, MoInfoUlvMoListPipe, MoInfoUlvPagingPipe, MoReportValueConcatPipe, MoReportValuePipe, MoValuePipe, MobileDirective, ModalRootComponent, MultipleGroupByPipe, NOTIFICATAION_POPUP_SERVER, NOTIFICATION_WEBWORKER_FACTORY, NetworkStatusService, NotFoundComponent, NotificationService, NowraptextDirective, NumberBaseComponent, NumberControlInfoModel, NumbersOnlyInputDirective, NumeralPipe, OverflowTextDirective, PageBaseComponent, PageWithFormHandlerBaseComponent, PdfMimeType, PictureFieldSourcePipe, PictureFileControlInfoModel, PlaceHolderDirective, PortalDynamicPageResolver, PortalFormPageResolver, PortalPageComponent, PortalPageResolver, PortalPageSidebarComponent, PortalReportPageResolver, PortalService, PreventDefaulEvent, PreventDefaultDirective, PrintFilesDirective, PrintImage, PromptUpdateService, PushBannerComponent, PushCheckService, PushNotificationService, RabetehAkseTakiListiControlInfoModel, RedirectHomeGuard, RedirectReportNavigatorCommandComponent, RelatedReportControlInfoModel, RelationListControlInfoModel, RemoveDynamicFormStyles, RemoveNewlinePipe, RenderUlvDirective, RenderUlvPaginDirective, RenderUlvViewerDirective, ReplacePipe, ReportBaseComponent, ReportBaseInfo, ReportCalendarModel, ReportContainerComponent, ReportExtraInfo, ReportField, ReportFormModel, ReportItemBaseComponent, ReportListModel, ReportModel, ReportTreeModel, ReportViewBaseComponent, ReportViewColumn, ResizableComponent, ResizableDirective, ResizableModule, ResizeHandlerDirective, ResizeObserverDirective, ReversePipe, RichStringControlInfoModel, RootPageComponent, RootPortalComponent, RouteFormChangeDirective, RoutingService, RowDataOption, RowNumberPipe, SafeBottomDirective, SanitizeTextPipe, SaveImageDirective, SaveImageToFile, SaveScrollPositionService, ScrollPersistDirective, ScrollToSelectedDirective, SelectionMode, SeperatorFixPipe, ServiceWorkerCommuncationService, ServiceWorkerNotificationService, ShellbarHeightService, ShortcutHandlerDirective, ShortcutRegisterDirective, SimplebarDirective, SingleRelationControlInfoModel, SortDirection, SortPipe, SortSetting, SplideSliderDirective, SplitPipe, StopPropagationDirective, StringControlInfoModel, StringToNumberPipe, SubformControlInfoModel, SystemBaseComponent, TOAST_SERVICE, TableHeaderWidthMode, TableResizerDirective, TabpageService, ThImageOrIconePipe, TileGroupBreadcrumResolver, TilePropsComponent, TlbButtonsPipe, ToolbarSettingsPipe, TooltipDirective, TotalSummaryPipe, UiService, UlvCommandDirective, UlvMainService, UnlimitSessionComponent, UntilInViewDirective, UploadService, VideoMimeType, VideoRecordingService, ViewBase, VisibleValuePipe, WebOtpDirective, WordMimeType, WorfkflowwChoiceCommandDirective, addCssVariableToRoot, availablePrefixes, calcContextMenuWidth, calculateColumnContent, calculateColumnWidth, calculateColumnWidthFitToContainer, calculateFreeColumnSize, calculateMoDataListContentWidthByColumnName, cancelRequestAnimationFrame, createFormPanelMetaConditions, createGridEditorFormPanel, easeInOutCubic, elementInViewport2, enumValueToStringSize, executeUlvCommandHandler, flattenTree, forbiddenValidator, formRoutes, formatBytes, fromEntries, fromIntersectionObserver, genrateInlineMoId, getAllItemsPerChildren, getColumnValueOfMoDataList, getComponentDefined, getControlList, getControlSizeMode, getDateService, getDeviceIsDesktop, getDeviceIsMobile, getDeviceIsPhone, getDeviceIsTablet, getFieldValue, getFocusableTagNames, getFormSettings, getGridSettings, getHeaderValue, getIcon, getImagePath, getLabelWidth, getLayout94ObjectInfo, getLayoutControl, getNewMoGridEditor, getParentHeight, getRequestAnimationFrame, getResetGridSettings, getTargetRect, getUniqueId, getValidExtension, isFF, isFirefox, isFunction, isImage, isInLocalMode, isSafari, isTargetWindow, measureText, measureText2, measureTextBy, mobile_regex, nullOrUndefinedString, number_only, requestAnimationFramePolyfill, setColumnWidthByMaxMoContentWidth, setOneDepthLevel, setTableThWidth, shallowEqual, stopPropagation, throwIfAlreadyLoaded, toNumber, validateAllFormFields };
17575
17601
  //# sourceMappingURL=barsa-novin-ray-core.mjs.map